gpt4 book ai didi

c++ - std::set 不检测重复的自定义对象

转载 作者:行者123 更新时间:2023-11-27 23:52:43 26 4
gpt4 key购买 nike

我有一张 map ,用于保存球队名称和球员std:pair<std::string, std::vector<std::string> >以及一组指向玩家的指针,以保持玩家按胜利降序排列。还有一个问题 - 一名球员可以参加多个球队。

    class Player
{
public:
int wins;
std::string name;

Player() {}
Player(std::string name) : wins(0), name(name) {}

bool operator<(const Player* rhs) const
{
return this->wins > rhs->wins;
}

bool operator()(const Player* lhs, const Player* rhs) const
{
return lhs->wins > rhs->wins;
}
};

int main()
{
// EXAMPLE
std::set<Player*> players;
std::map<std::string, std::vector<Player> > teams;

teams["TeamA"].push_back(Player("a"));
teams["TeamB"].push_back(Player("a"));;
players.insert(&teams["TeamA"].front());
players.insert(&teams["TeamB"].front());

std::cout << players.size(); // output 2

return 0;
}

如您所见,'TeamA' 和 'TeamB' 中的球员是相同的,但仍然在集合中添加了两个指针,我不明白为什么......我是否遗漏了什么?

最佳答案

你的集合包含指针,而不是 Player对象。这意味着指针比较用于确定等价性。

当然,TeamA 中第一个对象的地址与 TeamB 中第一个玩家的地址不同,即使它们包含相同的数据。

如果你想通过指针比较,使用自定义比较器类型:

PlayerComp {
bool operator()(Player* lhs, Player* rhs){
return *lhs < *rhs;
}
};

std::set<Player*, PlayerComp> players;

而播放器类实现了 operator<在它自己的实例上,而不是在指针上:

bool operator<(const Player& rhs) const
{
return wins < rhs.wins;
}

关于c++ - std::set 不检测重复的自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45169444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com