有没有办法简单地连接多个向量
Is there a way to concatenate multiple vectors simply?
目前有一些方法可以将两个向量与一个函数连接或合并。
但是,似乎没有办法用一个函数连接或合并三个以上的向量。
例如
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);
如果没有,似乎这可以通过使用可变参数模板来实现。
但是,我无法想象如何通过可变参数模板实现它。
有什么解决办法吗?
如果可以使用范围 v3,则只需执行以下操作:
std::vector<std::string> allVec = ranges::view::concat(a, b, c, d);
在此处查看演示。
您可以将其用于任何矢量类型。
这是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)});
现场演示
相关文章:
- 用于连接向量的 Constexpr 函数
- C++将两个不同类型的向量的属性连接到新的向量中
- 以零字节作为定界符/终端的字节加入(连接)字符串向量
- 交叉连接 2 个向量的元素以产生第三个
- C++线程的向量在连接时随机崩溃
- 将两个向量与另一个向量连接起来
- 有没有办法像python:np.concatenate([x,y,z],axis=1)中那样沿着列连接三个二维向量C++
- Swig - 结构的 c++ 向量以及如何连接它们
- <T> 在使用运算符+ 连接两个向量之前从类型向量中删除索引
- 有没有办法简单地连接多个向量
- 尝试保存到成员向量的连接-一次只保存一个
- 如何连接/合并向量
- 如何使用 boost 连接 c++ 中的字符串向量
- std::bad_alloc连接两个向量时
- 如何连接向量的两个元素
- 对百万或十亿个 STL 向量进行排序和连接的最快方法
- 在转换一个向量的元素时,连接两个向量的最佳方式是什么
- 如何连接多个std::向量
- 将带有时间戳的向量整数连接为C++中的字符串
- 在c++中不使用STL或向量连接两个字符串数组