C++ 在反向遍历时删除向量中某个数字的多个匹配项
我有一个整数向量,我反向遍历它。我需要搜索其中的一个元素,并在遍历向量时删除它的第一个匹配项。我正在使用以下函数并得到分段错误C++ 在反向遍历时删除向量中某个数字的多个匹配项,c++,algorithm,vector,C++,Algorithm,Vector,我有一个整数向量,我反向遍历它。我需要搜索其中的一个元素,并在遍历向量时删除它的第一个匹配项。我正在使用以下函数并得到分段错误 for(i=num.end()-1;i!=num.begin()-1;i--) { tmp=binary(*i); if(tmp!=num.end()) {num.erase(i);num.erase(tmp);res++;} } 这里的函数binary返回一个迭代器,如果使用erase函数的语句,其值肯定小于i 我使用了以下链接:-
for(i=num.end()-1;i!=num.begin()-1;i--)
{
tmp=binary(*i);
if(tmp!=num.end())
{num.erase(i);num.erase(tmp);res++;}
}
这里的函数binary返回一个迭代器,如果使用erase函数的语句,其值肯定小于i
我使用了以下链接:-
及
但是他们建议使用std::remove和std::remove_if函数来删除所有出现的值 编辑:我错了,你的设计有缺陷 我忽略的问题是:
num.erase(x)
会使x
之后的元素的引用和迭代器无效。这意味着num.erase(i);擦除数(tmp)如果tmp
,则code>有效,但也意味着i
之后将无效。因此,在循环的下一次迭代中,您的循环迭代器将无效
如果只想擦除这两个元素,则应在擦除它们后退出循环。如果要在从结束到开始的扫描中删除多个项,则需要找到某种方法将循环指针提前到最早删除点之前的点。(尽管如此,您还应该注意,从std::vector
的中间删除多个项目是低效的——通常从长度为N的向量中每次删除都需要O(N))。您还可以退出循环并从末尾重新开始(我认为@SHR的意思是“重置迭代器”)
如果无法执行上述任何操作,则需要其他类型的容器,如std::list
,对于该容器,erase()
不会使其余元素的迭代器无效。此外,这些删除是O(1)(尽管您失去了快速随机访问…)
如果binary()
的行为与您所说的一样,那么您的意图似乎是正确的:erase()
从std::vector
中删除元素应该在删除元素之前保留对元素的引用和迭代器
问题可能出在其他地方。如果您发布的代码与您的程序完全相同,则您的If
语句中存在格式错误:
if(tmp!=num.end())
num.erase(i);num.erase(tmp);res++;
请注意,实际受if
条件影响的唯一语句是num.erase(i)代码>--其余语句将无条件执行。特别是,如果tmp==num.end()
,它仍将执行num.erase(tmp)
,可能会导致分段错误
可能的最小修复方法是在三个语句周围添加大括号:
if(tmp!=num.end())
{num.erase(i);num.erase(tmp);res++;}
从向量中删除后,无法继续迭代。你应该在删除后重置迭代器。你能用一个例子详细说明一下如何做吗?事实上,再看一遍,你的设计中实际上存在一个问题。我会更新我的答案。。。