2016-11-06 99 views
-2

我有一个std::vector<string>调用v。我想从用户那里读取一个字符串,并将其从v中删除。这是我到目前为止:从std :: vector中删除一个字符串?

string rnames; 
cout << "Enter the string to remove " << endl; 
cin >> rnames; 

v.erase(rnames); 

这产生了一个错误。

任何想法,我们可以使这个工作?我们首先需要找到rname并删除它吗?

+4

你会得到什么样的错误?矢量是如何声明的? – neoaggelos

+0

你看过文档吗? http://en.cppreference.com/w/cpp/container/vector/erase –

+0

向量被声明为:向量名称; – fsfh60

回答

3

std::vectorerase方法需要一个迭代器来说明要删除的向量中的哪个条目。它不起作用,如地图或设置您可以拨打erase删除指定的密钥。

要从std::vector删除一个元素的单个副本,则可以使用std::findstd::vectorerase成员函数是这样的:

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删除元素,你必须在大量元素矢量,你可能要考虑改变数据结构更有效地支持清除的东西。

+0

这真棒,我现在得到一个错误,说itr没有命名一个类型,并且itr没有在这个范围内声明。 – fsfh60

+0

你使用什么编译器? 'auto'功能是一个C++ 11功能,并且您所描述的错误听起来像您可能正在使用较旧的编译器。 – templatetypedef

+0

我正在使用编译器DEV C++ – fsfh60