最近在看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 ;
}