尝试这样做:
````
试试这个方法:
````
template<typename T>
std::vector<T> merge(std::initializer_list<std::vector<T>*> vecs)
{
size_t size = 0;
for(auto v : vecs) { size += v->size(); }
std::vector<T> ret;
ret.reserve(size);
for(auto v : vecs) { ret.insert(ret.end(), v->begin(), v->end()); }
return ret;
}
std::vector<std::string> a = {"a", "b"};
std::vector<std::string> b = {"c", "d"};
std::vector<std::string> c = {"e", "f"};
std::vector<std::string> d = {"g", "h"};
std::vector<std::string> newVector = merge({&a, &b, &c, &d});
实时演示
或者:
template<typename T>
std::vector<T> merge(std::initializer_list<std::reference_wrapper<const std::vector<T>>> vecs)
{
size_t size = 0;
for(auto &v : vecs) { size += v.get().size(); }
std::vector<T> ret;
ret.reserve(size);
for(auto &v : vecs) { ret.insert(ret.end(), v.get().begin(), v.get().end()); }
return ret;
}
std::vector<std::string> a = {"a", "b"};
std::vector<std::string> b = {"c", "d"};
std::vector<std::string> c = {"e", "f"};
std::vector<std::string> d = {"g", "h"};
std::vector<std::string> newVector = merge({std::cref(a), std::cref(b), std::cref(c), std::cref(d)});
实时演示
for (auto v : { a, b, c, d }) { newVector.insert(newVector.end(), v.begin(), v.end()); }
吗?这只有3行代码,而且很清楚地说明了正在发生的事情。 - Tas{a, b, c, d}
需要注意的一点是它会复制a
、b
等。你可以使用{&a, &b, &c, &d}
来避免这个问题。请参考我的答案,其中包含一个函数化的示例。 - Remy Lebeau