C++/VC++編程的疑難問(wèn)題及解答(二)
作者:M. H. Li
我“C++/VC++編程的疑難問(wèn)題及解答”給出了三個(gè)關(guān)于C++/VC++編程的問(wèn)題及其可能的解決方法。這篇文章再給出幾個(gè)問(wèn)題,大家多給我提意見(jiàn)啊,有問(wèn)題可以給我發(fā)信??!
標準程序庫問(wèn)題,再談list的迭代器是否可以隨機移動(dòng)?
上篇文章中的"list的迭代器是否可以隨機移動(dòng)?"問(wèn)題的回顧:
由于list的內部實(shí)現是雙向鏈表,鏈表就要求迭代器(指針)只能依次從前向后(或從后向前)移動(dòng),依次移動(dòng)一個(gè)位置,因此list只定義了++和--操作符,而沒(méi)有定義+、-、+=和-=等操作符。所以要想list的迭代器移動(dòng)一段距離,就需要自己編程實(shí)現,用一個(gè)小循環(huán)就行了,代碼如下:
#include <list>using namespace std;list<int> myList;… // myList的初始化及其他操作list<int>::const_iterator itList = myList.begin();// itList向前移動(dòng)len個(gè)距離for ( int i= 0; i < len; i++ ){ ++itList;}... // 其他操作 上面對STL中的list的指針隨機移動(dòng)問(wèn)題的解釋不是很好,感謝周星星的提醒,我們可以用STL的advance操作,我給出的代碼的是advance針對list的一個(gè)可能的實(shí)現方法。這里我建議使用advance操作代替我的那段代碼。vector<int> myVec;myVec.reserve( 100 ); //新元素還沒(méi)有構造for (int i = 0; i < 100; i++ ){ myVec.push_back( i ); //新元素這時(shí)才構造}myVec.resize( 102 ); // 用元素的默認構造函數構造了兩個(gè)新的元素myVec[100] = 1; //直接操作新元素myVec[101] = 2;… 標準程序庫問(wèn)題,vector的內存重分配問(wèn)題struct ForwardProb{ string m_SS; string m_dictItem; int m_index; float m_forwardProb; ForwardProb *preFP;};vector<ForwardProb> myVec;for ( int i = 0; i < count; i++ ){ ForwardProb thisFP; … thisFP->preFP = some previous pointer in myVec; myVec.push_back( thisFP );}… 在這段代碼中,由于每次thisFP都是新加入myVec中的,這樣可能需要重新分配內存,即myVec在內存中的位置就可能發(fā)生了變化,那么每個(gè)元素中的指針preFP就可能變得無(wú)效了。
extern "C" __declspec(dllexport) return_type interfaceFunctionName( parameter… );
另外,動(dòng)態(tài)鏈接庫編譯之后生成一個(gè)動(dòng)態(tài)鏈接庫文件(dll)和一個(gè).lib文件。提交時(shí)需要提交這兩個(gè)文件和對應的接口的頭文件。
用戶(hù)使用動(dòng)態(tài)鏈接庫時(shí),也需要在項目屬性中的"鏈接器/輸入"選擇對應的.lib文件,那么程序會(huì )自動(dòng)調用.dll文件的。用戶(hù)不需要包含上面提交的頭文件,用戶(hù)只需要按照規定的形式聲明接口函數即可,形式如下:
extern "C" __declspec(dllimport) return_type interfaceFunctionName( parameter… );
這樣,用戶(hù)就可以在自己的應用程序中調用動(dòng)態(tài)鏈接庫中定義的接口函數了。
動(dòng)態(tài)鏈接庫中不能有屏幕輸出語(yǔ)句,如cout << …等,因此調試時(shí)不太方便,這里沒(méi)有研究動(dòng)態(tài)鏈接庫的調試方法。
靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫的一個(gè)很大的區別還有,在靜態(tài)鏈接庫中不能在包含其他的動(dòng)態(tài)鏈接庫或者靜態(tài)庫;而在動(dòng)態(tài)鏈接庫中還可以再包含其他的動(dòng)態(tài)/靜態(tài)鏈接庫。
聯(lián)系客服