2013-11-26 1 views

ответ

11

Вы можете сделать это:

std::map<std::string, int> mymap = {{"one", 1}, {"two", 2}, {"three", 3}}; 
+4

Почему у говорить с самими собой? – aaronman

+6

Я не мог найти ответ на SO, поэтому добавил его, чтобы сохранить других программистов некоторое время. SO действительно поощряет это: http://stackoverflow.com/help/self-answer – abw333

+0

@ abw333, возможно, это не для мелочей «look-up-up» вопросов стиля ссылок ... Представьте себе «Как добавить два номера в JQuery »(интересно: [Добавление чисел в JQuery] (http://stackoverflow.com/questions/16117985/adding-numbers-in-jquery) :) – sehe

21

Вы действительно можете это сделать:

std::map<std::string, int> mymap = {{"one", 1}, {"two", 2}, {"three", 3}}; 

Что на самом деле происходит вот что std::map хранит std::pair из основных типов значений, в данном случае std::pair<const std::string,int> , Это возможно только благодаря синтаксису новой унифицированной инициализации C++ 11, который в этом случае вызывает перегрузку конструктора std::pair<const std::string,int>. В этом случае std::map имеет конструктор с std::intializer_list, который отвечает за внешние фигурные скобки.

Так в отличие от Питона любого класса, который вы создаете, может использовать этот синтаксис для инициализации себя до тех пор, как вы создать конструктор, который принимает список инициализации (или равномерная синтаксис инициализации применима)

+0

Фактически 'std :: pair '. Но они берут одинаковые инициализаторы. – aschepler

+0

@aschepler хорошая точка исправлена, я думаю, что ключ всегда задан для определения константы – aaronman

+0

Я не думаю, что это точно. '{" one ", 1}' равномерная инициализация (потенциально даже _агрегация инициализации_, если std :: pair фактически POD). Только внешний '{}' - это список инициализаторов. Он все еще _works_ из-за равномерной инициализации (в противном случае 'mymap ({{a, b}, {c, d}})' было бы обязательным) – sehe