gpt4 book ai didi

C++11 可变参数模板 : return tuple from variable list of vectors

转载 作者:IT老高 更新时间:2023-10-28 22:34:49 27 4
gpt4 key购买 nike

我想写一些类似于 python zip (http://docs.python.org/2/library/functions.html) 的东西。zip 应该接受可变数量的不同类型的 vector ,并返回一个 vector 元组,截断到最短输入的长度。

例如

x = [1, 2, 3]
v = ['a', 'b']

我希望输出是一个 vector [ <1, 'a'>, <2, 'b'>]

如何在 C++11 中做到这一点?

最佳答案

急切地做到这一点并且只通过复制非常容易:

#include <vector>
#include <tuple>
#include <algorithm>

template<class... Ts>
std::vector<std::tuple<Ts...>> zip(std::vector<Ts> const&... vs){
auto lo = std::min({vs.size()...});
std::vector<std::tuple<Ts...>> v;
v.reserve(lo);
for(unsigned i = 0; i < lo; ++i)
v.emplace_back(vs[i]...);
return v;
}

Live example.

有了完美的转发和允许移出 vector ,它变得有点复杂,主要是由于助手:

#include <vector>
#include <tuple>
#include <algorithm>
#include <type_traits>

template<class T>
using Invoke = typename T::type;

template<class T>
using Unqualified = Invoke<std::remove_cv<Invoke<std::remove_reference<T>>>>;

template<class T>
using ValueType = typename Unqualified<T>::value_type;

template<class T>
T const& forward_index(std::vector<T> const& v, unsigned i){
return v[i];
}

template<class T>
T&& forward_index(std::vector<T>&& v, unsigned i){
return std::move(v[i]);
}

template<class... Vs>
std::vector<std::tuple<ValueType<Vs>...>> zip(Vs&&... vs){
auto lo = std::min({vs.size()...});
std::vector<std::tuple<ValueType<Vs>...>> v;
v.reserve(lo);
for(unsigned i = 0; i < lo; ++i)
v.emplace_back(forward_index(std::forward<Vs>(vs), i)...);
return v;
}

Live example.

关于C++11 可变参数模板 : return tuple from variable list of vectors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17156998/

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