gpt4 book ai didi

c++ - 将 vector::insert 与可变参数一起使用

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:01 25 4
gpt4 key购买 nike

我想使用带有可变参数的模板函数将多个 vector 合并为一个 vector 。我在当前代码下方遇到三个或更多 vector 的问题:

#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.insert,以便它编译为:

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());
}

但是这需要所有 vector 的第二个拷贝……有什么想法吗?谢谢!

最佳答案

标准技巧是只使用扩展器之类的东西:

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 是保留名称。

关于c++ - 将 vector::insert 与可变参数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32141080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com