您的位置:首页 > 其它

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

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: