2015-08-03 8 views
-1

У меня естьинициализировать статическую константную зЬй :: пару <строки, вектор <string>>

class myclass 
{ 
    // ... 
    static const vector<pair<string,vector<string>>> var; 
    // ... 
}; 

в определении класса, чтобы использовать сопоставление отдельных строк для нескольких других. Я использую вектор <> вместо массивов, чтобы иметь возможность добавлять пары сопоставления и длины отображения, не требуя также перераспределять переменные размера. Есть ли способ, чтобы инициализировать переменную в соответствующем файле .cpp, как вектора, не составного типа, то есть, в формате:

const vector<pair<string,vector<string>>> myclass :: var = 
{ 
    ??? 
} 

или я должен использовать статический метод, как

static myclass::initStaticMembers(){...} 

Если есть способ сделать это с первого взгляда, что такое синтаксис? Я искал, но не нашел синтаксиса для выполнения сложной инициализации std :: pair. Например, вы можете инициализировать vector<string> с

vector <string>myvec={"elem1", "elem2","elem3"}; 

но как инициализировать сложный vector<pair<string,vector<string>>>? Спасибо.

+0

Это было предложено много раз. y u нет поиска? –

+0

Да, есть. Почему бы вам не использовать его тогда? – edmz

+0

Возможный дубликат [C++ где инициализировать статический const] (http://stackoverflow.com/questions/2605520/c-where-to-initialize-static-const) –

ответ

4

Простой, как всегда - просто логически вставлять каждую сущность с ее инициализационным списком и с использованием неявных преобразований. Например, я работал с вашим кодом немного и сделал этот пример:

class A { 
    static const std::vector<std::pair<std::string, std::vector<std::string>>> var; 
}; 

const std::vector<std::pair<std::string, std::vector<std::string>>> A::var = { 
    {"abc", {"def", "ghj"}} 
}; 

Просто, когда вы пишете инициализацию с initiliazer списков думать о каждой сущности слева направо в шаблоне:

  1. std::vector = нуждается в {ELEM}. Результат: {ELEM}.
  2. Внутри std::vector - a std::pair, которому также необходимо {FIRST, SECOND}. Результат: {{FIRST, SECOND}}. .. и т.д..

Итак, представьте себе это так:

std::vector<std::pair<std::string, std::vector<std::string>>> 
    ^ ^  ^  ^  ^ ^
    |  |   |   |   |  | 

    {  {   "abc"  {   "abc", "def" } } } 

    |  |      |       | | | 
    |  |      |--------vector-----------| | | 
    |  |--------------------------pair---------------------| | 
    |---------------------------vector-----------------------------| 
+0

Спасибо, Виктор, именно то, что мне нужно. – npit

0

Вы должны гнездиться на инициализацию

const std::vector<std::pair<std::string,std::vector<std::string>>> Foo::var = 
{ // start of vector 
    { "pair1", {"one", "two"}}, 
    { "pair2", {"three", "four"}}, 
    { "pair3", {"five", "six"}} 
};// end of vector 

Тогда вы могли бы сделать что-то вроде:

class Foo // this would be in the .h file 
{ 
public: 
    static const std::vector<std::pair<std::string,std::vector<std::string>>> var; 
}; 

// this part would be in the .cpp file 
const std::vector<std::pair<std::string,std::vector<std::string>>> Foo::var = 
{ // start of vector 
    { "pair1", {"one", "two"}}, 
    { "pair2", {"three", "four"}}, 
    { "pair3", {"five", "six"}} 
};// end of vector 

int main() 
{ 
    for (const auto & p : Foo::var) 
    { 
     std::cout << p.first << "\t"; 
     for (const auto & e : p.second) 
     { 
      std::cout << e << "\t"; 
     } 
     std::cout << std::endl; 
    } 
    return 0; 
} 

Выход:

pair1 one two 
pair2 three four  
pair3 five six 

Live Example