Уменьшение детализации: вставка элементов в карту

Я знакомился с C ++ 11 в последнее время, и auto Ключевое слово отлично! Typing:

for (auto bar : bars) {

ну так удовлетворяет. Делает код читабельным и красивым. То, что все еще чувствует, что это останавливает весь ваш импульс, таково:

foo.insert(std::pair<std::string, bar>("soVerbose", baz));

// As opposed to simply:

foo.insert("soVerbose", baz);

Есть ли веская причина, почему это так? И есть ли какой-нибудь аккуратный способ сделать его менее многословным? Я знаю [] Оператор может использоваться для вставки элементов в карты, но функциональность немного отличается.

5

Решение

Использовать устанавливать функция:

#include <iostream>
#include <utility>

#include <map>

int main()
{
std::map<std::string, std::string> m;

// uses pair's copy-constructor
m.emplace(std::make_pair(std::string("a"), std::string("a")));

// uses pair's converting copy constructor
m.emplace(std::make_pair("b", "abcd"));

// uses pair's template constructor
m.emplace("d", "ddd");

// uses pair's piecewise constructor
m.emplace(std::piecewise_construct,
std::forward_as_tuple("c"),
std::forward_as_tuple(10, 'c'));

for (const auto &p : m) {
std::cout << p.first << " => " << p.second << '\n';
}
}
14

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

Ты можешь использовать std::make_pair() что делает его, по крайней мере, немного лучше:

foo.insert(std::make_pair("soVerbose", baz));

На самом деле, я не совсем уверен, должно ли это работать, но я думаю, что это (причина, по которой я не совсем уверен, что "soVerbose" можно вывести как char const[10] и тип char const[10] не копируется; это была ошибка, по крайней мере, в какой-то реализации в какой-то момент). Я пока не использую C ++ 11, но я считать Вы также можете использовать

foo.insert({ "notSoVerbose", baz });

(код, безусловно, компилируется с НКУ а также лязг).

Я вижу, что другие уже упоминали об этом, но на самом деле, вы бы действительно использовали:

foo.emplace("pretty cool", baz);
10

Вы можете использовать make_pair, он будет выводить типы элементов пары, без необходимости указывать их так подробно:

foo.insert(std::make_pair("soVerbose", baz));

Но также, если вы используете C ++ 11 (например, новейшую визуальную студию), вы должны предпочесть использовать emplace:

foo.emplace("soVerbose", baz);
5

Для уменьшения многословия напишите

foo.emplace("soVerbose", baz);
0
По вопросам рекламы [email protected]