c++11 标准模板(STL)(std::tuple)(八)

定义于头文件 <tuple>

template< class... Types >
class tuple;

(C++11 起)

类模板 std::tuple 是固定大小的异类值汇集。它是 std::pair 的推广。

若 (std::is_trivially_destructible_v<Types> && ...) 为 true ,则 tuple 的析构函数是平凡的。

(C++17 起)

模板形参

Types...-tuple 所存储的元素的类型。支持空列表。

按字典顺序比较 tuple 中的值

operator==,!=,<,<=,>,>=(std::tuple)
template< class... TTypes, class... UTypes >

bool operator==( const tuple<TTypes...>& lhs,

                 const tuple<UTypes...>& rhs );
(1)(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator==( const tuple<TTypes...>& lhs,

                           const tuple<UTypes...>& rhs );
(1)(C++14 起)
template< class... TTypes, class... UTypes >

bool operator!=( const tuple<TTypes...>& lhs,

                 const tuple<UTypes...>& rhs );
(2)(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator!=( const tuple<TTypes...>& lhs,

                           const tuple<UTypes...>& rhs );
(2)(C++14 起)
template< class... TTypes, class... UTypes >

bool operator<( const tuple<TTypes...>& lhs,

                const tuple<UTypes...>& rhs );
(3)(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator<( const tuple<TTypes...>& lhs,

                          const tuple<UTypes...>& rhs );
(3)(C++14 起)
template< class... TTypes, class... UTypes >

bool operator<=( const tuple<TTypes...>& lhs,

                 const tuple<UTypes...>& rhs );
(4)(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator<=( const tuple<TTypes...>& lhs,

                           const tuple<UTypes...>& rhs );
(4)(C++14 起)
template< class... TTypes, class... UTypes >

bool operator>( const tuple<TTypes...>& lhs,

                const tuple<UTypes...>& rhs );
(5)(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator>( const tuple<TTypes...>& lhs,

                          const tuple<UTypes...>& rhs );
(5)(C++14 起)
template< class... TTypes, class... UTypes >

bool operator>=( const tuple<TTypes...>& lhs,

                 const tuple<UTypes...>& rhs );
(6)(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator>=( const tuple<TTypes...>& lhs,

                           const tuple<UTypes...>& rhs );
(6)(C++14 起)

1-2) 比较 tuple lhs 的每个元素和 tuple rhs 的对应元素。

3-6) 以字典序比较 lhsrhs ,即比较首元素,若相等则比较第二元素,若均相等则比较第三元素,以此类推。

所有比较运算符是短路的;它们在确定结果所必须的比较之外不访问 tuple 元素。

参数

lhs, rhs-要比较的 tuple

返回值

1) 若对于所有 [0, sizeof...(Types)) 中的 i 有 std::get<i>(lhs) == std::get<i>(rhs) 则为 true ,否则为 false 。对二个空 tuple 返回 true 。

2) !(lhs == rhs)

3) (bool)(std::get<0>(lhs) < std::get<0>(rhs)) || (!(bool)(std::get<0>(rhs) < std::get<0>(lhs)) && lhstail < rhstail) ,其中 lhstail 是无首元素的 lhs ,而 rhstail 是无首元素的 rhs 。对于二个空 tuple ,返回 false 。

4) !(rhs < lhs)

5) rhs < lhs

6) !(lhs < rhs)

调用示例

#include <tuple>
#include <iostream>
#include <string>
#include <typeinfo>
#include <stdexcept>
#include <iostream>
#include <iterator>
#include <vector>
#include <memory>
#include <set>
#include <map>

struct Cell
{
    int x;
    int y;

    Cell() = default;
    Cell(int a, int b): x(a), y(b) {}
    Cell(const Cell &cell)
    {
        x = cell.x;
        y = cell.y;
    }

    //std::tie 能用于引入字典序比较到结构体,或解包 tuple :
    bool operator ==(const Cell &cell) const
    {
        return std::tie(x, y) == std::tie(cell.x, cell.y);
    }

    bool operator !=(const Cell &cell) const
    {
        return std::tie(x, y) != std::tie(cell.x, cell.y);
    }

    bool operator <(const Cell &cell) const
    {
        return std::tie(x, y) < std::tie(cell.x, cell.y);
    }

    bool operator <=(const Cell &cell) const
    {
        return std::tie(x, y) <= std::tie(cell.x, cell.y);
    }

    bool operator >(const Cell &cell) const
    {
        return std::tie(x, y) > std::tie(cell.x, cell.y);
    }

