C ++在键为自定义类的映射中使用std :: find

时间:2018-11-20 22:47:07

标签: c++ c++14 c++17

我是C ++新手,最近几天我一直在为此苦苦挣扎。 我有一个需要创建地图的任务(不允许无序或多表)。 1.地图的键必须是SportTeam类,并且应该具有字符串国家/地区和字符串sportsDiscipline。 2.每个键的值是字符串的向量。 3.创建地图后,我应该使用STL查找功能来检查是否有任何键将波兰作为国家/地区。

这是我创建地图的方式:

SportTeam team1{"USA", "Hockey"}, 
team2{"Poland", "Volleyball"}, 
team3{"France", "Running"},
team4{"China", "Swimming"}, 
team5{"Poland","Tennis"};
using  mapVector = std::vector<std::string>;
std::map<SportTeam,mapVector> mapOfTeams;
mapOfTeams[team1].emplace_back("Team Beavers");
mapOfTeams[team2].emplace_back("Team Badgers");
mapOfTeams[team3].emplace_back("Team Snails");
mapOfTeams[team4].emplace_back("Team Doggos");
mapOfTeams[team5].emplace_back("Team Pinguins");

这是我的头文件:

class SportTeam {
public:
std::string country;
std::string sportsDiscipline;

SportTeam(std::string newCountry, std::string 
newDiscipline) :
country{std::move(newCountry)},
sportsDiscipline{std::move(newDiscipline)}
{};

bool operator <(const SportTeam& other)const{
    return country < other.country || (country == 
other.country && sportsDiscipline < 
other.sportsDiscipline);
}
};

问题是我不知道如何使用查找功能检查类成员。这样访问迭代器时,我就能找到国家/地区

mapIt->first.country

,然后在迭代器循环的if语句中对其进行比较,但是我无法使用find函数将其复制。

我尝试按照std :: find的cpp参考指南进行操作,提示如下所示:

auto search = example.find(2);
if (search != example.end()){
...}

但是如果我在地图本身上尝试,它将不起作用,因为它无法识别“波兰”。我尝试了不同的语法组合,但是访问此国家/地区成员的唯一方法是尝试以下操作:

auto mapIt = mapOfTeams.begin();
auto search = 
mapIt->first.country.find("Poland");

此选项不允许我将结果与mapOfTeam.end()进行比较,正如cpp参考所建议的那样,因为它会抛出!=错误,表示操作数无效。

任何帮助将不胜感激。我在堆栈和其他论坛上花费了很长时间,但找不到解决方案,因此我决定鼓起勇气,在这里写我的第一篇文章:)

TL; DR密钥是具有2个成员(国家和体育学科)的课程。我必须使用map :: find函数来检查country =“ Poland”是否无法正常工作。

2 个答案:

答案 0 :(得分:1)

mapOfTeams.find(SportTeam("Poland", "Volleyball"));

有效。

https://godbolt.org/z/K0Akq6

您必须创建键类型的对象才能比较键。您不能仅根据国家/地区名称构造SportTeam对象,因为您需要国家/地区名称和纪律。

为了有效地使用map / hash / dictionary / associative-array,您需要确保使用您要查找的对象进行键入。如果要通过其他方式(仅限国家/地区)进行查找,则需要遍历搜索国家/地区的所有条目-这样效率较低。

for(auto const & sports_team : mapOfTeams) {
  if (sports_team.first.country == "Poland") {
    // do whatever with match
  }
}

或者如其他人所建议的那样,您可以使用自定义比较器执行find_if,但这基本上与我上面写的代码相同-并且仍然没有利用{{ 1}}。

答案 1 :(得分:0)

您需要std::find_ifstd::any_of,您可以在其中使用 UnaryPredicate (或lambda函数)来提供比较逻辑。

有关如何使用此算法的互联网上有大量示例。