【问题标题】:erase() does not work on a STL vector inside a structure/object? [duplicate]擦除()不适用于结构/对象内的 STL 向量? [复制]
【发布时间】:2019-05-27 16:49:40
【问题描述】:

我有一个包含 STL 向量的对象。我从大小为零的向量开始,然后使用push_back 添加到它。所以,push_back 工作正常。

在我的代码中,向量中的每个元素都代表一个原子。因此,这个 STL 向量所在的对象是一个“分子”。

当我尝试从我的分子中移除一个原子,即从数组中删除一个元素时,erase() 函数不起作用。其他方法确实有效,例如size()clear()clear() 删除了所有元素,这太过分了。 erase() 正是我想要的,但由于某种原因它不起作用。

这是我的代码的极其简化的版本。但是,它确实准确地代表了问题。


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

using namespace std;

class atomInfo 
{
/* real code has more variables and methods */
public:
    atomInfo () {} ;
};

class molInfo 
{
/* There is more than 1 atom per molecule */
/* real code has more variables and methods */
public:
    vector <atomInfo> atom;
    molInfo () {};
};

int main ()
{
    int i;
    molInfo mol;

    for( i=0; i<3 ; i++)
        mol.atom.push_back( atomInfo() );
    //mol.atom.clear() ; //Works fine
      mol.atom.erase(1) ; //does not work
}    

当我使用erase() 时出现以下错误:

main.cpp:在函数“int main()”中:main.cpp:39:21:错误:没有匹配 调用‘std::vector::erase(int)’的函数 mol.atom.erase(1) ;

【问题讨论】:

  • 即使它不在“结构对象内部”,它也不起作用。无论如何,这与向量是否在对象内部完全无关。 erase() 不采用 int 参数。 erase() 将迭代器作为参数。有关更多信息,请参阅您的 C++ 书籍。
  • 提示:mol.atom.begin() 是第一项的迭代器(如果向量不为空)。
  • 我当然会删除它,但你们确实提供了帮助,所以感谢您的时间、投反对票和所有
  • 很好的 MCVE,努力提出这个问题,即使这是一个简单的新手错误。通过查看该功能的文档,您可能会因为没有跟进明显的错误消息而遭到反对。我会给你一个 +1 以使问题清晰且可重现,这就是我们在这里的目的。如果未来的海报做出如此清晰的演示,那将很有用。
  • 完美的 MCVE,干得好。太少见了。继续加油!

标签: c++ stl


【解决方案1】:

您似乎认为std::vector::erase 从容器的开头获取了一个索引。

不清楚你从哪里得到这个想法,因为这不是the documentation 所说的。

这些函数与迭代器一起使用。

幸运的是,有了向量,你可以通过在迭代器中添加一个数字来获得你想要的效果。

像这样:

mol.atom.erase(mol.atom.begin() + 1);

上述文档实际上确实有一个例子。

【讨论】:

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