【问题标题】:Error when trying to erase vector of pointers尝试擦除指针向量时出错
【发布时间】:2014-10-10 17:27:25
【问题描述】:

假设我有一个类指针向量 Tower,如下所示:

vector<Tower*> tower_list;

我已经完成了一些操作来将 Towers 添加到我的向量中,但是现在当我尝试像这样使用 vector::erase 方法时

tower_list.erase(0);

我收到以下错误消息:

Error: no instance of overloaded function "std::vector<_ty, _Alloc>::erase[with _Ty=Tower*, _Allow=std:allocator<Tower*>]" matches the argument list argument types are: (int)
object type is: std::vector<Tower*, std::alocator<Tower*>>

谁能解释为什么我在尝试擦除这个塔指针时收到这个编译错误?如果您需要更多详细信息,请告诉我。谢谢

【问题讨论】:

  • tower_list.erase(tower_list.begin()); - 请查看 std::vector 的文档
  • @DieterLücking 这似乎有效。为什么我不能简单地放索引?如果我不想删除第一个元素怎么办?
  • 您可以为迭代器添加偏移量。 (例如 tower_list.erase(tower_list.begin()+2);)
  • 谢谢大家。有人可以告诉我这是否会删除实际的 Tower 对象或指针?
  • 它不会删除指向的塔。如果您希望指向的对象在从向量中删除时自动删除,请使用vector&lt;unique_ptr&lt;Tower&gt;&gt;

标签: c++ pointers vector erase


【解决方案1】:

vector::erase 接受 iterator,而不是整数。

所以如果你想擦除向量中的第一个元素:

tower_list.erase (tower_list.begin());

http://en.cppreference.com/w/cpp/container/vector/erase

【讨论】:

    【解决方案2】:

    来自cppreference.com,这些是std::vector 上定义的重载erase 函数。

    iterator erase( iterator pos );
    iterator erase( const_iterator pos );
    iterator erase( iterator first, iterator last );
    iterator erase( const_iterator first, const_iterator last );
    

    参数0 不能转换为采用一个参数的两个重载中的任何参数类型。

    如果要擦除包含 NULL 指针的项目,请使用:

    std::vector<Tower*>::iterator iter = tower_list.find(nullptr);
    if ( iter != tower_list.end() )
    {
       tower_list.erase(iter);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      相关资源
      最近更新 更多