C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç¨åºæ¯æå·¥å ·
- std::initializer_list
- 彿°å¯¹è±¡
- std::hash
- std::pair
- std::tuple
- std::tie
- std::tuple<Types...>::tuple
- std::tuple<Types...>::swap
- std::make_tuple
- std::forward_as_tuple
- std::tuple çæ¨å¯¼æå¼
- std::tuple<Types...>::operator=
- std::tuple_cat
- operator==,!=,<,<=,>,>=,<=>(std::tuple)
- std::swap(std::tuple)
- std::get(std::tuple)
- std::tuple_size<std::tuple>
- std::tuple_element<std::tuple>
- std::uses_allocator<std::tuple>
- std::ignore
- std::apply
- åºç¹æ§æµè¯å® (C++20)
- std::optional
- std::any
- std::variant
- æ ¼å¼ååº (C++20)
- std::integer_sequence
- std::exchange
- std::make_from_tuple
- std::launder
- std::to_chars
- std::from_chars
- std::as_const
- std::source_location
- å忰彿°
- std::bitset
- std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
- std::in_range
- std::declval
- std::forward
- std::move
- std::move_if_noexcept
- std::chars_format
- std::piecewise_construct_t
- std::piecewise_construct
- std::in_place, std::in_place_type, std::in_place_index, std::in_place_t, std::in_place_type_t, std::in_place_index_t
- 注é
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >å·¥å ·åº >std::tuple > operator==,!=,<,<=,>,>=,<=>(std::tuple)
operator==,!=,<,<=,>,>=,<=>(std::tuple)
bool operator==( const std::tuple<TTypes...>& lhs,
(C++14 å)
constexpr bool operator==( const std::tuple<TTypes...>& lhs,
bool operator!=( const std::tuple<TTypes...>& lhs,
(C++14 å)
constexpr bool operator!=( const std::tuple<TTypes...>& lhs,
(C++20 å)
bool operator<( const std::tuple<TTypes...>& lhs,
(C++14 å)
constexpr bool operator<( const std::tuple<TTypes...>& lhs,
(C++20 å)
bool operator<=( const std::tuple<TTypes...>& lhs,
(C++14 å)
constexpr bool operator<=( const std::tuple<TTypes...>& lhs,
(C++20 å)
bool operator>( const std::tuple<TTypes...>& lhs,
(C++14 å)
constexpr bool operator>( const std::tuple<TTypes...>& lhs,
(C++20 å)
bool operator>=( const std::tuple<TTypes...>& lhs,
(C++14 å)
constexpr bool operator>=( const std::tuple<TTypes...>& lhs,
(C++20 å)
constexpr /* see below */ operator<=>( const std::tuple<TTypes...>& lhs,
lhs çæ¯ä¸ªå
ç´ å tuple rhs ç对åºå
ç´ ãlhs ä¸ rhs ï¼å³æ¯è¾é¦å
ç´ ï¼è¥ç价忝è¾ç¬¬äºå
ç´ ï¼è¥åç价忝è¾ç¬¬ä¸å
ç´ ï¼ä»¥æ¤ç±»æ¨ã
对äºé空 tuple ï¼ (3) çä»·äº
if (std::get<0>(lhs) < std::get<0>(rhs)) return true; if (std::get<0>(rhs) < std::get<0>(lhs)) return false; if (std::get<1>(lhs) < std::get<1>(rhs)) return true; if (std::get<1>(rhs) < std::get<1>(lhs)) return false; ... return std::get<N - 1>(lhs) < std::get<N - 1>(rhs);
lhs ä¸ rhs ï¼å³æ¯è¾é¦å
ç´ ï¼è¥ç价忝è¾ç¬¬äºå
ç´ ï¼è¥åç价忝è¾ç¬¬ä¸å
ç´ ï¼ä»¥æ¤ç±»æ¨ã
è¿åç±»å为 lhs ä¸ rhs ä¸çæ¯å¯¹å
ç´ ä¸çä¸è·¯æ¯è¾ç»æçå
±ç¨æ¯è¾ç±»å«ç±»åã对äºç©º tuple ï¼è¿åç±»å为 std::strong_ordering ã
对äºé空 tuple ï¼ (7) çä»·äº
if (auto c = synth_three_way(std::get<0>(lhs), std::get<0>(lhs)); c != 0) return c; if (auto c = synth_three_way(std::get<1>(lhs), std::get<1>(lhs)); c != 0) return c; ... return synth_three_way(std::get<N - 1>(lhs), std::get<N - 1>(lhs));
synth_three_way æ¯è¿è¡åæä¸è·¯æ¯è¾çä»
ç¨äºééç彿°å¯¹è±¡ãsizeof...(TTypes) ä¸ sizeof...(UTypes) å¿
é¡»ç¸çï¼å¦åç¨åºä¸ºè°¬æï¼æå¯¹äº operator<=> ï¼è¯¥è¿ç®ç¬¦å½æ°ä¸åä¸éè½½å³è®® (C++20 èµ·)ã以ä¸ä»£ç ä¸ç N çäºä¸¤è
ã
æææ¯è¾è¿ç®ç¬¦æ¯çè·¯çï¼å®ä»¬å¨ç¡®å®ç»ææå¿ é¡»çæ¯è¾ä¹å¤ä¸è®¿é® tuple å ç´ ã
åæä¸è·¯æ¯è¾ç»å®äºä¸ªå¯¹è±¡ç±»å
t < u ? std::weak_ordering::less : u < t ? std::weak_ordering::greater : std::weak_ordering::equivalent
è¥ three_way_comparable_with æ |
(C++20 èµ·) |
åæ°
| lhs, rhs | - | è¦æ¯è¾ç tuple |
è¿åå¼
[0, sizeof...(Types)) ä¸ç i æ std::get<i>(lhs) == std::get<i>(rhs) å为 true ï¼å¦å为 false ã对äºä¸ªç©º tuple è¿å true ãlhs ä¸çé¦ä¸ªä¸çä»·å
ç´ å°äº rhs ä¸çå为 true ï¼è¥ rhs ä¸çé¦ä¸ªä¸çä»·å
ç´ å°äº lhs ä¸çææ ä¸çä»·å
ç´ å为 false ã对两个空 tuple è¿å false ã示ä¾
å 为 operator< 对 tuples å®ä¹ï¼æ è½æåº tuple ç容å¨ã
#include <iostream> #include <tuple> #include <vector> #include <algorithm> int main() { std::vector<std::tuple<int, std::string, float>> v; v.emplace_back(2, "baz", -0.1); v.emplace_back(2, "bar", 3.14); v.emplace_back(1, "foo", 100.1); std::sort(v.begin(), v.end()); Â for(auto p: v) { std::cout << "(" << std::get<0>(p) << ", " << std::get<1>(p) << ", " << std::get<2>(p) << ")\n"; } }
è¾åºï¼
(1, foo, 100.1) (2, bar, 3.14) (2, baz, -0.1)