Я знакомился с 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);
Есть ли веская причина, почему это так? И есть ли какой-нибудь аккуратный способ сделать его менее многословным? Я знаю []
Оператор может использоваться для вставки элементов в карты, но функциональность немного отличается.
Использовать устанавливать функция:
#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';
}
}
Ты можешь использовать 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);
Вы можете использовать make_pair, он будет выводить типы элементов пары, без необходимости указывать их так подробно:
foo.insert(std::make_pair("soVerbose", baz));
Но также, если вы используете C ++ 11 (например, новейшую визуальную студию), вы должны предпочесть использовать emplace:
foo.emplace("soVerbose", baz);
Для уменьшения многословия напишите
foo.emplace("soVerbose", baz);