我有一个
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>>>
?
谢谢。
答案 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列表编写初始化时,请考虑模板中从左到右的每个实体:
std::vector
=需要{ELEM}
。结果为{ELEM}
。std::vector
- std::pair
,还需要{FIRST, SECOND}
。结果是{{FIRST, SECOND}}
。
..等等。所以,想象一下:
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