使用带有可变参数的vector::insert
Use vector::insert with varidic arguments
我想使用带有可变参数的模板函数将多个向量组合为一个。我有一个问题与三个或更多的向量,下面我当前的代码:
#include <iostream>
#include <vector>
#include <numeric>
template<typename _Ty, typename ..._Args>
std::vector<_Ty> combine(const std::vector<_Ty> &a, const _Args &...args) {
// Determine size of new vector
std::vector<std::size_t> sizes = { a.size(), args.size()... };
std::size_t size = std::accumulate(sizes.begin(), sizes.end(), 0);
// Create vector with new size
std::vector<_Ty> result(size);
// Insert all vectors into this one
result.insert(a.begin(), a.end(), result.end());
result.insert(result.end(), args.begin()..., args.end()...);
return result;
}
int main(int argc, char *argv[], char *envp[]) {
std::vector<int> a = { 0, 1, 2, 3, 4 };
std::vector<int> b = { 4, 3, 2, 1, 0 };
std::vector<int> c = { 1, 1, 1, 1 };
std::cout << combine(a, b).size() << std::endl;
std::cout << combine(a, b, c).size() << std::endl; // <-- Does not compile
std::cin.ignore();
return 0;
}
所以确切的问题是combine(a, b, c)不能编译。我知道为什么。因为这一行:
result.insert(result.end(), args.begin()..., args.end()...);
编译为:
result.insert(result.end(), b.begin(), c.begin(), b.end(), c.end());
但是我不知道如何调用result。使用可变参数插入,以便编译为:
result.insert(result.end(), b.begin(), b.end());
result.insert(result.end(), c.begin(), c.end());
一种可能是:
std::vector<std::vector<_Ty> all = { a, args...};
for (const auto &vec : all) {
result.insert(vec.begin(), vec.end());
}
但是这需要所有向量....的第二个副本任何想法?谢谢你!
标准的技巧是使用类似于expander的东西:
template<typename _Ty, typename ..._Args>
std::vector<_Ty> combine(std::vector<_Ty> a, const _Args &...args)
// ^^^^^^^^^^^^^^^^^^ by-value
{
using expander = int[];
expander{0,
(void(a.insert(a.end(), args.begin(), args.end())), 0)...
};
return a;
}
旁注,_Ty
和_Args
为保留名
相关文章:
- std::vector 没有重载函数的实例与参数列表匹配
- 将可变参数模板类存储到 std::vector 中
- 是否可以将具有不同签名的 lambda 存储在 std::vector 中并在函数中执行它们(使用各自的参数)?
- C++如何在类Vector中显示不同类型的参数
- 以 Eigen::Vector 作为参数
- 将双指针作为参数传递给需要引用 std::vector <double>的函数
- STL vector.insert 方法期望_InputIterator作为参数
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- pybind11:如何包装以 std::vector<double> 为参数以避免数据复制的 C++ 函数
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 使用 std::vector<Particle> 粒子;函数 .at() 不能与迭代器一起使用,它作为 for 循环中的参数
- 如何使用 std::vector 作为参数调用 Fortran 77 C++函数?
- 在 C++ 中使用 vector 传递任意数量的参数
- 如何有效地传递 std::vector<cv::P oint3f> 的子向量作为参数(不拥有函数)
- 错误:参数太少,无法函数"int Solution(std::vector<int>, int)"
- "vector<string>"作为函数参数传递,我得到一个错误
- 如何从 std::vector 转换为参数
- 如何在没有参数列表的情况下定义向量无效使用模板名称 std::vector
- 函数的可选std::vector参数