Два способа emplacing:устанавливать (станд :: ход (ключ), станд :: ход (значение)) против (станд устанавливать :: make_pair (ключ, значение))
std::unordered_map<std::string, std::string> m;
Первое: перемещаемый устанавливать ключ и значение
// 1.
{
std::string k1 = "key1";
std::string v1 = "value1";
m.emplace(std::move(k1), std::move(v1));
}
Второе: с парой устанавливать сделал мой std::make_pair
:
// 2.
{
std::string k2 = "key2";
std::string v2 = "value2";
m.emplace(std::make_pair(k2, v2));
}
Что лучше (это означает более высокую скорость эффективной)?
Обратите внимание, что 2. приблизительно эквивалентно 'm.insert (std :: make_pair (k2, v2));' как 'insert' перегружается, чтобы принять ссылку r-value. –
Они семантически разные. Первый может оставить недопустимыми 'k1' и' k2'. Вы не должны полагаться на свои значения после 'std :: move'. Во-вторых, они оставят их действительными, так как они являются lvalues и аргументами типа 'std :: make_pair' будет разрешено' std :: string & '. Причина в том, что 'std :: make_pair' принимает так называемые [универсальные ссылки] (https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers), то есть ссылки rvalue в контекст вывода типа. – Sergey
Я думаю, что строки «k1' и' v1 »перемещены или нет - это отвлечение от того, что в противном случае было бы хорошим вопросом. В обоих случаях вы можете переместить строки или нет (и с помощью SSO это будет иметь мало значения для производительности). Я думаю, что было бы лучше сравнивать подобное. –