Инициализировать карту с парой std::arrays C++11

Я хотел бы скомпилировать эти строки. Вставить на карту пару 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

2 ответа

Решение

std::map::insert имеет различные перегрузки, но не принимает два аргумента типов, как в вашем коде. Наиболее близким к вашему использованию является тот, который принимает const value_type& где value_type псевдоним pair<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));

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

так что вы не создаете временные пары между ними.

Другие вопросы по тегам