【问题标题】:how to use stl::map as two dimension array如何使用 stl::map 作为二维数组
【发布时间】:2010-08-03 21:37:47
【问题描述】:

能否告诉我们如何使用 stl:map 作为二维数组?我想像 mymap[i][j] 那样访问各个元素,我事先不知道 i 或 j 的值可能是什么。有没有更好的想法以其他方式做同样的事情?

【问题讨论】:

  • 您使用地图有什么原因吗?
  • 不,没有具体原因。如果有更好的选择,您能告诉我吗?
  • @ebtest,你知道 i 和 j 的取值范围是多少吗?

标签: c++ stl


【解决方案1】:

你可以的

std::map<int, std::map<int, int> > mymap;

例如:

#include <map>
#include <iostream>

int main() 
{
    std::map<int, std::map<int, int> > mymap;

    mymap[9][2] = 7;
    std::cout << mymap[9][2] << std::endl;

    if (mymap.find(9) != mymap.end() && mymap[9].find(2) != mymap[9].end()) {
        std::cout << "My map contains a value for [9][2]" << std::endl;
    } else {
        std::cout << "My map does not contain a value for [9][2]" << std::endl;
    }

    return 0;
}

在标准输出上打印 7,然后是“我的地图包含 [9][2] 的值”。

【讨论】:

  • 您能告诉我如何在此地图中插入元素吗?你能举个例子吗。在我的情况下,我需要在地图中存储对象指针。谢谢。
  • 感谢您的回复。现在如何检查索引 i,j 处是否有元素?
  • 更新了我的答案以显示如何从地图中插入和提取 int 元素。
  • 谢谢。我想知道如何找出索引 i,j 处是否有有效元素?这意味着我想在尝试访问元素之前测试位置 [i][j] 的有效性。
  • @Andrew Stein:+1,但是您检查存在性的方法的缺点是它不能在 const 限定方法中使用(因为没有 operator[] const 用于 @ 987654324@).
【解决方案2】:

Andrew Stein 的另一种解决方案与 STL 的其余部分配合得更好,是简单地使用

typedef std::map<std::pair<int, int>, int > AMapT;
AMapT mymap;
mymap[std::make_pair(2, 4)] = 10;
...
AMapT::iterator f = mymap.find(std::make_pair(3, 5));

例如,通过这种方式,您不需要将两个调用链接到map::find 来搜索单个值。

【讨论】:

  • 我可以将它用作 3 维数组吗?
  • 值得指出的是,std::map 要求密钥小于可比性。 Carlos 的解决方案之所以有效,是因为std::pair 提供了一个字典小于比较器。 sgi.com/tech/stl/pair.html
  • ebtest,你可以,但它变得丑陋:std::map&lt;std::pair&lt;int, std::pair&lt;int, int&gt; &gt;, int&gt;。你可能最好使用 boost 的元组类型,或者只是一个你自己滚动的结构和构造函数。正如 rwong 指出的那样,您还需要一个小于比较运算符。
【解决方案3】:

考虑改用 kd-tree。每个分支级别将依次比较 i 和 j 值。见http://en.wikipedia.org/wiki/Kd-tree

【讨论】:

  • 一些使用 KD-tree 的例子将不胜感激:/
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 2018-01-16
  • 2012-09-28
  • 1970-01-01
  • 2016-01-17
  • 2013-08-15
  • 2017-03-31
  • 2013-12-16
相关资源
最近更新 更多