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)
}