C++ 如何从向量中删除具有给定名称的玩家
在尝试从向量中删除字符串时,我看到一些严重错误消息。我正在尝试使用擦除-删除习惯用法,但它不起作用。下面是一些片段来说明我的困境C++ 如何从向量中删除具有给定名称的玩家,c++,c++11,vector,erase-remove-idiom,C++,C++11,Vector,Erase Remove Idiom,在尝试从向量中删除字符串时,我看到一些严重错误消息。我正在尝试使用擦除-删除习惯用法,但它不起作用。下面是一些片段来说明我的困境 team.players.erase( remove(team.players.begin(), team.players.end(), player_name), team.players.end()); team.Player在此结构中声明: struct team { string name;
team.players.erase( remove(team.players.begin(), team.players.end(),
player_name), team.players.end());
team.Player在此结构中声明:
struct team
{
string name;
player captain;
vector<player> players;
};
然而,在调用函数之前很久,当我试图编译我的程序(clang++)时,我就遇到了这些错误。以下是错误:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:865:22: error: invalid operands to binary expression ('player' and 'const std::__1::basic_string<char>')
if (*__first == __value_)
~~~~~~~~ ^ ~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:2125:22: note:
in instantiation of function template specialization
'std::__1::find<std::__1::__wrap_iter<player *>, std::__1::basic_string<char> >'
requested here
__first = _VSTD::find(__first, __last, __value_);
^
program2.cpp:172:25: note: in instantiation of function template specialization
'std::__1::remove<std::__1::__wrap_iter<player *>, std::__1::basic_string<char>
>' requested here
team.players.erase( remove(team.players.begin(), team.players.end(),
^
2 errors generated.
/Library/Developer/CommandLineTools/usr/bin/。/include/c++/v1/算法:865:22:错误:二进制表达式的操作数无效('player'和'const std::u 1::basic_string')
如果(*\uuuu first==\uuuuu值)
~~~~~~~~ ^ ~~~~~~~~
/Library/Developer/CommandLineTools/usr/bin/./include/c++/v1/算法:2125:22:注意:
在函数模板专门化的实例化中
'std::_1::find'
在此请求
__first=\u VSTD::find(\uuuuu first,\uuuuu last,\uuuuu value);
^
program2.cpp:172:25:注意:在函数模板专门化的实例化中
此处请求了“std::\u 1::删除”
team.players.erase(删除(team.players.begin(),team.players.end(),
^
产生2个错误。
你知道我该如何解决这个问题吗?错误消息非常隐晦,特别是对于初学者来说,但是编译器似乎无法找到一个
操作符==
实现来比较播放器
类的实例与std::string
对象
也许您真正想要的是使用std::remove\u if
,指定一个自定义条件,在该条件下,您可以将播放器的名称与存储要删除的名称的std::string
进行比较
您可以使用lambda表示此自定义条件,例如:
team.players.erase(
std::remove_if(
team.players.begin(),
team.players.end(),
[&player_name](const player& p) {
return p.name == player_name;
}),
team.players.end()
);
您需要的是,而不是std::remove
。您必须提供一个函数,该函数接受播放器(const引用以避免复制)并返回bool
e、 g.(假设player
有一个字符串成员name
)
问题是
std::remove()
函数使用bool操作符==()
将std::vector
的元素与player\u name
变量进行比较,该变量的类型为std::string
这就是std::remove()
识别向量中哪些元素应该删除(或者最好在容器末尾移动)的方式
但是,没有定义bool操作符==(const player&p,const std::string&name)
,这并不奇怪,因为您必须自己完成。在这种情况下,更好的方法是使用std::remove_if()
而不是std::remove()
,因为std::remove_if())
接受一个一元函数(一个接受一个参数并返回bool的函数),它调用该函数以确定是否应该删除元素
team.players.erase(remove_if(team.players.begin(), team.players.end(),
[&player_name](const auto& player) { return player.name == player_name; });
(注意:我假设player
class/struct具有类型为std::string
的成员name
)
如果您想尝试操作符==()
方法,则必须定义
大概是这样的:
bool operator==(const player& p, const std::string& name) {
return p.name == name;
}
bool operator==(const std::string& name, const player& p) {
return p.name == name;
// Or, to be more general, you could use
// return operator==(p, name);
// here (to call the operator==() version with switched arguments)
}
(是的,您应该返回两个版本,因为通常情况下,使用
==
的比较应该是对称的).请显示一个。创建一个操作符==
函数,将player
对象与std::string
进行比较如何?因为编译器告诉您的问题是,您试图将player
对象与std::string
进行比较。向量包含player
对象,因此您可以t从中删除一个字符串:PDid您忘记编写一个相等运算符来比较团队
与玩家名称的类型
?
team.players.erase(remove_if(team.players.begin(), team.players.end(),
[&player_name](const auto& player) { return player.name == player_name; });
bool operator==(const player& p, const std::string& name) {
return p.name == name;
}
bool operator==(const std::string& name, const player& p) {
return p.name == name;
// Or, to be more general, you could use
// return operator==(p, name);
// here (to call the operator==() version with switched arguments)
}