jca*_*cai 7 c++ vector initializer-list c++11
说我初始化vector<vector<string>>就像这样:
vector<vector<string>> v;
v = {{
{"a", "b", "c"},
{"aa", "bb"},
{"xyz", "yzx", "zxy"},
{}
}};
Run Code Online (Sandbox Code Playgroud)
现在假设我想将已经存在的东西附加vector<string>到某些v元素中.像这样:
vector<string> suffix {{"1", "2", "3"}};
vector<vector<string>> v;
v = {{
{"a", "b", "c"} + suffix,
{"aa", "bb"},
{"xyz", "yzx", "zxy"} + suffix,
{}
}};
Run Code Online (Sandbox Code Playgroud)
该语法显然不起作用,因为operator+没有以这种方式定义.
我知道可以构建v第一种方式然后编写
vector<int> indices = {0, 2};
for(int i: indices)
v[i].insert(v[i].end(), suffix.begin(), suffix.end());
Run Code Online (Sandbox Code Playgroud)
但这不方便,因为我可能有几个suffix附加到任意的向量v[i].我希望它suffix与初始化一起,v[i]所以它是有道理的,如果我从v初始化添加/删除元素,我不必转移索引.
一种可能的解决方案是使用执行附加操作的辅助函数。
vector<string> appendStrings(vector<string>&& s1, vector<string> const& s2)
{
s1.insert(s1.end(), s2.begin(), s2.end());
return s1;
}
Run Code Online (Sandbox Code Playgroud)
并用它来初始化变量。
vector<string> suffix {{"1", "2", "3"}};
vector<vector<string>> v = {{
appendStrings({"a", "b", "c"}, suffix),
{"aa", "bb"},
appendStrings({"xyz", "yzx", "zxy"}, suffix),
{}
}};
Run Code Online (Sandbox Code Playgroud)
更新
更有效的实现appendStrings(感谢@Yakk):
vector<string> appendStrings(initializer_list<char const*>&& s1,
vector<string> const& s2)
{
vector<string> ret.
ret.reserve(s1.size() + s2.size());
for (auto item : s1 ) {
ret.emplace_back(item);
}
ret.insert(ret.end(), s2.begin(), s2.end() );
return ret;
}
Run Code Online (Sandbox Code Playgroud)