Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16498049
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:57:57

下载本文示例代码
  本人在用C /VC 编程时,遇到的一些比较难以解决的问题,在经过百思得其解之后,总结了一些解决方法,希望这些经验之谈能对大家有所帮助。   VC问题,编辑框内的换行;   C 问题标准程序库的问题,list的迭代器是否可以随机移动?   C 问题标准程序库的问题,在删除操作很多的情况下,应该选择什么样的容器?   1、[VC问题] 编辑框内的换行?   答:假设要在编辑框内输出"12345\n6789"。首先要设置编辑框的Multiline属性为TRUE,在输出时,除了要加\n,还要有\r。也就是说,如果要12345和6789在两行显示,需要输出12345\r\n6789。代码如下: m_strData = "12345\n67890"; // m_strData是和编辑框关联的变量 UpdateData(FALSE); //更新控件   2、[C 标准程序库的问题] list的迭代器是否可以随机移动?   答:由于list的内部实现是双向链表,链表就要求迭代器(指针)只能依次从前向后(或从后向前)移动,依次移动一个位置,因此list只定义了 和--操作符,而没有定义 、-、 =和-=等操作符。所以要想list的迭代器移动一段距离,就需要自己编程实现,用一个小循环就行了,代码如下: #include using namespace std; list myList; … // myList的初始化及其他操作 list::const_iterator itList = myList.begin(); // itList向前移动len个距离 for ( int i= 0; i < len; i ) {   itList; } … // 其他操作   3、[C 标准程序库的问题] 在删除操作很多的情况下,应该选择什么样的容器?   答:按照标准程序库的说明,当删除/插入只发生在容器的尾部时,应该使用vector;当删除/插入只发生在容器的首/尾部时,应该使用deque;当删除/插入操作很多,而且删除/插入不是只在容器的首尾,这时应该选择list。   但是这里也有一个问题,在使用list时,由于其迭代器只能一次移动一个位置,在有大量删除的操作时,需要大量的迭代器移动操作,因此使用list的效率会很低;list的另一个缺点是,占用空间要比同等容量大小的vector要大,这是由于list的实现需要指针,每个元素就多比vector中的元素多两个指针(双向链表),因此在每个元素都很小(几个字节),而且元素数量很大时,使用list就非常浪费空间了。   如果使用vector,那么删除中间元素会导致大量的元素移动操作,效率也不高,为了解决这个问题,我们可以这样作:使用vector容器,但是不直接删除元素,而是再申请一个临时vector,将原来vector中未删除的有用元素依次加入/保存到临时vector,然后用这个临时vector替换原来的vector,如果实现知道要删除的元素的个数,那么可以事先预留临时vector的空间,再将有用元素存到临时vector中,代码如下: #include using namespace std; vector myVec; … // myVec的初始化以及其它操作 vector tempVec; // 删除myVec中的num个元素 tempVec.reserve( myVec.size() - num ); // 预留临时vector的空间 for ( ;; ) {  将myVec中的有用元素存到tempVec中; } myVec.swap( tempVec ); // myVec的容量等于或稍大于myVec.size() … // 其它操作   这只是我目前总结的几个问题,以后遇到问题随时解决,随时总结。 zmbbs=1;   本人在用C /VC 编程时,遇到的一些比较难以解决的问题,在经过百思得其解之后,总结了一些解决方法,希望这些经验之谈能对大家有所帮助。   VC问题,编辑框内的换行;   C 问题标准程序库的问题,list的迭代器是否可以随机移动?   C 问题标准程序库的问题,在删除操作很多的情况下,应该选择什么样的容器?   1、[VC问题] 编辑框内的换行?   答:假设要在编辑框内输出"12345\n6789"。首先要设置编辑框的Multiline属性为TRUE,在输出时,除了要加\n,还要有\r。也就是说,如果要12345和6789在两行显示,需要输出12345\r\n6789。代码如下: m_strData = "12345\n67890"; // m_strData是和编辑框关联的变量 UpdateData(FALSE); //更新控件   2、[C 标准程序库的问题] list的迭代器是否可以随机移动?   答:由于list的内部实现是双向链表,链表就要求迭代器(指针)只能依次从前向后(或从后向前)移动,依次移动一个位置,因此list只定义了 和--操作符,而没有定义 、-、 =和-=等操作符。所以要想list的迭代器移动一段距离,就需要自己编程实现,用一个小循环就行了,代码如下: #include using namespace std; list myList; … // myList的初始化及其他操作 list::const_iterator itList = myList.begin(); // itList向前移动len个距离 for ( int i= 0; i < len; i ) {   itList; } … // 其他操作   3、[C 标准程序库的问题] 在删除操作很多的情况下,应该选择什么样的容器?   答:按照标准程序库的说明,当删除/插入只发生在容器的尾部时,应该使用vector;当删除/插入只发生在容器的首/尾部时,应该使用deque;当删除/插入操作很多,而且删除/插入不是只在容器的首尾,这时应该选择list。   但是这里也有一个问题,在使用list时,由于其迭代器只能一次移动一个位置,在有大量删除的操作时,需要大量的迭代器移动操作,因此使用list的效率会很低;list的另一个缺点是,占用空间要比同等容量大小的vector要大,这是由于list的实现需要指针,每个元素就多比vector中的元素多两个指针(双向链表),因此在每个元素都很小(几个字节),而且元素数量很大时,使用list就非常浪费空间了。   如果使用vector,那么删除中间元素会导致大量的元素移动操作,效率也不高,为了解决这个问题,我们可以这样作:使用vector容器,但是不直接删除元素,而是再申请一个临时vector,将原来vector中未删除的有用元素依次加入/保存到临时vector,然后用这个临时vector替换原来的vector,如果实现知道要删除的元素的个数,那么可以事先预留临时vector的空间,再将有用元素存到临时vector中,代码如下: #include using namespace std; vector myVec; … // myVec的初始化以及其它操作 vector tempVec; // 删除myVec中的num个元素 tempVec.reserve( myVec.size() - num ); // 预留临时vector的空间 for ( ;; ) {  将myVec中的有用元素存到tempVec中; } myVec.swap( tempVec ); // myVec的容量等于或稍大于myVec.size() … // 其它操作   这只是我目前总结的几个问题,以后遇到问题随时解决,随时总结。 zmbbs=1; 下载本文示例代码


C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答C /VC 编程中的疑难问题及解答
阅读(93) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~