std:: map emplace без копирования значения
C++11 std::map<K,V>
тип имеет , как и многие другие контейнеры.
std::map<int,std::string> m;
std::string val {"hello"};
m.emplace(1, val);
этот код работает как рекламируется, установке std::pair<K,V>
непосредственно, однако это приводит к копии key
и val
происходит.
можно ли разместить тип значения непосредственно на карте? Можем ли мы сделать лучше, чем перемещение аргументов в вызове emplace
?
вот более подробный пример:
struct Foo
{
Foo(double d, string s) {}
Foo(const Foo&) = delete;
Foo(Foo&&) = delete;
}
map<int,Foo> m;
m.emplace(1, 2.3, string("hello")); // invalid
2 ответов
аргументы, которые вы передаете map::emplace
перенаправить в конструктор map::value_type
, которая составляет pair<const Key, Value>
. Таким образом, вы можете использовать кусочно-строительный конструктор of std::pair
чтобы избежать промежуточных копий и движется.
std::map<int, Foo> m;
m.emplace(std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2.3, "hello"));
В C++17 это может быть более легко достигнуто с помощью try_emplace
метод.
map<int,Foo> m;
m.try_emplace(1, 2.3, "hello");
это дополнение к стандартной библиотеке было описано в бумага N4279 и уже должны поддерживаться в Visual Studio 2015, GCC 6.1 и LLVM 3.7 (библиотека libc++).