Я использую C ++ 11 и gcc-4.7.0. Я ищу решение STL.
Я хотел бы иметь несортированную мультикарту, которая содержит объекты myClass с короткими строками в качестве ключей. Emplace выглядит как хороший способ поместить объекты в карту, когда я их создаю, но я не уверен, сможет ли он это сделать, или он создаст только пару ключ / объект.
Это должно быть действительно:
table.emplace(myKey, myClass(arg1, arg2, arg3));
Но будет ли эффективнее сделать следующее, и действительно ли это правильный код?
table.emplace(myKey, arg1, arg2, arg3);
В соответствии с этот, gcc-4.7
не полностью поддерживает emplace()
,
gcc-4.8
будет иметь полную поддержку emplace()
, но потребуется немного другой синтаксис:
table.emplace(std::piecewise_construct, std::forward_as_tuple(myKey), std::forward_as_tuple(arg1, arg2, arg3));
вместо
table.emplace(myKey, arg1, arg2, arg3); // Does not work.
За forward
чтобы получить эффект для rvalue, можно использовать std::move()
обернуть вокруг аргументы.
Таким образом, он будет напрямую создавать ключ и значение на месте в контейнере.
std::piecewise_construct
является аргумент для специального использования std::pair
конструктор. Он попросит конструктор направить аргументы индивидуально нижележащему конструктору.
Это на самом деле проблема emplace()
для ассоциативных контейнеров. Первоначальное намерение состоит в том, чтобы использовать первый аргумент для ключа и следующие аргументы для значения, как описано в вопросе. Увидеть этот для более подробной информации по этому вопросу.
Спасибо Zeta, за указание forward
вопрос.
Других решений пока нет …