【问题标题】:Initialize map with pair of std::arrays c++11 [closed]用一对 std::arrays c++11初始化地图[关闭]
【发布时间】:2016-01-07 23:45:32
【问题描述】:

我想编译这些行。插入以映射一对 std::arrays。

#include<iostream>
#include<map>
#include<array>
#include<utility>

using namespace std;

int main()
{
  array<double, 8> l;
  array<double, 8> r;
  map<double, pair<array<double, 8>, array<double, 8>>> m;
  pair<array<double, 8>, array<double, 8>> p;
  p = make_pair(l, r);//ok
  m.insert(1., make_pair(l, r));//not ok
  return 0;
}

//clear && g++ getMinPosition.cpp -std=c++11 -o getMinPosition && ./getMinPosition

【问题讨论】:

标签: c++ c++11 stdmap std-pair stdarray


【解决方案1】:

std::map::insert 有各种重载,但不接受代码中的两个类型的参数。最接近您使用的是接受const value_type&amp; 的那个,其中value_typepair&lt;const key_type, mapped_type&gt; 的别名。

所以而不是:

m.insert(1., make_pair(l, r));//not ok

做:

m.insert(make_pair(1., make_pair(l, r)));

或:

m.insert({ 1., make_pair(l, r) });
m.insert({ 1., {l, r} });

或者为了更好的性能使用emplace:

m.emplace(1., make_pair(l, r));

【讨论】:

  • 值得附注说明为什么 OP 尝试的方法不起作用:std::map::insert 预计 doublepair&lt;array&lt;double, 8&gt;, array&lt;double, 8&gt;&gt; 中的 std::pairpair&lt;array&lt;double, 8&gt;, array&lt;double, 8&gt;&gt;
  • 或使用m.emplace(1., make_pair(l, r));
【解决方案2】:

std::map::insert() 采用std::map::value_typestd::pair&lt;const Key, T&gt;。所以你必须这样做

m.insert(make_pair(1., make_pair(l, r)));

但我建议改用emplace()

m.emplace(1., make_pair(l, r));

甚至

m.emplace(std::piecewise_construct,
    std::forward_as_tuple(1.), std::forward_as_tuple(l, r));

因此您不会在两者之间创建临时对。

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2016-02-08
    • 1970-01-01
    • 2015-05-27
    相关资源
    最近更新 更多