std::vector中erase的用法误区
2015-04-27 10:11
260 查看
(1)std::vector中erase函数是删除一个对象,传的参数是要删除值的迭代器;
如果删除的是vector中的最后一个元素,并且迭代器还要做++ 操作,就容易出问题。
如下:
void test()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
std::vector<int>::iterator itr = vecInt.begin();
for (int i = 0; itr != vecInt.end(); ++itr, ++i)//++itr coredump具体位置
{
if ((*itr) == 6)
{
//错误:如果是最后一个,erase后再++,会coredump
vecInt.erase(itr);
}
}
}
(2)正确的操作1
void test()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
std::vector<int>::iterator itr = vecInt.begin();
for (int i = 0; itr != vecInt.end(); ++itr, ++i)
{
if ((*itr) == 6)
{
break;
}
}
//正确这样删除时没有问题的
vecInt.erase(itr);
}
(3)正确的操作2
void test()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
std::vector<int>::iterator itr = vecInt.begin();
std::vector<int>::iterator itrflag = std::find(vecInt.begin(), vecInt.end(), 6);
if (vecInt.end() != itrflag)
{
//如果要返回元素所在位置的下标,用下面的方法
int n = itrflag - itr;
//正确这样删除时没有问题的
vecInt.erase(itrflag);
}
}
(4)删除全部元素的方法
void test()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
for (int i = 0; i < vecInt.size();++i)
{
std::vector<int>::iterator itrflag = std::find(vecInt.begin(), vecInt.end(), 1);
if (vecInt.end() != itrflag)
{
//正确这样删除时没有问题的
vecInt.erase(itrflag);
}
else
{
break;
}
}
}
(5)一种错误全部元素的方法
void test2()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
std::vector<int>::iterator itr = vecInt.begin();
for (int i = 0; itr != vecInt.end(); ++itr, ++i) //coredump在这里,可能是erase后再++itr不允许吧
{
if ((*itr) == 1)
{
vecInt.erase(itr);
}
}
}
如果删除的是vector中的最后一个元素,并且迭代器还要做++ 操作,就容易出问题。
如下:
void test()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
std::vector<int>::iterator itr = vecInt.begin();
for (int i = 0; itr != vecInt.end(); ++itr, ++i)//++itr coredump具体位置
{
if ((*itr) == 6)
{
//错误:如果是最后一个,erase后再++,会coredump
vecInt.erase(itr);
}
}
}
(2)正确的操作1
void test()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
std::vector<int>::iterator itr = vecInt.begin();
for (int i = 0; itr != vecInt.end(); ++itr, ++i)
{
if ((*itr) == 6)
{
break;
}
}
//正确这样删除时没有问题的
vecInt.erase(itr);
}
(3)正确的操作2
void test()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
std::vector<int>::iterator itr = vecInt.begin();
std::vector<int>::iterator itrflag = std::find(vecInt.begin(), vecInt.end(), 6);
if (vecInt.end() != itrflag)
{
//如果要返回元素所在位置的下标,用下面的方法
int n = itrflag - itr;
//正确这样删除时没有问题的
vecInt.erase(itrflag);
}
}
(4)删除全部元素的方法
void test()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
for (int i = 0; i < vecInt.size();++i)
{
std::vector<int>::iterator itrflag = std::find(vecInt.begin(), vecInt.end(), 1);
if (vecInt.end() != itrflag)
{
//正确这样删除时没有问题的
vecInt.erase(itrflag);
}
else
{
break;
}
}
}
(5)一种错误全部元素的方法
void test2()
{
std::vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(1);
vecInt.push_back(6);
std::vector<int>::iterator itr = vecInt.begin();
for (int i = 0; itr != vecInt.end(); ++itr, ++i) //coredump在这里,可能是erase后再++itr不允许吧
{
if ((*itr) == 1)
{
vecInt.erase(itr);
}
}
}
相关文章推荐
- vector 中 erase 用法注意事项
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
- vector中erase用法注意事项
- std::map::erase的用法及陷阱
- vector中erase用法注意事项
- vector中erase用法注意事项
- std::vector : 用法与技巧 转
- vector中erase用法注意事项
- c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
- std::vector erase 没有清除对象的问题
- std::vector : 用法与技巧
- C++中vector中erase用法注意事项
- std::vector用法
- STD::vector 用法笔记
- vector中erase用法注意事项
- 实习小白::(转) vector中erase用法注意事项
- vector中erase用法注意事项
- 小心std::vector的一个错误用法!
- vector中erase用法注意事项
- vector中erase用法注意事项