(转)vector中使用erase删除…
2013-08-19 18:27
169 查看
原文地址:(转)vector中使用erase删除元素作者:独自等待很容易受数组的影响,写出如下代码:
std::vecotr<int>::iterator it =
vc.begin();
for( ; it != vc.end(); it++ )
{
if( *****
)
vc.erase(it);
}
原因是vector中在删除一个元素后,迭代器会自动指向下一个元素。所以,上面的代码很可能导致迭代器越界。
《The C++ Standard Library》中解释:
所以,正确做法应该是:
for( ; it != vc.end(); )
{
if( *****
)
{
vc.erase(it);
}
else
{
it++;
}
}
问题又来了,上面的代码在C++ Builder 6.0 、Mingw32
2.95下编译运行完全正常,但vc下面同样会出错(Visual Studio
2008),在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。
例子:
#include "iostream"
#include "vector"
using namespace std;
int main()
{
vector<int>
arr;
arr.push_back(6);
arr.push_back(8);
arr.push_back(3);
arr.push_back(8);
for(vector<int>::iterator
it=arr.begin(); it!=arr.end(); )
{
if(* it == 8)
{
it = arr.erase(it);
}
else
{
++it;
}
}
cout
<< "After remove 8:n";
for(vector<int>::iterator it =
arr.begin(); it < arr.end(); ++it)
{
cout << * it
<< " ";
}
cout
<< endl;
}
转自:http://hi.baidu.com/orangeron/blog/item/3da2373d056df005bba16778.html
std::vecotr<int>::iterator it =
vc.begin();
for( ; it != vc.end(); it++ )
{
if( *****
)
vc.erase(it);
}
原因是vector中在删除一个元素后,迭代器会自动指向下一个元素。所以,上面的代码很可能导致迭代器越界。
《The C++ Standard Library》中解释:
c.erase(pos) | Removes the element at iterator position pos and returns the position of the next element |
for( ; it != vc.end(); )
{
if( *****
)
{
vc.erase(it);
}
else
{
it++;
}
}
问题又来了,上面的代码在C++ Builder 6.0 、Mingw32
2.95下编译运行完全正常,但vc下面同样会出错(Visual Studio
2008),在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。
例子:
#include "iostream"
#include "vector"
using namespace std;
int main()
{
vector<int>
arr;
arr.push_back(6);
arr.push_back(8);
arr.push_back(3);
arr.push_back(8);
for(vector<int>::iterator
it=arr.begin(); it!=arr.end(); )
{
if(* it == 8)
{
it = arr.erase(it);
}
else
{
++it;
}
}
cout
<< "After remove 8:n";
for(vector<int>::iterator it =
arr.begin(); it < arr.end(); ++it)
{
cout << * it
<< " ";
}
cout
<< endl;
}
转自:http://hi.baidu.com/orangeron/blog/item/3da2373d056df005bba16778.html
相关文章推荐
- 为什么vector的remove_if实际上并没有删除元素,而要配合erase使用
- (转)vector中使用erase删除元素
- vector中使用erase删除元素
- vector中使用erase删除元素
- 关于vector中使用erase删除元素后导致越界的问题
- STL Vector remove()和erase()的使用
- 使用vector建立结构体变量的数组,动态进行增加删除和显示
- C++STL中对vector进行erase删除元素操作中遇到的问题。
- vector和map迭代中erase的使用陷阱
- 关于vector中erase,删除元素的考量
- leetcode-27. Remove Element--STL Vector remove()和erase()的使用
- 关于vector erase的使用
- C++中vector::erase方法的使用
- STL Vector remove()和erase()的使用
- vector用erase删除元素时,被删元素的析构函数会被调用很多次
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
- vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次?
- 小记—— vector 删除指定下标中的元素(不使用迭代器(iterator ))
- 删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法http://www.xuebuyuan.com/1407838.html
- vector::erase方法,返回值是更新后的容器的被删除元素的后一个元素的迭代器,如果需要指向删除元素的前面一个元素的迭代器就要-1