我是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”是否无法正常工作。
答案 0 :(得分:1)
mapOfTeams.find(SportTeam("Poland", "Volleyball"));
有效。
您必须创建键类型的对象才能比较键。您不能仅根据国家/地区名称构造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_if或std::any_of,您可以在其中使用 UnaryPredicate (或lambda函数)来提供比较逻辑。
有关如何使用此算法的互联网上有大量示例。