是否可以从shared_ptr向量中删除元素?

时间:2019-04-26 22:26:20

标签: c++ vector shared-ptr

说我有

vector<shared_ptr<string>> enemy;

如何从敌方向量中删除元素?

非常感谢您的帮助

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

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

上面的代码使我感到困惑

3 个答案:

答案 0 :(得分:1)

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

在您的情况下,由于您要存储std::shared_ptr<std::string>个对象而不是存储实际的std::string个对象,因此可能需要使用类似std::find_if()的东西来查找包含所需字符串值的向量元素,例如:

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而不是变量(看看当您不给变量唯一且有意义的名称时会发生什么?)。因此,您最终超出了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);
}

答案 1 :(得分:0)

我喜欢我的公司,它将以高速运送外星人,而无需理会其他物品的订购。带着偏见撤除!

partition-test.cpp:
make partition-test && echo 1 alien 9 alien 2 8 alien 4 7 alien 5 3 | ./partition-test

#include <algorithm>
#include <iostream>
#include <iterator>
#include <memory>
#include <string>
#include <vector>

using namespace std;

template <typename T>
ostream &operator<<(ostream &os, const vector<T> &container) {
  bool comma = false;
  for (const auto &x : container) {
    if (comma)
      os << ", ";
    os << *x;
    comma = true;
  }
  return os;
}

int main() {
  vector<shared_ptr<string>> iv;
  auto x = make_shared<string>();
  while (cin >> *x) {
    iv.push_back(x);
    x = make_shared<string>();
  }
  cout << iv << '\n';

  iv.erase(partition(begin(iv), end(iv),
                     [](const auto &x) { return *x != "alien"s; }),
           end(iv));
  cout << iv << '\n';
  return 0;
}

答案 2 :(得分:0)

您的代码存在的问题是class Parent extends Component { constructor(props) { super(props); this.state = { globalTodos: initialFetchedArray }; } changeGlobalTodos() { let newTodos = fetchNewArray; this.setState({globalTodos: newTodos}); } ReactDOM.render(<ReactApp todos={globalTodos} />, document.getElementById('app')); } //You just need your prop here, here you can do whatever you want to do with the array if it's display you can use map class Child extends Component { render { return( {this.props.todos} ) } } 使无效。您必须使用erase()