2016-04-08 2 views
2

У меня есть следующий:Как я могу инициализировать std :: vector элементов std :: map?

#include <vector> 
#include <map> 
#include <string> 

int main() { 
    std::vector<std::map<std::string, double>> data = {{"close", 14.4}, {"close", 15.6}}; 

    return 0; 
} 

И когда я пытаюсь скомпилировать, я получаю следующее сообщение об ошибке:

g++ -std=c++11 -Wall -pedantic ./test.cpp

./test.cpp:6:49: error: no matching constructor for initialization of 'std::vector >' (aka 'vector, allocator >, double> >') std::vector> data = {{"close", 14.4}, {"close", 15.6}};

+3

Попробуйте представить std :: map как список std :: pairs, попробуйте следующее: {{{"close", 14.4}}, {{"close", 15.6}}} '. Вектор из 2 карт, каждый с 1 парой. – Chad

+1

@ Ответы на вопросы принадлежат в поле ответа, а не как комментарии. – Barry

+0

@Barry Полностью сформированные ответы принадлежат в поле ответа. Мне не хотелось писать хороший ответ, поэтому я написал комментарий. – Chad

ответ

5

Вам нужна дополнительная пара скобок для каждого элемента/паров:

std::vector<std::map<std::string, double>> data = {{{"close", 14.4}}, {{"close", 15.6}}}; 
                ^   ^^   ^

Дополнительная пара фигурных скобок необходима потому, что std::map элементы имеют тип std::pair<const key_type, value_type> в вашем случае std::pair<const std::string, double>. Таким образом, вам нужна дополнительная пара фигурных скобок для обозначения компилятору инициализации элементов std::pair.

4

Используйте 3 брекет вместо 2.

std::vector<std::map<std::string, double>> data = {{{"close", 14.4}}, {{"close", 15.6}}}; 

Сво чад сказал.

Смежные вопросы