初始化一个静态常量 std::pair<string,vector<string>>

initialize a static const std::pair<string,vector<string>>

我有一个

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

在 class 定义中,使用单个字符串到其他几个字符串的映射。我使用 vector<> 而不是数组,以便能够添加映射对和映射长度,而不必同时维护大小变量。有没有办法像非复合类型的vector一样在对应的.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>>> ? 谢谢。

一如既往的简单 - 只需在逻辑上将每个实体与其初始值设定项列表嵌套并使用隐式转换。例如,我对您的代码进行了一些处理并制作了这个示例:

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"}}
};

就在您使用初始化列表编写初始化时,考虑模板中从左到右的每个实体:

  1. std::vector = 需要 {ELEM}。结果是 {ELEM}.
  2. std::vector 内部 - 一个 std::pair 也需要 {FIRST, SECOND}。结果是 {{FIRST, SECOND}}。 ..等等。

所以,想象一下:

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

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

     |      |                      |                         |  |   |
     |      |                      |--------vector-----------|  |   |
     |      |--------------------------pair---------------------|   |
     |---------------------------vector-----------------------------|

你需要嵌套初始化

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