在std :: Map中处理std :: List for operator ==,operator!= etc.

时间:2010-11-17 03:31:28

标签: c++

我正在尝试理解定向图实现(没有很多提到的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()){,但我不认为这会得到我想要的东西。

2 个答案:

答案 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()相同的迭代器。