Могу ли я размещать объекты для карты объектов или просто пары?

Я использую C ++ 11 и gcc-4.7.0. Я ищу решение STL.

Я хотел бы иметь несортированную мультикарту, которая содержит объекты myClass с короткими строками в качестве ключей. Emplace выглядит как хороший способ поместить объекты в карту, когда я их создаю, но я не уверен, сможет ли он это сделать, или он создаст только пару ключ / объект.
Это должно быть действительно:

table.emplace(myKey, myClass(arg1, arg2, arg3));

Но будет ли эффективнее сделать следующее, и действительно ли это правильный код?

table.emplace(myKey, arg1, arg2, arg3);

4

Решение

В соответствии с этот, 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 вопрос.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]