分类: C/C++
2008-04-23 21:54:07
C /VC 编程的疑难问题及解答(二)
作者:
我“C /VC 编程的疑难问题及解答”给出了三个关于C /VC 编程的问题及其可能的解决方法。这篇文章再给出几个问题,大家多给我提意见啊,有问题可以给我发信啊!
标准程序库问题,
上篇文章中的"list的迭代器是否可以随机移动?"问题的回顾:
由于list的内部实现是双向链表,链表就要求迭代器(指针)只能依次从前向后(或从后向前)移动,依次移动一个位置,因此list只定义了 和--操作符,而没有定义 、-、 =和-=等操作符。所以要想list的迭代器移动一段距离,就需要自己编程实现,用一个小循环就行了,代码如下:
#include上面对STL中的list的指针随机移动问题的解释不是很好,感谢周星星的提醒,我们可以用STL的advance操作,我给出的代码的是advance针对list的一个可能的实现方法。这里我建议使用advance操作代替我的那段代码。using namespace std; list
myList; … // myList的初始化及其他操作 list ::const_iterator itList = myList.begin(); // itList向前移动len个距离 for ( int i= 0; i < len; i ) { itList; } ... // 其他操作
vector标准程序库问题,myVec; myVec.reserve( 100 ); //新元素还没有构造 for (int i = 0; i < 100; i ) { myVec.push_back( i ); //新元素这时才构造 } myVec.resize( 102 ); // 用元素的默认构造函数构造了两个新的元素 myVec[100] = 1; //直接操作新元素 myVec[101] = 2; …
struct ForwardProb { string m_SS; string m_dictItem; int m_index; float m_forwardProb; ForwardProb *preFP; }; vector在这段代码中,由于每次thisFP都是新加入myVec中的,这样可能需要重新分配内存,即myVec在内存中的位置就可能发生了变化,那么每个元素中的指针preFP就可能变得无效了。myVec; for ( int i = 0; i < count; i ) { ForwardProb thisFP; … thisFP->preFP = some previous pointer in myVec; myVec.push_back( thisFP ); } …
extern "C" __declspec(dllexport) return_type interfaceFunctionName( parameter… );
另外,动态链接库编译之后生成一个动态链接库文件(dll)和一个.lib文件。提交时需要提交这两个文件和对应的接口的头文件。
用户使用动态链接库时,也需要在项目属性中的"链接器/输入"选择对应的.lib文件,那么程序会自动调用.dll文件的。用户不需要包含上面提交的头文件,用户只需要按照规定的形式声明接口函数即可,形式如下:
extern "C" __declspec(dllimport) return_type interfaceFunctionName( parameter… );
这样,用户就可以在自己的应用程序中调用动态链接库中定义的接口函数了。
动态链接库中不能有屏幕输出语句,如cout << …等,因此调试时不太方便,这里没有研究动态链接库的调试方法。
静态链接库和动态链接库的一个很大的区别还有,在静态链接库中不能在包含其他的动态链接库或者静态库;而在动态链接库中还可以再包含其他的动态/静态链接库。