读书人

器皿的一个用法错在哪呢

发布时间: 2012-10-23 12:12:22 作者: rapoo

容器的一个用法,错在哪呢?

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]

读书人网 >C++

热点推荐