์ฌ๊ธฐ์๋ C++์ Standard library ์ปจํ ์ด๋์ ์กฐ๊ฑด ์ํ์ ๋ํ ๊ฐ๋ ๋ค์ ์ด์ผ๊ธฐํ๋ค. ๋ค์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ดํด๊ฐ ์๊ฐ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ฐธ๊ณ ํด๋ณด๋๋ก ํ์.
bool NewsScheduler::checkSchedule(Schedule& schedule)
{
const auto &curMilli = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch()).count();
const auto itr = find_if(scheduleMap.rbegin(), scheduleMap.rend(), [&curMilli](const pair<int, Schedule> &p)
{ return p.second.start < curMilli && p.second.end > curMilli; });
if ( itr == scheduleMap.rend())
return true;
schedule = itr->second;
return true;
}
// scheduleMap : std::map<int, Schedule>
๊ฐ์ฅ ์ต๊ทผ์ ๋ฑ๋ก๋ ์ค์ผ์ค์ ์๊ฐ์ด ๋๋ฉด true๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
โ iterator, ๋ฐ๋ณต์
C++์ด๋ ์๋ฐ๋ฅผ ์ฌ์ฉํด๋ณธ ์ฌ๋์ด๋ผ๋ฉด ์๊ฒ ์ง๋ง, ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ์ปจํ ์ด๋์ ์ข ๋ฅ๋ ๊ทธ ๊ตฌ์กฐ์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ๋ก ๋๋๋ค. ๋ํ์ ์ผ๋ก vector(List)์ map(Hashmap)์ด ์๋ค. C++์ Standard library์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก iterator๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์๋ฃ๊ตฌ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์์ ์ธ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ ํ ์๋ฃ๊ตฌ์กฐ์ ๋น์ ํ ์๋ฃ๊ตฌ์กฐ๋ก ๋๋๋ค. ์ ํ ์๋ฃ๊ตฌ์กฐ์ธ Array์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ฅผ ์ํํ๋ฉด์ Array์ ๊ฐ์ ์ ๊ทผํ ์ ์์ผ๋, ๋น์ ํ ์๋ฃ๊ตฌ์กฐ์ธ Map(Dictionary)์ ๊ฒฝ์ฐ๋ key๊ฐ์ ์์์ผ value์ ์ ๊ทผํ ์ ์๋ค. ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๋ ๋ฐฉ์ ๋ํ Out of bound๊ฐ ๋ฐ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์ Standard library(์ค์ฌ์ std)์์๋ iterator๋ก ๋ฐ์ดํฐ๋ฅผ ์ํํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
iterator๋ begin()๊ณผ end()๋ฅผ ๊ฐ์ง๋ฉฐ ํฌ์ธํฐ์ฒ๋ผ ์ปจํ ์ด๋์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ค. ๊ทธ๋ฆฌ๊ณ read-only์ write ๋ฐ๋ณต์, ์๋ฐฉํฅ, ์ญ๋ฐฉํฅ ๋ฐ๋ณต์๋ฅผ ๋ชจ๋ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ ๋ฐ๋ณต์๋ฅผ ํตํด ์์ฝ๊ฒ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
โ lambda ํจ์
๋๋ค ํจ์๋ ์ต๋ช ํจ์๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ๋ฐ, ํจ์์ ๋ฏธ๋ ๋ฒ์ ์ฒ๋ผ ์ค์ฝํ ๋ด์์ ์ ์ํ๊ณ ํ์ํด ์ํด ๋ฐ๋ก ํธ์ถํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ ์ ์๋ค. ๋๋ค ํจ์์ ์ฌ์ฉ๋ฒ์ 2021.03.09 - [๊ฐ๋ฐ์คํ/C&C++] - [c++] ๋๋ค ํํ์ ์ ๋ฆฌ ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
โ Predicate, ์์ ์
๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ๋ค. A predicate is a statement (or function) that returns either true or false.
You pass some data into the predicate. The predicate logic then performs a check on the data. Then the function/statement return a true or false result to the caller.
์ฝ๊ฒ ๋งํ๋ฉด ํ๊ฐ ์ด์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ boolean๊ฐ์ ๋ฐํํ๋ ์ธํฐํ์ด์ค๋ฅผ Predicate๋ผ๊ณ ํ๋ค. ํ๊ตญ์ด๋ก ํ๋ฉด '์์ ์' ์ ๋๊ฐ ๋๊ฒ ๋ค.
โ std ์ปจํ ์ด๋ ์กฐ๊ฑด ์ํ(find_if, count_if, remove_if)
find, count์ ๊ฒฝ์ฐ 3๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์์ iterator, ๋ iterator, ์ค์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฒ์ ๋ด์ ํด๋น ํ๋ ๊ฐ์ iterator๋ฅผ ๋ฐํํด์ค๋ค. ๋ง์ฝ ์ฐพ์ง ๋ชปํ๋ค๋ฉด end()๋ฅผ ๋ฐํํ๋ค.
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
find_if์ count_if, remove_if์ ๊ฒฝ์ฐ์๋ 3๋ฒ์งธ ์ธ์๋ก Predicate ํจ์๋ฅผ ๋ฃ์ผ๋ผ๊ณ ์ ์๋์ด ์๋ค. ์ฆ, true/false๋ฅผ ๋ฐํํ๋ ์กฐ๊ฑด์์ returnํ๋ ํจ์๋ฅผ ๋ฃ์ด์ค์ผ ๊ทธ ์กฐ๊ฑด์์ ๊ธฐ๋ฐ์ผ๋ก ํด๋นํ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค. UnarayPredicate๋ ๋จํญ ์์ ์์ธ๋ฐ bool๊ฐ์ ๋ฐํํ๋ ๋ณดํต์ predicate์ด๋ค.
template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );
โ ์์ ์ค๋ช
const auto itr = find_if(scheduleMap.rbegin(), scheduleMap.rend(), [&curMilli](const pair<int, Schedule> &p)
{ return p.second.start < curMilli && p.second.end > curMilli; });
std::find_if๋ฅผ ์ฌ์ฉํด์ scheduleMap์ ๋งจ ๋ค๋ถํฐ ๋งจ ์๊น์ง ๋ฒ์๋ฅผ ์ง์ ํ๋ค(์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ ์ธ์). rbegin, rend๋ reverse_iterator๋ฅผ ๋ฐํํ๋ ๋ฐ ์ญ๋ฐฉํฅ ๋ฐ๋ณต์๋ฅผ ๋ปํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ ๋ฒ์งธ ์ธ์๋ก lambda ํจ์๋ฅผ ๋ฃ์๋ค. lambda ํจ์์ ํ๋ผ๋ฏธํฐ๋ scheduleMap์ ๋จ์ผ ์์์ ํํ๋ฅผ ๊ฐ์ถฐ์ผ ํ๋ ๋ฐ, map์ ๋จ์ผ ์์๋ pair์ด๊ธฐ ๋๋ฌธ์ const pair<int, Schedule>๊ณผ ๊ฐ์ ํํ๋ก ์ง์ ํ๋ค. ๋๋ค ํจ์ ๋ด๋ถ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์กฐ๊ฑด์ ๋ฃ๊ณ returnํ๋ค. return๋ฌธ์ ๋ฐ๋์ boolean ํ์ ์ผ๋ก ์ง์ ํด์ค์ผ ํ๋ค(Predicate). ์กฐ๊ธ ํ์ด ์ด๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ธ๋ค.
auto lambda_predicate = [&curMilli](const pair<int, Schedule> &p)
{ return p.second.start < curMilli && p.second.end > curMilli; });
const auto itr = find_if(scheduleMap.rbegin(), scheduleMap.rend(), lambda_predicate);
๊ตณ์ด ๋๋ค ํจ์๋ฅผ ์ฐ์ง ์๊ณ std::function์ ์ฐ๊ฑฐ๋ ์ค์ ํจ์์ ์ฃผ์๋ฅผ ๋ฃ์ด๋ ๋๋ค. ํ์ง๋ง ์ต๋ช ํจ์์ฒ๋ผ ๊ทธ์๋ฆฌ์์ ์ ์ํ๊ณ ๋์ ํ๋ ํธ์ด ํจ์ฌ ํธํ๋ค.
๊ทธ๋ฆฌ๊ณ , ๋๋ค ํจ์์ ์กฐ๊ฑด์์ ํด๋นํ๋ iterator๊ฐ itr๋ณ์์ ๋ด๊ฒจ์ ธ ๋์จ๋ค. count_if๋ itrerator๋ฅผ ๋ฐํํ์ง ์๊ณ int๋ฅผ ๋ฐํ ํ๋๋ฐ, ์กฐ๊ฑด์์ ํด๋นํ๋ ๋ฐ์ดํฐ์ ๊ฐ์๋งํผ ๋ฐํํ๋ค. find_if๊ฐ ๋ฐํํ iterator๋ก scheduleMap.end()์ ๋น๊ตํ๋ฉด์ ํด๋นํ๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด return false, ์์ผ๋ฉด call by reference๋ก ๋์ด์จ schedule์ ๊ฐ์ ํ ๋นํ๊ณ return true๋ฅผ ํ๋ค.
์ดํด๋ณธ ์์ ๋ ๊ฐ๋จํ ํจ์์ด๋ฉฐ ์ค๋ฌด์์ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ง์ด ์ฐ์ด๊ธฐ ๋๋ฌธ์ ์๊ฐํ๋ค. ์งง์ ํจ์์ง๋ง Predicate, Lambda, Iterator์ ๊ฐ๋ ์ด ๋ค์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ง๊ณ ๋์ด๊ฐ๋ง ํ๋ค.
'C++ ๊ธฐ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C/C++] 10. ํฌ์ธํฐ(feat. ์ค๋งํธ ํฌ์ธํฐ) (0) | 2023.04.26 |
---|---|
[C/C++] 9. ๋ฐฐ์ด(feat. vector & array) (0) | 2023.04.25 |
[C/C++] 7. ๊ฐ๋ฐํ๊ฒฝ ๊ตฌ์ฑ(windows/linux) (1) | 2023.04.11 |
Makefile ๊ธฐ์ด (0) | 2023.04.11 |
[C/C++] 6. ์ํธ๋ฆฌ ํฌ์ธํธ(Entry point)(feat. argc/argv) (0) | 2021.04.05 |
๋๊ธ