c++ 有没有一种方法可以简单地连接多个向量?

cgh8pdjw  于 2024-01-09  发布在  其他
关注(0)|答案(4)|浏览(191)

当前存在用一个函数连接或合并两个向量的方式。
但是,似乎没有办法将三个以上的向量与一个函数连接或合并。
比如说,

  1. vector<string> a = {"a", "b"};
  2. vector<string> b = {"c", "d"};
  3. vector<string> c = {"e", "f"};
  4. vector<string> d = {"g", "h"};
  5. // newVector has to include {"a", "b", "c", "d", "e", "f", "g", "h"}
  6. vector<string> newVector = function(a, b, c, d);

字符串
如果没有,则似乎可以通过使用variadic template来实现。
但是,我无法想象它是如何通过variadic模板来实现的。
有什么解决的办法吗?

nhn9ugyo

nhn9ugyo1#

如果可以使用range v3,则只需执行以下操作:

  1. std::vector<std::string> allVec = ranges::view::concat(a, b, c, d);

字符串
请参见demo here
您可以将其用于任何向量类型。

70gysomp

70gysomp2#

以下是variadic templates的解决方案

  1. template<typename T, typename ...Args>
  2. void appendVector(vector<T>& v1, vector<T>& v2, Args... args)
  3. {
  4. v1.insert(v1.end(), v2.begin(), v2.end());
  5. appendVector(v1, args...);
  6. }
  7. template<typename T>
  8. void appendVector(vector<T>& v1, vector<T>& v2)
  9. {
  10. v1.insert(v1.end(), v2.begin(), v2.end());
  11. }

字符串
你只需要添加你的向量:

  1. vector<string> newVector;
  2. newVector.reserve(a.size()+b.size()+c.size()+d.size());
  3. appendVector(newVector, a, b, c, d);

展开查看全部
svmlkihl

svmlkihl3#

试试这样的东西:

  1. template<typename T>
  2. std::vector<T> merge(std::initializer_list<std::vector<T>*> vecs)
  3. {
  4. size_t size = 0;
  5. for(auto v : vecs) { size += v->size(); }
  6. std::vector<T> ret;
  7. ret.reserve(size);
  8. for(auto v : vecs) { ret.insert(ret.end(), v->begin(), v->end()); }
  9. return ret;
  10. }

字符串

  1. std::vector<std::string> a = {"a", "b"};
  2. std::vector<std::string> b = {"c", "d"};
  3. std::vector<std::string> c = {"e", "f"};
  4. std::vector<std::string> d = {"g", "h"};
  5. std::vector<std::string> newVector = merge({&a, &b, &c, &d});


Live Demo
或者:

  1. template<typename T>
  2. std::vector<T> merge(std::initializer_list<std::reference_wrapper<const std::vector<T>>> vecs)
  3. {
  4. size_t size = 0;
  5. for(auto &v : vecs) { size += v.get().size(); }
  6. std::vector<T> ret;
  7. ret.reserve(size);
  8. for(auto &v : vecs) { ret.insert(ret.end(), v.get().begin(), v.get().end()); }
  9. return ret;
  10. }

  1. std::vector<std::string> a = {"a", "b"};
  2. std::vector<std::string> b = {"c", "d"};
  3. std::vector<std::string> c = {"e", "f"};
  4. std::vector<std::string> d = {"g", "h"};
  5. std::vector<std::string> newVector = merge({std::cref(a), std::cref(b), std::cref(c), std::cref(d)});


Live Demo

展开查看全部
uidvcgyl

uidvcgyl4#

另一个可能的解决方案。@miradham. reserve提出的解决方案的变体是自动化的,它将任何标准容器连接到一个std::vector中。

  1. template<typename T, typename ...Args>
  2. std::vector<T> concat(Args... args)
  3. {
  4. std::vector<T> v;
  5. v.reserve((args.size() + ...));
  6. (v.insert(v.end(), args.begin(), args.end()),...);
  7. return v;
  8. }

字符串

相关问题