【问题标题】:C++ 2d map? Like a 2d array?C++ 2d 地图?像二维数组?
【发布时间】:2013-07-12 15:31:46
【问题描述】:

可以制作二维地图吗?

像这样:

map< int, int, string> testMap;

填充值就像:

testMap[1][3] = "Hello";

感谢您的宝贵时间 :)

【问题讨论】:

    标签: c++ arrays map 2d


    【解决方案1】:

    是的,在std::map 中使用std::pair

    std::map< std::pair<int, int>, string> testMap;
    testMap[std::make_pair(1,3)] = "Hello";
    

    【讨论】:

    • 有趣。通常,我可能会使用它,但是我实际上使用的是 Qt 创建器,所以我认为他们没有标准库。他们可能有类似的东西,但 idk。例如,我没有使用 std::map,而是使用 QMap。好在语法是一样的
    • Qt Creator 只是一个 IDE(集成开发环境),而不是编译器或不同形式的 C++。因此,即使 Qt Creator 在处理定义 QMap 的 Qt 库时很有用,您仍然可以在 Qt Creator 中编写标准 C++(例如使用 std::map)并进行编译。
    • 这将比 RyanMcK 的解决方案高效得多。
    • @mc360pro std::pair 不像添加一个额外的std::map 那么重。地图地图的查找时间为O(Lg(n)*Lg(n)),而一对地图只需O(Lg(n))
    • 绝对不是O(lg(n)*lg(n))。这是O(lg(n) + lg(n)),或者只是O(lg(n))。第一个地图查找采用lg(n),第二个也采用lg(n)。当然,这是假设一个方形“阵列”。这可能应该分解为mn,但它仍然以类似的方式简化。
    【解决方案2】:

    你可以嵌套两张地图:

    #include <iostream>
    #include <map>
    #include <string>
    
    int main()
    {
        std::map<int,std::map<int,std::string>> m;
    
        m[1][3] = "Hello";
    
        std::cout << m[1][3] << std::endl;
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      如果它对任何人都有帮助,这里是一个基于 andre 的答案的类的代码,它允许像常规二维数组一样通过括号运算符进行访问:

      template<typename T>
      class Graph {
      /*
          Generic Graph ADT that uses a map for large, sparse graphs which can be
          accessed like an arbitrarily-sized 2d array in logarithmic time.
      */
      private:
          typedef std::map<std::pair<size_t, size_t>, T> graph_type;
          graph_type graph;
          class SrcVertex {
          private:
              graph_type& graph;
              size_t vert_src;
          public:
              SrcVertex(graph_type& graph): graph(graph) {}
              T& operator[](size_t vert_dst) {
                  return graph[std::make_pair(vert_src, vert_dst)];
              }
              void set_vert_src(size_t vert_src) {
                  this->vert_src = vert_src;
              }
          } src_vertex_proxy;
      public:
          Graph(): src_vertex_proxy(graph) {}
          SrcVertex& operator[](size_t vert_src) {
              src_vertex_proxy.set_vert_src(vert_src);
              return src_vertex_proxy;
          }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-13
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        相关资源
        最近更新 更多