C++11实现tuple除最后一个元素外其余对应元素取最小值的方法
C++11 实现方案
我们只需对原有代码的索引生成逻辑和返回值构造规则做少量调整即可满足需求,完全兼容C++11标准,不需要引入额外标准库特性。
完整实现代码
#include <tuple> #include <algorithm> // for std::min // 保留原有自定义integer_sequence,适配C++11无标准实现的情况 template<typename T, T...> struct integer_sequence { }; template<std::size_t N, std::size_t... I> struct gen_indices : gen_indices<(N - 1), (N - 1), I...> { }; template<std::size_t... I> struct gen_indices<0, I...> : integer_sequence<std::size_t, I...> { }; template <typename ... T, std::size_t ... I> std::tuple<T...> min_tuple_impl( const std::tuple<T...>& t1, const std::tuple<T...>& t2, integer_sequence<std::size_t, I...>) { // 前N-1个元素取min,最后一个元素直接取t1的对应值 return { (std::min(std::get<I>(t1), std::get<I>(t2)))..., std::get<sizeof...(T)-1>(t1) }; } template <typename ... T> std::tuple<T...> min_tuple( const std::tuple<T...>& t1, const std::tuple<T...>& t2) { // 生成0到N-2的索引序列,覆盖除最后一个元素外的所有位置 return min_tuple_impl(t1, t2, gen_indices<sizeof...(T)-1>{}); }
改动说明
- 外层
min_tuple函数中,传入实现函数的索引序列长度从原有的tuple总元素数改为总元素数-1,仅覆盖除最后一个元素外的所有位置 - 内层
min_tuple_impl构造返回tuple时,先对索引序列覆盖的位置取两个tuple对应元素的最小值,最后追加第一个tuple的最后一个元素即可
兼容说明
当tuple仅有1个元素时,会直接返回第一个tuple的唯一元素,符合逻辑预期,不会出现编译错误。
效果验证
使用给出的测试用例运行:
std::tuple<int, int, int> t1 {10, 20, 30}; std::tuple<int, int, int> t2 {15, 15, 15}; // min_tuple(t1, t2) 运行结果为 {10, 15, 30},符合需求
内容的提问来源于stack exchange,提问作者fontanf
相关产品推荐
相关产品推荐

