Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在反向遍历时删除向量中某个数字的多个匹配项_C++_Algorithm_Vector - Fatal编程技术网

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++;}

从向量中删除后,无法继续迭代。你应该在删除后重置迭代器。你能用一个例子详细说明一下如何做吗?事实上,再看一遍,你的设计中实际上存在一个问题。我会更新我的答案。。。