gpt4 book ai didi

C++如何在迭代时从 vector 中删除

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:05:29 25 4
gpt4 key购买 nike

std::vector<int *>intList;
int *a = new int;
*a = 3;
int *b = new int;
*b = 2;
int *c = new int;
*c = 1;

intList.push_back(a);
intList.push_back(b);
intList.push_back(c);

std::vector<int *>::iterator it;

for (it = intList.begin(); it != intList.end();)
{
int *a = (int*)*it;

if ((*a) == 2)
{
delete a;
intList.erase(it);
}
else
{
++it;
}
}

当从 vector 中删除某些内容时,此代码在 for 循环开始时崩溃。我不懂为什么。如果有帮助,我正在使用 Visual Studio 2015

最佳答案

erase 返回下一个迭代器。

if ((*a) == 2)
{
delete a;
it = intList.erase(it);
}

编辑:remove()remove_if() 将复制元素(此处为指针),最后将有多个元素指向同一个整数,如果您随后尝试释放它们,你会留下悬空指针。

考虑 vector 有 4 元素,看起来像

0x196c160 0x196bec0 0x196c180 0x196bee0 

人们可能会想使用 erase-remove 习语

auto temp = remove_if(vec.begin(),vec.end(),[](const auto &i){return *i==2;});

现在看起来像

0x144aec0 0x144b180 0x144b180 0x144aee0

temp 将指向 3rd 元素和一个

for(auto it=temp;it!=vec.end();it++)
delete *it;

现在第二个元素是一个悬挂指针。

编辑 2:如果您在复制元素之前删除,则可以解决上述问题。查看@Dietmar 的回答。

关于C++如何在迭代时从 vector 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51870548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com