【问题标题】:Using 3d array as key for map in C++?在 C++ 中使用 3d 数组作为映射的键?
【发布时间】:2016-04-21 06:31:15
【问题描述】:

假设我有一个地图,它使用一个 3d 整数数组作为键,另一个整数作为值:

map<int, map<int, map<int, int> > > mp;

然后我如何查看此映射以检查键是否存在,然后获取该键的值?

我试过了

map<int, map<int, map<int, int> > >::iterator it = mp[1][3].find(4);
x = it->second;

但是这会产生错误。为什么会这样?

编辑:我使用 3d int 数组而不是浮点数得到了错误

【问题讨论】:

  • 肯定会报错。你的地图键是int,你正在传递[1.1]。这是你知道的双倍。
  • 我刚刚修正了那个错字
  • 出于好奇,您使用map&lt;int, map&lt;int, map&lt;int, int&gt; &gt; &gt; 的目标是什么?
  • 你会和std::map&lt;std::tuple&lt;int,int,int&gt;, int&gt;一起度过更好的时光

标签: c++ dictionary


【解决方案1】:

也许更好的结构是使用一个类来存储您的 3d 索引并将其用作键?

map<index3D, int> mp;

然后你可以做类似的事情

if(mp.count(index3D(ix, iy, iz)) > 0) // do something

【讨论】:

    【解决方案2】:
    // Assuming v1, v2 and v3 are int indices
    if(mp.find(v1) != mp.end() &&
       mp[v1].find(v2) != mp[v1].end() &&
       mp[v1][v2].find(v3) != mp[v1][v2].end())
    {
      // Key exist
      const int &value = mp[v1][v2][v3];
      ...
    }
    else
    {
      // Key does not exis
      ...
    }
    

    如果对您的性能更好,您可以保存临时迭代器/引用并使用嵌套循环。

    实现相同功能的另一种更简单的方法是使用std::tuple&lt;int, int, int&gt;std::pair&lt; std::pair&lt;int, int&gt;, int &gt; 作为键。并不是std::tuplestd::pair 都提供operator &lt;

    mp[1][3].find(4)有什么问题

    您不能将其应用于cons 参考。如果mp[1]mp[1][3] 不存在,则此代码无需创建新地图。

    ideone example

    【讨论】:

    • 我如何提取值并将其分配给变量x?只需使用x = it-&gt;second;?
    • 成功部分:使用mp[v1][v2][v3]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多