容器的一个用法,错在哪呢?
- C/C++ code
int iArr[] = {0, 1, 2, 3, 4, 5, 6, 7};vector<int> iVec(iArr, iArr+8);for (vector<int>::iterator iter=iVec.begin(); iter!=iVec.end(); ++iVec){ if (*iter % 2 == 0) { iter = iVec.erase(iter); --iter; }}
实现目的:删除容器中值为偶数的元素。
正常情况下,程序没问题,但是当容器的第一元素是偶数的时候,程序崩溃
我检查了下程序,流程是对的,为什么出现错误呢?
[解决办法]
for条件中怎么是++iVec,而不是++iter???
[解决办法]
int iArr[] = {0, 1, 2, 3, 4, 5, 6, 7};
vector<int> iVec(iArr, iArr+8);
for (vector<int>::iterator iter=iVec.begin(); iter!=iVec.end(); ++iter)
{
if (*iter % 2 == 0)
{
iter = iVec.erase(iter);
if(iter!=iVec.begin())
--iter;
else
iter=iVec.begin();
}
}
[解决办法]
有本人民邮电出版社的c++ primer参考答案上的答案 很多个都有着种问题
问题在--iter上面
ivec的第一个元素是0,第二个元素是1
显然0是偶数
iter = iVec.erase(iter)把0删除后将iter赋值为指向元素1的迭代器
此时iter=iVec.begin()
iter指向iVec的第一个元素,这时候--iter就会越界
把--iter换成
if(iter!=iVec.begin())
--iter;
所以尽量不要用--,用了就得考虑一下越界问题
[解决办法]
[Quote=引用:]
这种情况,建议使用stl的remove泛型算法
去认真看《effective stl》
[/Quote]
++
[code=C/C++]// remove_if example
#include <iostream>
#include <algorithm>
using namespace std;
bool IsOdd (int i) { return ((i%2)==1); }
int main () {
int myints[] = {1,2,3,4,5,6,7,8,9}; // 1 2 3 4 5 6 7 8 9
// bounds of range:
int* pbegin = myints; // ^
int* pend = myints+sizeof(myints)/sizeof(int); // ^ ^
pend = remove_if (pbegin, pend, IsOdd); // 2 4 6 8 ? ? ? ? ?
// ^ ^
cout < < "range contains: ";
for (int* p=pbegin; p!=pend; ++p)
cout < < " " < < *p;
cout < < endl;
return 0;
}[/code]