初始化一个静态const std :: pair <string,vector <string>&gt;

时间:2015-08-03 14:24:20

标签: c++ initialization stdvector composite std-pair

我有一个

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

在类定义中,使用单个字符串到其他几个字符串的映射。我正在使用vector&lt;&gt;而不是数组,以便能够添加映射对和映射长度,而不必同时保持大小变量。有没有办法在相应的.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>>>? 谢谢。

2 个答案:

答案 0 :(得分:6)

一如既往地简单 - 只是逻辑地将每个实体与其初始化列表嵌套并使用隐式转换。例如,我已经使用了你的代码并做了这个例子:

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 - std::pair,还需要{FIRST, SECOND}。结果是{{FIRST, SECOND}}。 ..等等。
  3. 所以,想象一下:

    std::vector<std::pair<std::string, std::vector<std::string>>>
         ^      ^         ^            ^           ^        ^
         |      |         |            |           |        |
    
         {      {         "abc"        {           "abc", "def"  }  }   }
    
         |      |                      |                         |  |   |
         |      |                      |--------vector-----------|  |   |
         |      |--------------------------pair---------------------|   |
         |---------------------------vector-----------------------------|
    

答案 1 :(得分:1)

您需要嵌套初始化

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