定义于头文件 <tuple>
template< class... Types > | (C++11 起) |
类模板 std::tuple
是固定大小的异类值汇集。它是 std::pair 的推广。
若 (std::is_trivially_destructible_v<Types> && ...) 为 true ,则 | (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) 以字典序比较 lhs
与 rhs
,即比较首元素,若相等则比较第二元素,若均相等则比较第三元素,以此类推。
所有比较运算符是短路的;它们在确定结果所必须的比较之外不访问 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