"(c++20) Three-way Comparsion(3๋ฐฉํฅ ๋น๊ต ์ฐ์ฐ์)/์ฐ์ฃผ์ "
c++20์ ์ถ๊ฐ๋ ๊ฒ ์ค์ ์์ฃผ ํธ์ํ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ด ์๊ฒผ๋ค. !!
์ง๊ธ์ ์๋๋๋ผ๋(?) ์์ฃผ ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฑฐ ๊ฐ์ ๋ ์์ด๋ผ์ ์ ๋ฆฌํด๋ณธ๋ค.
class๋ struct๋ฅผ ๋ง๋ค์ด์ ๊ทธ ๊ฐ์ฒด๋ผ๋ฆฌ ๋น๊ต๋ฅผ ํ๊ธฐ ์ํด์๋ ํ์์ ๋ฐ๋ผ [ '<' '<=' '>' '>=' '==' '!=' : 6๊ฐ] ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ํด์ผํ๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ c++20์ ์ถ๊ฐ๋ <=> Three-way Comparsion ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด 6๊ฐ๋ฅผ ํฌํจํ operatorํ๋๋ง ์ ์ํ๋ฉด ๋๋ค.
#include <iostream>
using namespace std;
struct Myoperator
{
Myoperator(int value) : _value(value)
{
}
//auto operator <=>(const Myoperator& rhs) const { return _value <=> rhs._value; }
auto operator <=>(const Myoperator& rhs) const = default;
bool operator<(const Myoperator& rhs/*RightHandSize*/) const
{
return _value < rhs._value;
}
int _value;
};
int main()
{
Myoperator a = 1;
Myoperator b = 2;
bool test = a < b;
bool test2 = a > b;
bool test3 = a <= b;
}
1. 3๋ฐฉํฅ ๋น๊ต ์ฐ์ฐ์ ํํ
๊ธฐ์กด๊ณผ ๊ทธ๋๋ก ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ํ ๋ ํจ์ ์ ์ธ ๋ฐฉ๋ฒ์ ๊ฐ๋ค.
"(๋ฆฌํด ํ์ ) operator(์ฐ์ฐ์) (์ฐ์ฐ์๊ฐ ๋ฐ๋ ์ธ์)"
→ auto operator <=>(const Myoperator& rhs) const = default;
* rhs: RightHandSize /*์๋ฏธ๋ ์์*/
2. ๋ฆฌํด ํ์
์ ์ฝ๋๋ auto๋ผ๊ณ ์ ์ด๋์ง๋ง, 3๋ฐฉํฅ ๋น๊ต ์ฐ์ฐ์์ ๋ฆฌํด ํ์ ์ 3์ข ๋ฅ๊ฐ ์๋ค.
relational | equivalence | comparable | |
strong ordering | o | o | o |
weak ordering | o | x | o |
partical ordering | o | x | x |
- relational: 6์ข ๋น๊ต ์ฐ์ฐ ์ง์ ==, !=, <, <=, >, >=
- equivalence: ๋ชจ๋ Equivalentํ ๊ฐ๋ค์ ์๋ก ๊ตฌ๋ถ๋์ง ์๊ณ ์์ ๋๊ฐ๋ค
- comparable: a < b, a == b, a > b ์ค ํ๋๋ ์ฐธ์ด๋ค.
์์ ์ฝ๋๋ value ํ๋๋ง ๋น๊ตํ๊ธฐ ๋๋ฌธ์ relational, equivalence, comparable ์ด 3๊ฐ์ง์ ์กฐ๊ฑด์ ๋ชจ๋ ํต๊ณผํ๊ธฐ ๋๋ฌธ์ auto๋ ์ฆ, std::strong_ordering์ด๋ค.
๋ํ, ๋ง์ฝ ํ ํด๋์ค ๋๋ struct ๋น๊ต ๋ณ์์ strong, partial, weak ordeing ๋ณ์๋ค์ด ๊ฐ๊ฐ ์๋ค๊ณ ํ์ ๋, ์ฐ์ฃผ์ ์ฐ์ฐ์๋ฅผ auto๋ฅผ ์ฌ์ฉ ์ค๋ฒ๋ก๋ฉํ๊ฒ ๋๋ฉด partical_ordering์ด ๋๋ค. partial๋ณ์๋ก ์ธํด Strong ์ด๋ waak๋ก ordering์ด ๋ง๋ค์ด ์ง ์ ์๋ค๋ ์ ์ฝ์ด ์๊ธด๋ค.
๊ฒ์์ผ๋ก ์๋ฅผ ๋ค๋ฉด, (๋กค LOL) ์์ ๋ฐฉ ๋ง๋ค์ด์ ๋ญํฌ ๋๋ฆด ๋, Strong: ๋ค์ด์, Weak: ์๋ฉ๋๋ Partial: ๊ณจ๋ ์ด๋ฉด --> ๋ญํฌ ๋ถ๊ฐ๋ฅํ๋ค. ๊ณจ๋์ ๋ค์ด์๋ ํจ๊ป ๋ญํฌ๋ฅผ ํ ์ ์๋ค๋ ์ ์ฝ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ด๋ค.
3. ๋ณ์ ๋น๊ต
int a1 = 100;
int a2 = 200;
auto ret = (a1 <=> a2);
if (ret < 0)
{
cout << "a<b" << endl;
}
else if (ret == 0)
{
cout << "a==b" << endl;
}
else if (ret > 0)
{
cout << "a>b" << endl;
}
[ '<' '<=' '>' '>=' '==' '!=' : 6๊ฐ] ์ฐ์ฐ์๋ bool๊ฐ์ผ๋ก true, false๋ฅผ ๋ด๋ฑ์๋ค๋ฉด, [<=>] ์ฐ์ฐ์๋ -1, 0, 1๋ก ๋น๊ตํ๋ค.
๋น ์ด์ฉ ~
๋ด์ฉ ์ถ์ : ์ธํ๋ฐ Inflearn - Rookiss ์ค ๊ฐ์์ธ C++20 ํ์ด๋ณด๊ธฐ ์ค.
'๐จ๐ปโ๐ป programming > โฝ c, c++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(c++20) STL::Container #1 - std::to_array, erase, erase_if (0) | 2024.06.17 |
---|---|
(c++20) Conditional Explicit Constructor (0) | 2024.06.17 |
(c++20) consteval, constinit (0) | 2024.06.14 |
[c++17] ์ ๋ฌธ์๋ฅผ ์ํ c++17 ์๋ก์ด ๋ด์ฉ ๋ถ๋งํฌ (0) | 2024.03.11 |
[C++] Map์ Key๋ก Class/Struct ๋ฃ๊ธฐ (2) | 2023.08.11 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!