Инициализировать карту с парой 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));
так что вы не создаете временные пары между ними.