用一对std::arrays c++11初始化映射

Initialize map with pair of std::arrays c++11

本文关键字:c++11 初始化 映射 arrays std      更新时间:2023-10-16

我想编译这几行。插入以映射std::数组对。

#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

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

所以不是:

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

do:

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

或:

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

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

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

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

这样就不会在两者之间创建临时配对。