代码之家  ›  专栏  ›  技术社区  ›  phwd

正在处理std::Map中的std::List for operator=,operator!=等

c++
  •  3
  • phwd  · 技术社区  · 14 年前

    我试图理解有向图实现(不包括前面提到的Boost库),只是试图学习c++中的一些东西。以下是我在阅读不同问题的不同观点时得出的结论。我想我可以使用一张地图来查找图表中的某些位置,并使用一个列表来将链接保存在一起。

    所以关键是要添加到列表中的第一个,它链接到的是作为列表保存的值

    这给了

    钥匙 约翰
    价值 列表
    列表 泰勒->拉里->莎拉

    #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 回复  |  直到 14 年前
        1
  •  3
  •   James McNellis    14 年前

    要测试一个键是否存在于一个映射中,您应该使用成员函数 find() . 当你使用 operator[] 正如您所描述的,您最终将不应该在映射中的元素插入到映射中(这实际上是垃圾数据,对吧?)

    这个 查找() 成员函数返回元素的迭代器,该迭代器具有给定的键。如果不存在带有该键的元素,则返回结束迭代器(可以通过调用 end() 成员函数。使用成员函数 查找() .

    另一方面,考虑使用 std::multimap<std::string, std::string> 而不是你的 std::map<std::string, std::list<std::string> > .

        2
  •  0
  •   Billy ONeal IS4    14 年前

    std::map<k, v>::find(const k&) 是你正在寻找的方法。如果在映射中找到要查找的项,它将向当前映射项返回迭代器,或者返回与 std::map<k, v>::end() 如果在地图中找不到项目。