使用带有递增迭代器的std :: find

时间:2016-03-28 00:30:56

标签: c++ c++11 vector iterator

假设我有以下代码

std::vector<char> myvector = {'u', 'd', 'l', 'r', 'u'};
std::vector<char>::iterator it;

std::cout << "vector size = " << myvector.size() << std::endl;
std::cout << "myvector.begin() = " << *(myvector.begin()+1) << std::endl;
it = find (myvector.begin() + 1, myvector.end(), *myvector.begin());
if (it != myvector.end())
{
  myvector.erase(myvector.begin());
  myvector.erase(it);
  std::cout << "Found and deleted " << '\n';
  std::cout << "vector size = " << myvector.size() << std::endl;
}
else
  std::cout << "Element not found in myvector\n";

在这一行中使用myvector.begin() + 1我确实遇到了分段错误,我不明白为什么。

it = find (myvector.begin() + 1, myvector.end(), *myvector.begin());

通常我应该能够通过算术递增迭代器。我甚至尝试了其他解决方案,例如std::advancestd::next,但没有成功。

有什么建议吗?

@And是的,我想要实现的是检查元素是否重复并删除它们

2 个答案:

答案 0 :(得分:0)

行(

myvector.erase(myvector.begin());
myvector.erase(it);

有问题。擦除第一个元素后,所有其他迭代器都将失效,请参阅the documentation。更改行的顺序应使代码有效。

Live example on Coliru

答案 1 :(得分:0)

我不相信您的分段错误就在您认为的那条线上。我认为那部分没有任何问题。

我确实在这里看到未定义的行为:

myvector.erase(myvector.begin());
myvector.erase(it);
std::vector上的

erase()使擦除点之后的所有迭代器无效。在这种情况下,第一个erase()将使it无效。在这种情况下,对于std::vector的最常见实现,包括您可能使用的实现,it将成为end()迭代器,第二个erase()将成为,基本上,“myvector.erase(myvector.end());”。

不是犹太人。

在这种情况下,你不应该依赖向量迭代器的任何行为,只需在这里翻转erase()调用的顺序。