我正在尝试理解定向图实现(没有很多提到的Boost库),只是试图用c ++学习东西。以下是我想到阅读不同问题的各种指示。我想我可以使用地图查找图表中的某些位置,并使用列表将链接保存在一起。
所以关键是要说第一个被添加到列表中,而它链接到的那个将是作为列表保存的值
这给出了
key John
值列表
list Taylor-> Larry-> Sarah
#include <iostream>
#include <map>
#include <list>
class Graph {
public:
typedef std::map <std::string, std::list<std::string> > MapType;
MapType am; // adjacency map
Graph() {
}
void addVertex(std::string s) {
if(!am[s]){ // Trying to check if the key has been defined before
std::list<std::string> l;
am[s]=l;
}
}
void addEdge(std::string s1, std::string s2) {
addVertex(s1);
addVertex(s2);
am[s1].push_back(s2);
}
};
int main (int argc, char *argv[] ){
Graph *people;
people = new Graph();
people->addVertex("John");
people->addEdge("John","Taylor");
}
检查地图中的某个键是否已经定义为列表值的正确方法是什么?
我知道std::map <std::string, int >
未分配键的默认值为0,因此我只需使用!am[s]
来检查字符串是否已定义。
对于列表,它首先出现错误,表示操作符不匹配,我认为它正在讨论我使用的列表作为值。
我尝试使用if(am[s].empty()){
,但我不认为这会得到我想要的东西。
答案 0 :(得分:3)
要测试某个键是否存在于地图中,您应该使用成员函数find()
。当你像你描述的那样使用operator[]
时,你最终会在地图中插入不应该在地图中的元素(它实际上是垃圾数据,对吗?)
find()
成员函数使用您提供的键返回元素的迭代器。如果不存在具有该键的元素,则返回结束迭代器(可以通过调用end()
成员函数获得。使用成员函数find()
。
另请注意,请考虑使用std::multimap<std::string, std::string>
代替std::map<std::string, std::list<std::string> >
。
答案 1 :(得分:0)
std::map<k, v>::find(const k&)
是您正在寻找的方法。如果在地图中找到要查找的项目,它将返回当前地图条目的迭代器,如果在地图中找不到该项目,则返回与std::map<k, v>::end()
相同的迭代器。