【问题标题】:How to erase certain element of a vector of pointers如何擦除指针向量的某些元素
【发布时间】:2022-01-13 20:23:43
【问题描述】:

你好,我正在编写一个函数,从指针向量中擦除元素(到类对象),但我不能让它工作。

我收到此错误 error: no matching function for call to ‘std::vector<biblio::Reference*>::erase(biblio::Reference*&)’

std::vector<Reference*> m_vReferences;          //Reference is a class
for ( auto iter : m_vReferences)                  //Loop for on every pointer to a class object
  {
    if (iter->reqId () == p_id)                   //Check if the id of the class object is the id we want
      {
        m_vReferences.erase (iter);               //Erase the pointer in the vector of pointer
      }
    else
      {
        throw EmptyReferenceException (iter->reqFormatedReference ());            //An exception
      }

  }

【问题讨论】:

  • en.cppreference.com/w/cpp/container/vector/erase 接受一个迭代器,你给它一个元素。
  • 矢量不支持按键擦除,因为没有按键。
  • 您可能正在寻找 std::erase_if(从 C++20 开始)。
  • for ( auto iter : m_vReferences) 是一个错误命名的例子。 iter 变量不是迭代器,它是 Biblio::Reference* 类型的对象。
  • 更糟糕的是……这是一个 UB。擦除返回新的迭代器,给它的迭代器变得无效并且不应该增加

标签: c++ pointers vector


【解决方案1】:

当您想从容器中删除元素时,不要使用自动范围循环。 我会使用 std::remove_if,因为它在标准库中可用。

m_vReferences.erase(std::remove_if(m_vReferences.begin(),m_vReferences.end(),[p_id](Reference* x){
   return x->reqId() == p_id;
}),m_vReferences.end());

或者您可以循环遍历向量查找要删除的元素所在的索引并使用向量中的擦除功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多