gpt4 book ai didi

c++ - 是否可以从 shared_ptr 的 vector 中删除元素?

转载 作者:行者123 更新时间:2023-11-30 04:48:21 25 4
gpt4 key购买 nike

说我有

vector<shared_ptr<string>> enemy;

如何从敌人 vector 中删除元素?

提前感谢您的帮助

**编辑(上下文中的代码)

void RemoveEnemy( vector<shared_ptr<Enemy>> & chart, string id )
{
int i = 0;
bool found = FALSE;
for(auto it = chart.begin(); it != chart.end(); i++)
{
if(id == chart[i]->GetEnemyID() )
{
found = TRUE;
chart.erase(it);
}
}

上面的代码给我造成了段错误

最佳答案

您删除元素的方式与从任何 std::vector 中删除任何元素的方式相同- 通过 std::vector::erase() 方法,例如。所有你需要的是iterator到要删除的所需元素。

在你的例子中,因为你正在存储 std::shared_ptr<std::string>对象而不是存储实际 std::string对象,您可能需要使用类似 std::find_if() 的东西找到包含所需字符串值的 vector 元素,例如:

void removeEnemy(string name)
{
auto iter = std::find_if(enemy.begin(), enemy.end(),
[&](auto &s){ return (*s == name); }
);
if (iter != enemy.end())
enemy.erase(iter);
}

更新:在您添加的新代码中,您错误地将索引和迭代器混合在一起。如果 vector,您正在创建一个无限循环不为空,因为您永远不会增加 it控制你的循环的迭代器,你正在增加你的索引 i variable 而不是(看看当你不给你的变量唯一和有意义的名字时会发生什么?)。所以你最终会越界 vector进入周围的内存。这就是您收到段错误的原因。

即使您(尝试)使用迭代器循环遍历 vector ,您正在使用索引来访问元素,而不是取消引用迭代器来访问元素。在这种情况下,您根本不需要使用索引,仅使用迭代器就足够了。

试试这个:

void RemoveEnemy( vector<shared_ptr<Enemy>> & chart, string id )
{
for(auto it = chart.begin(); it != chart.end(); ++it)
{
if (id == it->GetEnemyID() )
{
chart.erase(it);
return;
}
}

或者,使用我之前建议的那种代码:

void RemoveEnemy( vector<shared_ptr<Enemy>> & chart, string id )
{
auto iter = std::find_if(chart.begin(), chart.end(),
[&](auto &enemy){ return (enemy->GetEnemyID() == id); }
);
if (iter != chart.end())
chart.erase(iter);
}

关于c++ - 是否可以从 shared_ptr 的 vector 中删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55875590/

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