在向量<vector <t>&gt;?</vector <t>的初始化中合并向量和初始化列表

时间:2014-06-08 02:40:24

标签: c++ c++11 vector initializer-list

假设我正在初始化vector<vector<string>>,如此:

vector<vector<string>> v;
v = {{
    {"a", "b", "c"},
    {"aa", "bb"},
    {"xyz", "yzx", "zxy"},
    {}
}};

现在假设我想将已存在的vector<string>附加到某些v的元素中。像这样:

vector<string> suffix {{"1", "2", "3"}};
vector<vector<string>> v;
v = {{
    {"a", "b", "c"} + suffix,
    {"aa", "bb"},
    {"xyz", "yzx", "zxy"} + suffix,
    {}
}};

这种语法显然不起作用,因为operator+没有以这种方式定义。

我理解第一种方式构建v然后编写

是可能的
vector<int> indices = {0, 2};
for(int i: indices)
   v[i].insert(v[i].end(), suffix.begin(), suffix.end());

但这不方便,因为我可能有几个suffix向量附加到任意v[i]。我希望suffixv[i]的初始化一起使用,所以它是有道理的,如果我在v的初始化中添加/删除元素,我不必转移索引。

1 个答案:

答案 0 :(得分:4)

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

vector<string> appendStrings(vector<string>&& s1, vector<string> const& s2)
{
   s1.insert(s1.end(), s2.begin(), s2.end());
   return s1;
}

并用它来初始化变量。

vector<string> suffix {{"1", "2", "3"}};
vector<vector<string>> v = {{
    appendStrings({"a", "b", "c"}, suffix),
    {"aa", "bb"},
    appendStrings({"xyz", "yzx", "zxy"}, suffix),
    {}
}};

<强>更新

更有效地实施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;
}