    bool operator >=(const Cell &cell) const
    {
        return std::tie(x, y) >= std::tie(cell.x, cell.y);
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}

// 打印任何大小 tuple 的辅助函数
template<class Tuple, std::size_t N>
struct TuplePrinter
{
    static void print(const Tuple& t)
    {
        TuplePrinter < Tuple, N - 1 >::print(t);
        std::cout << ", " << std::get < N - 1 > (t);
    }
};

template<class Tuple>
struct TuplePrinter<Tuple, 1>
{
    static void print(const Tuple& t)
    {
        std::cout << std::get<0>(t);
    }
};

template<class... Args>
void print(const std::tuple<Args...>& t)
{
    std::cout << "(";
    TuplePrinter<decltype(t), sizeof...(Args)>::print(t);
    std::cout << ")" << std::endl;
}
// 辅助函数结束

int main()
{
    //1-4) 从 tuple 提取第 I 个元素。 I 是 [0, sizeof...(Types)) 中的整数值。
    std::tuple<Cell, std::string, float> tuple1(Cell{101, 101}, "Test", 3.14);
    std::cout << "tuple1 " << typeid(tuple1).name() << ":   " << std::endl;
    print(tuple1);

    std::tuple<Cell, std::string, float> tuple3 = tuple1;

    std::tuple<Cell, std::string, float> tuple2 = std::make_tuple(Cell{102, 102}, "GGX", 3.14159);
    std::cout << "tuple2 " << typeid(tuple2).name() << ":   " << std::endl;
    print(tuple2);
    std::cout << std::endl;

    std::cout << std::boolalpha;

    std::cout << std::get<0>(tuple1) << " == " << std::get<0>(tuple2) << "      "
              << (std::get<0>(tuple1) == std::get<0>(tuple2)) << std::endl;
    std::cout << std::get<1>(tuple1) << " == " << std::get<1>(tuple2) << "      "
              << (std::get<1>(tuple1) == std::get<1>(tuple2)) << std::endl;
    std::cout << std::get<2>(tuple1) << " == " << std::get<02>(tuple2) << "      "
              << (std::get<2>(tuple1) == std::get<2>(tuple2)) << std::endl;

    std::cout << std::get<0>(tuple1) << " == " << std::get<0>(tuple3) << "      "
              << (std::get<0>(tuple1) == std::get<0>(tuple3)) << std::endl;
    std::cout << std::get<1>(tuple1) << " == " << std::get<1>(tuple3) << "      "
              << (std::get<1>(tuple1) == std::get<1>(tuple3)) << std::endl;
    std::cout << std::get<2>(tuple1) << " == " << std::get<02>(tuple3) << "      "
              << (std::get<2>(tuple1) == std::get<2>(tuple3)) << std::endl;
    std::cout << std::endl;

    std::cout << std::get<0>(tuple1) << " != " << std::get<0>(tuple2) << "      "
              << (std::get<0>(tuple1) != std::get<0>(tuple2)) << std::endl;
    std::cout << std::get<1>(tuple1) << " != " << std::get<1>(tuple2) << "      "
              << (std::get<1>(tuple1) != std::get<1>(tuple2)) << std::endl;
    std::cout << std::get<2>(tuple1) << " != " << std::get<02>(tuple2) << "      "
              << (std::get<2>(tuple1) != std::get<2>(tuple2)) << std::endl;

    std::cout << std::get<0>(tuple1) << " != " << std::get<0>(tuple3) << "      "
              << (std::get<0>(tuple1) != std::get<0>(tuple3)) << std::endl;
    std::cout << std::get<1>(tuple1) << " != " << std::get<1>(tuple3) << "      "
              << (std::get<1>(tuple1) != std::get<1>(tuple3)) << std::endl;
    std::cout << std::get<2>(tuple1) << " != " << std::get<02>(tuple3) << "      "
              << (std::get<2>(tuple1) != std::get<2>(tuple3)) << std::endl;
    std::cout << std::endl;

    std::cout << std::get<0>(tuple1) << " <  " << std::get<0>(tuple2) << "      "
              << (std::get<0>(tuple1) < std::get<0>(tuple2)) << std::endl;
    std::cout << std::get<1>(tuple1) << " <  " << std::get<1>(tuple2) << "      "
              << (std::get<1>(tuple1) < std::get<1>(tuple2)) << std::endl;
    std::cout << std::get<2>(tuple1) << " <  " << std::get<02>(tuple2) << "      "
              << (std::get<2>(tuple1) < std::get<2>(tuple2)) << std::endl;

    std::cout << std::get<0>(tuple1) << " <  " << std::get<0>(tuple3) << "      "
              << (std::get<0>(tuple1) < std::get<0>(tuple3)) << std::endl;
    std::cout << std::get<1>(tuple1) << " <  " << std::get<1>(tuple3) << "      "
              << (std::get<1>(tuple1) < std::get<1>(tuple3)) << std::endl;
    std::cout << std::get<2>(tuple1) << " <  " << std::get<02>(tuple3) << "      "
              << (std::get<2>(tuple1) < std::get<2>(tuple3)) << std::endl;
    std::cout << std::endl;

    std::cout << std::get<0>(tuple1) << " <= " << std::get<0>(tuple2) << "      "
              << (std::get<0>(tuple1) <= std::get<0>(tuple2)) << std::endl;
    std::cout << std::get<1>(tuple1) << " <= " << std::get<1>(tuple2) << "      "
              << (std::get<1>(tuple1) <= std::get<1>(tuple2)) << std::endl;
    std::cout << std::get<2>(tuple1) << " <= " << std::get<02>(tuple2) << "      "
              << (std::get<2>(tuple1) <= std::get<2>(tuple2)) << std::endl;

    std::cout << std::get<0>(tuple1) << " <= " << std::get<0>(tuple3) << "      "
              << (std::get<0>(tuple1) <= std::get<0>(tuple3)) << std::endl;
    std::cout << std::get<1>(tuple1) << " <= " << std::get<1>(tuple3) << "      "
              << (std::get<1>(tuple1) <= std::get<1>(tuple3)) << std::endl;
    std::cout << std::get<2>(tuple1) << " <= " << std::get<02>(tuple3) << "      "
              << (std::get<2>(tuple1) <= std::get<2>(tuple3)) << std::endl;
    std::cout << std::endl;

    std::cout << std::get<0>(tuple1) << " >  " << std::get<0>(tuple2) << "      "
              << (std::get<0>(tuple1) > std::get<0>(tuple2)) << std::endl;
    std::cout << std::get<1>(tuple1) << " >  " << std::get<1>(tuple2) << "      "
              << (std::get<1>(tuple1) > std::get<1>(tuple2)) << std::endl;
    std::cout << std::get<2>(tuple1) << " >  " << std::get<02>(tuple2) << "      "
              << (std::get<2>(tuple1) > std::get<2>(tuple2)) << std::endl;

    std::cout << std::get<0>(tuple1) << " >  " << std::get<0>(tuple3) << "      "
              << (std::get<0>(tuple1) > std::get<0>(tuple3)) << std::endl;
    std::cout << std::get<1>(tuple1) << " >  " << std::get<1>(tuple3) << "      "
              << (std::get<1>(tuple1) > std::get<1>(tuple3)) << std::endl;
    std::cout << std::get<2>(tuple1) << " >  " << std::get<02>(tuple3) << "      "
              << (std::get<2>(tuple1) > std::get<2>(tuple3)) << std::endl;
    std::cout << std::endl;

    std::cout << std::get<0>(tuple1) << " >= " << std::get<0>(tuple2) << "      "
              << (std::get<0>(tuple1) >= std::get<0>(tuple2)) << std::endl;
    std::cout << std::get<1>(tuple1) << " >= " << std::get<1>(tuple2) << "      "
              << (std::get<1>(tuple1) >= std::get<1>(tuple2)) << std::endl;
    std::cout << std::get<2>(tuple1) << " >= " << std::get<02>(tuple2) << "      "
              << (std::get<2>(tuple1) >= std::get<2>(tuple2)) << std::endl;

    std::cout << std::get<0>(tuple1) << " >= " << std::get<0>(tuple3) << "      "
              << (std::get<0>(tuple1) >= std::get<0>(tuple3)) << std::endl;
    std::cout << std::get<1>(tuple1) << " >= " << std::get<1>(tuple3) << "      "
              << (std::get<1>(tuple1) >= std::get<1>(tuple3)) << std::endl;
    std::cout << std::get<2>(tuple1) << " >= " << std::get<02>(tuple3) << "      "
              << (std::get<2>(tuple1) >= std::get<2>(tuple3)) << std::endl;
    std::cout << std::endl;

    return 0;
}

输出

tuple1 St5tupleIJ4CellNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEfEE:
({101,101}, Test, 3.14)
tuple2 St5tupleIJ4CellNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEfEE:
({102,102}, GGX, 3.14159)

{101,101} == {102,102}      false
Test == GGX      false
3.14 == 3.14159      false
{101,101} == {101,101}      true
Test == Test      true
3.14 == 3.14      true

{101,101} != {102,102}      true
Test != GGX      true
3.14 != 3.14159      true
{101,101} != {101,101}      false
Test != Test      false
3.14 != 3.14      false

{101,101} <  {102,102}      true
Test <  GGX      false
3.14 <  3.14159      true
{101,101} <  {101,101}      false
Test <  Test      false
3.14 <  3.14      false

{101,101} <= {102,102}      true
Test <= GGX      false
3.14 <= 3.14159      true
{101,101} <= {101,101}      true
Test <= Test      true
3.14 <= 3.14      true

{101,101} >  {102,102}      false
Test >  GGX      true
3.14 >  3.14159      false
{101,101} >  {101,101}      false
Test >  Test      false
3.14 >  3.14      false

{101,101} >= {102,102}      false
Test >= GGX      true
3.14 >= 3.14159      false
{101,101} >= {101,101}      true
Test >= Test      true
3.14 >= 3.14      true

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值