"c++20 STL::Container #1"
1. std::to_array
std::array ๋ง๋๋ ๋ฐฉ๋ฒ์ด ์ถ๊ฐ๋์๋ค.
//์์์ ํ์
์ถ๋ก
auto ToArray = std::to_array("Hello World");
//๋ช
์์ ํ์
์ถ๋ก
auto ToArray = std::to_array<int>({ 1,2,3,4,5,6 });
2. std::erase, erase_if
๊ธฐ์กด์ vector ๋ฐ์ดํฐ ์ค ํน์ ํ ์กฐ๊ฑด์ ๋ถํฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ค๊ณ ํ ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ๊ณผ ๋ฌธ์ ์ ์ ์์๋ณด์.
// 1๋ฒ ====================================================================
vector<int> vec {-1, 2, 3, 4, -5, 7, -2, 3 };
for (auto it = vec.begin(); it != vec.end(); it++)
{
int value = *it;
if (value < 0)
{
vec.erase(it);
}
else
{
}
}
// error ๋ฐ์ vec.erase(it); ์ง์์ง ๋์ ๋ฐ๋ก ๋ค์์ ๊ฐ๋ฆฌํด.
// 2๋ฒ ====================================================================
for (auto it = vec.begin(); it != vec.end();)
{
int value = *it;
if (value < 0)
{
it = vec.erase(it);
}
else
{
it++;
}
}
// 3๋ฒ ====================================================================
std::remove_if(vec.begin(), vec.end(), [](int num) {return num < 0; });
// ์
๋ ฅ : -1, 2, 3, 4, -5, 7, -2, 3
// ๊ฒฐ๊ณผ : 2, 3, 4, 7, 3 , 7 ,-2, 3
// 4๋ฒ ====================================================================
auto newEnd = std::remove_if(vec.begin(), vec.end(), [](int num) {return num < 0; });
vec.erase(newEnd, vec.end());
1๋ฒ: Runtime Error ๋ฐ์
error: can't increment invaildated vector iterator
์ด์ : ๋ฐ๋ณต์(iterator)๋ฅผ ๋ฌดํจํ(๋ฐ๋ณต์ ๋ฌดํจํ ํ์)ํ๋ค. ๋ฐ๋ณต์๊ฐ ๋ฒกํฐ์ ํ ์์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์๋๋ฐ, ๊ทธ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ์ ธ ๋ฒ๋ฆฌ๋ฉด ๊ทธ ์ดํ ๋ฐ๋ณต์๋ฅผ ํตํด ์์์ ์ ๊ทผํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด์ง๋ค. ์ปจํ ์ด๋๋ง๋ค ์ฐจ์ด๊ฐ ์์ง๋ง ์์์ ์์น๊ฐ ๋ฐ๋ ๋ ํด๋น ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐ๋ณต์๊ฐ ๋ฌดํจํ ๋๋ค.
1๋ฒ์ ์์ ์ญ์ ๊ฐ ์ด๋ค์ง ๋ ๋ฐ๋ณต์๋ ๋์ด์ ์ ํจํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ํ ๊ฐ ์๋๋ค.
2๋ฒ: 1๋ฒ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
erase()๋ ์ญ์ ํ ๊ฒฝ์ฐ ์ญ์ ํ ์์์ ๋ค์ iterator๋ฅผ returnํ๊ธฐ ๋๋ฌธ์ it์ ๋ฃ์ด์ฃผ๋ฉด์ ์ ํจํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฐ๋ณต์๋ฅผ ์์ฑํด์ค๋ค.
3๋ฒ:
std::remove_if๋ ์ปจํ ์ด๋์ ํฌ๊ธฐ๋ฅผ ๋ณํ ์ํค์ง ์๋๋ค. ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ฅผ ์์๋๋ก ์ฑ์ฐ๋ ํ์์ด๋ค. ๊ทธ๋์ ์์๊ฐ์ ์๋ฑํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋๋ค.
4๋ฒ: 3๋ฒ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
std::remove, std::remove_if๋ ํด๋น ๋ฒ์์ ๋งจ ๋์ ๊ฐ๋ฆฌํค๋ ๋ฐ๋ณต์๋ฅผ ๋ฆฌํดํ๋ค.
ํด๋น ๋ฒ์ ๋งจ ๋์ ๋ฐ๋ณต์๋ถํฐ (๋นจ๊ฐ) vector์ ๋งจ ๋ ๋ฐ๋ณต์ (ํ๋)์ erase ํด์ค๋ค.
์ด๋ฌํ ๋ถํธํ ์ ์ ์น ๋ ๋ ค์ค c++20 std::erase, erase_if ๋ฅผ ์๊ฐํ๋ค. ์ปจํ ์ด๋ ๋ด์ฅํจ์๊ฐ ์๋ std::๋ด์ฅํจ์ ์ด๋ค.
// std:: c++20 erase, erase_if
std::erase(vec, 2);
std::erase_if(vec, [](int num) {return num < 0; });
2๋ฒ๊ณผ 4๋ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋์ถ ํ ์ ์๋ค. ์ ์์ํ๋ค !!!
๋ฐ์ด์ฉ ~!
1. ๋ด์ฉ ์ถ์ : ์ธํ๋ฐ Inflearn - Rookiss ์ค ๊ฐ์์ธ C++20 ํ์ด๋ณด๊ธฐ ์ค.
2.https://en.cppreference.com/w/
'๐จ๐ปโ๐ป programming > โฝ c, c++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(c++) ํจ์ ๋ค const (0) | 2024.06.27 |
---|---|
(c++20) STL::Container #2 - contains, starts_with, ends_with (2) | 2024.06.17 |
(c++20) Conditional Explicit Constructor (0) | 2024.06.17 |
(c++20) [Three-way Comparsion(3๋ฐฉํฅ ๋น๊ต ์ฐ์ฐ์)/์ฐ์ฃผ์ ] ์ฐ์ฐ์ (0) | 2024.06.14 |
(c++20) consteval, constinit (0) | 2024.06.14 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!