目前存在使用一个函数连接或合并两个向量的方法。
但是,似乎没有办法用一个函数连接或合并三个以上的向量。
例如,
vector<string> a = {"a", "b"};
vector<string> b = {"c", "d"};
vector<string> c = {"e", "f"};
vector<string> d = {"g", "h"};
// newVector has to include {"a", "b", "c", "d", "e", "f", "g", "h"}
vector<string> newVector = function(a, b, c, d);
如果没有的话,似乎可以使用variadic template来实现。
但是,我无法想象它是如何通过可变模板来实现的。
有什么解决办法吗?
这是解决方案
variadic templates
template<typename T, typename ...Args>
void appendVector(vector<T>& v1, vector<T>& v2, Args... args)
{
v1.insert(v1.end(), v2.begin(), v2.end());
appendVector(v1, args...);
}
template<typename T>
void appendVector(vector<T>& v1, vector<T>& v2)
{
v1.insert(v1.end(), v2.begin(), v2.end());
}
你只需要附加你的向量:
vector<string> newVector;
newVector.reserve(a.size()+b.size()+c.size()+d.size());
appendVector(newVector, a, b, c, d);
尝试这样的事情:
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)});
又一个可能的解决方案。 @miradham 提出的解决方案的变体。 Reserve 是自动化的,它将任何标准容器连接到 std::vector 中。
template<typename T, typename ...Args>
std::vector<T> concat(Args... args)
{
std::vector<T> v;
v.reserve((args.size() + ...));
(v.insert(v.end(), args.begin(), args.end()),...);
return v;
}