※ 개인적인 공부를 위해 포스팅 하는 글입니다.
find
find_if
count
count_if
all_of
any_of
none_of
for_each
remove
remove_if
# vector로 확인해 보자
srand(static_cast<unsigned int>(time(nullptr)));
vector<int> v;
for (int i = 0; i < 100; i++)
{
int num = rand() % 100;
v.push_back(num);
}
01. number숫자가 있으면 found 트루
#find
auto itFind = find(v.begin(), v.end(),number);
ㆍ 직관적이고 간단하다. 시작~끝 넘버있는지, 반환타입은 이터레이터를 반환해주는 모습
if (itFind == v.end())
{
cout << "못찾" << endl;
}
else
{
cout << "찾" << endl;
}
02. 11로 나뉘는 숫자가 벡터에 있는지?
# find_if
struct CanDivideBy11
{
bool operator()(int n)
{
return (n % 11) == 0;
}
};
std::find_if(v.begin(), v.end(), CanDivideBy11()/*람다*/);
std::find_if(v.begin(), v.end(), [](int n) { return (n % 11) == 0; });
ㆍ 함수객체를 활용하거나, 람다식을 활용해주면 되겠다. 직관적이다
ㆍ 시작,끝,찾을 조건
03. 홀수인 숫자의 갯수는?
#count_if , all_of, any_of, none_of
count_if(v.begin(), v.end(), [](int n) {return (n % 2) != 0; });
bool b1 = all_of(v.begin(), v.end(), [](int n) {return (n % 2) != 0; });
bool b2 = any_of(v.begin(), v.end(), [](int n) {return (n % 2) != 0; });
bool b3 = none_of(v.begin(), v.end(), [](int n) {return (n % 2) != 0; });
ㆍ b1 : 모든 데이터가 홀수입니까?
ㆍ b2 : 홀수인 데이터가 1개라도 있습니까?
ㆍ b3 :모든 데이터가 홀수가 아닙니까?
04. 벡터에 들어가 있는 모든 데이터에 3을 곱해주세요
for_each(v.begin(), v.end(), [](int& n) { n = n * 3; });
ㆍ 시작위치, 끝위치, 작동할 함수
05. 홀수인 데이터를 일괄 삭제
remove_if(v.begin(), v.end(), [](int n) {return (n % 2) != 0; });
ㆍ 얘가 좀 특이하다. 작동방식을 확인해 봤다...
ㆍ 남겨줘야 하는 데이터를 체크해서 복사를 한다. 홀수를 지우고 짝수를 남겨야한다.
ㆍ 아래 1 부분의 이터레이터를 반환한다.
ㆍ 삭제를 한 것이 아니라, 삭제할 데이터들의 묶음의 첫번째 이터레이터를 반환해 주는 알고리즘이다.
ㆍ 따라서 erase를 따로 해줘야한다.
vector<int>::iterator it = std::remove_if(v.begin(), v.end(), [](int n) {return (n % 2) != 0; });
v.erase(it);
'C++프로그래밍 > 자료구조,알고리즘(추후확장)' 카테고리의 다른 글
연관 컨테이너 (1) | 2024.10.01 |
---|---|
map (3) | 2024.09.30 |
deque (0) | 2024.09.30 |
list 구현해보기 (1) | 2024.09.29 |
list와 list의 이터레이터 (0) | 2024.09.29 |