最近在看primer 4th上的容器一章,C++用了很久,但是STL一直没怎么碰过,大部分做的东西都是在windows平台下,调调API,也没用到那些东西。想到去年去趋势面试实习生的时候,面试官问我STL里面的问题,真是一问三不知啊,丢脸到家了。。。所以最近决定看下,顺便学习下,为9月份的找工作积累的经验吧。

于是做题,9.19,原题如下:

假设IV是个int型的vector容器,下列程序存在什么错误?如何改正之

vector<int>::iterator mid = iv.begin() + iv.size()/2 ;

while(vector<int>::iterator iter != mid)

      if(iter == some_val)

            iv.insert(iter,2*some_val)

这个问题里面的错误太多了,我就直接把我自己的修改代码贴上来了

 

#include <iostream>
#include <vector>
#include <list>
#include <deque>

using namespace std ;

int main()
{
 int a[] = {1,2,5,3,4,9,1,4,7} ;
 vector<int> iv(a,a+9) ;
 vector<int>::iterator mid = iv.begin()+iv.size()/2 ;
 vector<int>::iterator iter = iv.begin() ;
 vector<int>::iterator iresult ;//用来存储返回的iter
 while (iter !=mid)
 {
  if (*iter == 5)
  {
   iresult = iv.insert(iter,2*5) ;//这里是错误之源,insert之后,原来的iter指向的内存就已经失效了,只能只用新的

 break ;
  }
  ++iter ;
 }
 for (int i = 0 ;i<iv.size();++i)
 {
  cout<<iv[i]<<endl ;
 }
 return 0 ;
}

 分析下,该题的问题主要有如下:

1.iter没初始化,而且我发现在while里面iter是不能初始化的,回想起以前学的语法,貌似只有在for里面才能初始化一个值

2.insert返回的迭代器地址只能赋给一个新的iter,我尝试改成iter= iv.insert(iter,2*5),然后去掉break,到++iter的时候报vector iterator incompatible,也不知道为什么。

3.insert返回之后,iter就失效了,我昨天跟了20分钟都没发现为什么。后来查看了内存才知道。。。。

PS:STL也太烦了,如果你跟一边就会发现,一个简单的容器内存分配都要走N个步骤,简直太BT了。。。

 重新修改了一下,能够在vector里面1之前插入2*5;

 

#include <iostream>
#include <vector>
#include <list>
#include <deque>

using namespace std ;

int main()
{
 int a[] = {1,2,5,3,4,9,1,4,7} ;
 vector<int> iv(a,a+9) ;
 vector<int>::iterator mid = iv.begin()+iv.size()/2 ;
 vector<int>::iterator iter = iv.begin() ;
 vector<int>::iterator iresult ;//用来存储返回的iter
 while (iter !=iv.end())
 {
  if (*iter == 1)
  {
   iter = iv.insert(iter,2*5) ;//修改了这里

   ++iter ;//要加1,因为返回的iter指向原来的iter前面一个。
  }
  ++iter ;
 }
 for (int i = 0 ;i<iv.size();++i)
 {
  cout<<iv[i]<<endl ;
 }
 return 0 ;
}

posted on 2009-04-27 09:35  露一小脸  阅读(396)  评论(0编辑  收藏  举报