ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ μ‘μš©

[STL] std::tuple, std::make_tuple, std::tie, std::ignore

μ„œμ•„λž‘πŸ˜ 2023. 8. 4. 00:26

 

 

std::tuple

μš°λ¦¬κ°€ STL μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•  λ•Œ, 보톡은 ν•œ 가지 νƒ€μž…μœΌλ‘œ μ €μž₯ν•©λ‹ˆλ‹€. std::array와 std::vector, std::set은 ν•˜λ‚˜μ˜ ν…œν”Œλ¦Ώ 인자λ₯Ό λ°›κ³ , std::map, std::pairλŠ” key와 value, first와 second둜 두 개의 νƒ€μž…μ„ λ°›μŠ΅λ‹ˆλ‹€. μ„Έ 개 μ΄μƒμ˜ νƒ€μž…μ„ μ €μž₯ν•˜κ³  μ‹Άλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒμš”?

닡은 std::tuple에 μžˆμŠ΅λ‹ˆλ‹€. std::tuple은 C++11 μ΄ν›„에 λ„μž…λœ ν΄λž˜μŠ€ ν…œν”Œλ¦ΏμœΌλ‘œ, μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ˜ μ›μ†Œλ“€μ„ λ‹¨μΌ κ°μ²΄λ‘œ λ¬Άμ„ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. κ° μ›μ†Œμ—λŠ” μˆœμ„œλŒ€λ‘œ μΈλ±μŠ€(0λΆ€ν„° μ‹œμž‘)둜 μ ‘κ·Όν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

#include <tuple>

// μ˜ˆμ‹œ: int와 double νƒ€μž…μ„ κ°€μ§€λŠ” νŠœν”Œμ„ μƒμ„±ν•©λ‹ˆλ‹€.
std::tuple<int, double> myTuple(42, 3.14, 'a');

// μ›μ†Œμ— μ ‘κ·Όν•˜λŠ” 방법:
int firstElement = std::get<0>(myTuple); // 42
double secondElement = std::get<1>(myTuple); // 3.14
char thirdElement = std::get<2>(myTuple); // a

 

 

 

std::make_tuple

std::make_tuple은 μΈμžλ‘œ μ „λ‹¬λœ κ°’듀을 μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ νŠœν”Œμ„ μƒμ„±ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

#include <tuple>

// μ˜ˆμ‹œ: make_tuple을 μ‚¬μš©ν•˜μ—¬ νŠœν”Œμ„ μƒμ„±ν•©λ‹ˆλ‹€.
auto myTuple = std::make_tuple(42, 3.14, "hello");

// μ›μ†Œμ— μ ‘κ·Όν•˜λŠ” 방법은 λ™μΌν•©λ‹ˆλ‹€.
int firstElement = std::get<0>(myTuple); // 42
double secondElement = std::get<1>(myTuple); // 3.14
const char* thirdElement = std::get<2>(myTuple); // "hello"

 

 

 

std::tie, std::ignore

std::tie은 νŠœν”Œμ˜ μ›μ†Œλ“€μ„ 참쑰둜 λ°”μΈλ”©ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ—¬λŸ¬ 값을 λ™μ‹œμ— λ°˜ν™˜ν•˜κ±°λ‚˜, μ—¬λŸ¬ 값을 ν•œ λ²ˆμ— ν• λ‹Ήν•˜λŠ”λ° μœ μš©ν•©λ‹ˆλ‹€. std::ignore은 νŠœν”Œμ˜ νŠΉμ • μ›μ†Œλ₯Ό λ¬΄μ‹œν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. C++17 이후뢀터 νŠœν”Œ 해체 μ‹œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

#include <tuple>

int a;
double b;
char c;

// std::ignoreλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠœν”Œμ˜ 일뢀 μ›μ†Œλ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€.
std::tie(a, std::ignore, c) = std::make_tuple(42, 2.71828, 'Y');

// aλŠ” 42, cλŠ” 'Y'둜만 변경됨.