(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);
}
}
}