-4

我想编译这些行。插入以映射一对 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
4

2 回答 2

2

std::map::insert有各种重载,但不接受代码中的两个类型参数。最接近您使用的是接受const value_type&wherevalue_typepair<const key_type, mapped_type>.

所以而不是:

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));
于 2016-01-07T23:52:11.673 回答
1

std::map::insert()需要std::map::value_type哪个是std::pair<const Key, T>。所以你必须做

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));

所以你不会在两者之间创建临时对。

于 2016-01-07T23:54:41.830 回答