在vector <vector <T >>的初始化中合并vector和initializer_list?

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初始化添加/删除元素,我不必转移索引.

R S*_*ahu 4

一种可能的解决方案是使用执行附加操作的辅助函数。

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)