【发布时间】: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,干得好。太少见了。继续加油!