我有一个std::vector<string>
调用v
。我想从用户那里读取一个字符串,并将其从v
中删除。这是我到目前为止:从std :: vector中删除一个字符串?
string rnames;
cout << "Enter the string to remove " << endl;
cin >> rnames;
v.erase(rnames);
这产生了一个错误。
任何想法,我们可以使这个工作?我们首先需要找到rname并删除它吗?
我有一个std::vector<string>
调用v
。我想从用户那里读取一个字符串,并将其从v
中删除。这是我到目前为止:从std :: vector中删除一个字符串?
string rnames;
cout << "Enter the string to remove " << endl;
cin >> rnames;
v.erase(rnames);
这产生了一个错误。
任何想法,我们可以使这个工作?我们首先需要找到rname并删除它吗?
std::vector
的erase
方法需要一个迭代器来说明要删除的向量中的哪个条目。它不起作用,如地图或设置您可以拨打erase
删除指定的密钥。
要从std::vector
删除一个元素的单个副本,则可以使用std::find
和std::vector
的erase
成员函数是这样的:
auto itr = std::find(v.begin(), v.end(), rnames);
if (itr != v.end()) v.erase(itr);
上面代码假定您使用C++ 11 ,所有主要的现代编译器都支持。然而,它似乎像你使用的是老式的编译器不支持C++ 11,所以你必须写这样的事:
std::vector<string>::iterator itr = std::find(v.begin(), v.end(), rnames);
if (itr != v.end()) v.erase(itr);
要删除元素的所有副本一个vector
,你可以使用std::remove
这样的:
v.erase(std::remove(v.begin(), v.end(), rnames), v.end());
(这需要<algorithm>
头。)话虽这么说,如果你发现你经常从std::vector
删除元素,你必须在大量元素矢量,你可能要考虑改变数据结构更有效地支持清除的东西。
这真棒,我现在得到一个错误,说itr没有命名一个类型,并且itr没有在这个范围内声明。 – fsfh60
你使用什么编译器? 'auto'功能是一个C++ 11功能,并且您所描述的错误听起来像您可能正在使用较旧的编译器。 – templatetypedef
我正在使用编译器DEV C++ – fsfh60
你会得到什么样的错误?矢量是如何声明的? – neoaggelos
你看过文档吗? http://en.cppreference.com/w/cpp/container/vector/erase –
向量被声明为:向量名称; –
fsfh60