vector 问题代码很简单
<code>
#include<iostream>
#include<vector>
using namespace std;
int main(){
string line;
getline(cin,line);
vector<char> vec;
for(int i=0;i!=line.size();i++){
vec.push_back(line[i]);
}
for(vector<char>::iterator iter=vec.begin();iter!=vec.end();iter++){
while(*(iter-1)=='('&&*(iter+1)==')'){
vec.erase(iter+1);
vec.erase(iter-1);
iter--;
}
}
for(vector<char>::iterator iter=vec.begin();iter!=vec.end();iter++){
cout<<*iter;
}
cout<<endl;
system("pause");
return 0;
}
</code>
目的是为了把(((A)))这类没用的括号去掉,上面的代码可以实现
我不理解第二个for循环 第一次循环 iter=vec.begin() 访问*(iter-1)为什么不越界?
我开始为了避免越界时候写的是for(vector<char>::iter=vec.begin()+1;iter!=vec.end()-1;iter++)却好像越界了
求牛人解决下 新手求照顾
[解决办法]
理论会是越界的,但是你只是读取那块内存的值,莫非这样就不会挂?
[解决办法]
1.
for(vector<char>::iterator iter=vec.begin();iter!=vec.end();iter++)
...
这样写虽然越界访问了,但是由于程序比较的是(,),所以基本上即使越界了,程序也能正确运行。程序只能是貌似正确。
2.
for(vector<char>::iterator iter=vec.begin()+1;iter!=vec.end()-1;iter++)
...
这样写就不行,当删除所有( )时候,最后只剩下A,你的iter指向iter,之后iter++,就是为vec.end(),这样进行
for循环条件检查的时候iter!=vec.end()-1,肯定是不相等的,所以就无限循环了
3.
关于vector的erase()的问题
标准中规定,vector在执行erase(pos)之后,pos之后的iterator引用无效。而有的编译器的iterator的实现成一个指针,指向连续存数组的某个位置,在删除元素之后,
没有重新分配连续存储空间情况下,"阴差阳错",iter失效之后,iter--,这么写也正好对的。
这样写比较好:
把
for(vector<char>::iterator iter=vec.begin();iter!=vec.end();iter++){while(*(iter-1)=='('&&*(iter+1)==')'){vec.erase(iter+1);vec.erase(iter-1);iter--;}