假设我有以下代码
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::advance
或std::next
,但没有成功。
有什么建议吗?
@And是的,我想要实现的是检查元素是否重复并删除它们
答案 0 :(得分:0)
行(
)myvector.erase(myvector.begin());
myvector.erase(it);
有问题。擦除第一个元素后,所有其他迭代器都将失效,请参阅the documentation。更改行的顺序应使代码有效。
答案 1 :(得分:0)
我不相信您的分段错误就在您认为的那条线上。我认为那部分没有任何问题。
我确实在这里看到未定义的行为:
myvector.erase(myvector.begin());
myvector.erase(it);
在std::vector
上的 erase()使擦除点之后的所有迭代器无效。在这种情况下,第一个erase()将使it
无效。在这种情况下,对于std::vector
的最常见实现,包括您可能使用的实现,it
将成为end()
迭代器,第二个erase()
将成为,基本上,“myvector.erase(myvector.end());”。
不是犹太人。
在这种情况下,你不应该依赖向量迭代器的任何行为,只需在这里翻转erase()调用的顺序。