2016-03-28 53 views
1

可以说我有下面的代码使用std ::以递增的迭代器找到

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是的,我要实现的是检查元素有它复制和删除它们都

+0

当您在调试器中运行程序时,哪行发生错误? – kfsone

回答

0

线(S)

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

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

Live example on Coliru

+0

愚蠢的我,证明我应该去睡觉(上午3点>。) –

+0

@JohnnieW哈哈,是的,指针或迭代器不能很好地混合睡眠不足。顺便说一下,使用'std :: next'而不是原始迭代器算法。 – vsoftco

+0

任何建议为什么我应该这样做?据了解,在处理这种简单的向量时,原始算术不应该伤害我:) –

0

我不相信你的分段错误是你认为它是线。我没有看到那部分有什么问题。

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

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

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

不是犹太教徒。

在这种情况下,您不应该依赖向量迭代器的任何行为,并且只需在此处翻转erase()调用的顺序即可。

+0

感谢您的回答,我选择这个人的答案是解决方案,因为他是第一个回答的人,希望您明白:) –