Независимо от того, как умный C ++ получает, он все равно должен соблюдать правила языка и интерфейсы publi c. std::map
имеет члена emplace
. Вы должны использовать это.
Проблема в том, что нет способа построить вектор, перемещая в него элементы (из-за того, как устроен std::initializer_list
- не заводите меня)
Если вас это не волнует, и вы можете принять копирование элементов в вектор, то все, что вам нужно сделать, это:
auto test()
{
using namespace std::string_literals;
std::map<std::string, std::vector<std::string>> my_collection;
my_collection.emplace("key"s, std::vector{"MyValue"s});
}
Вышеуказанное скопирует "MyValue"s
в вектор, затем переместит ключ и вектор на карту.
Однако, если вам нужны перемещения или если у вас есть типы только для перемещения, тогда есть дополнительная работа.
Поэтому я создаю небольшую служебную функцию, которая выполняет что: создает вектор, перемещая переданные ему значения:
template <class... Args>
auto make_vector(Args&&... args)
{
using T = std::remove_reference_t<std::common_type_t<Args...>>;
static_assert((... && std::is_same_v<T, std::remove_reference_t<Args>>));
auto v = std::vector<T>{};
v.reserve(sizeof...(Args));
(..., v.emplace_back(std::forward<Args>(args)));
return v;
}
auto test()
{
using namespace std::string_literals;
std::map<std::string, std::vector<std::string>> my_collection;
my_collection.emplace("key", make_vector("MyValue"s));
}