vector, string, map에서 원소 찾기 !
각종 자료형에서 어떤 원소가 있는지 없는지 존재 여부를 확인하고 싶을 때가 있다.
자료형마다 find() 사용법이 조금씩 달라서 한번 정리해야겠다 ㅇㅁㅇ
1) string의 find()
string을 사용하기 위해 #include <string>을 하면 쓸 수 있다.
- 사용법
str.find("찾을 문자열")
: 만약 문자열이 존재하면 그 문자열의 시작 위치를 반환하고, 존재하지 않으면 string::npos를 반환
#include <string>
string a = "Hello world!";
auto pos = a.find("world");
if (pos != string::npos) {
cout << "포함되어 있다." << '\n' << pos << '\n';
}
/*
포함되어 있다.
6
*/
2) map의 find()
#include <map>
map은 사실 index 접근 만으로도 해당 원소의 존재 여부를 확인할 수 있다.
** 단 ! 0이나 빈 문자열을 값으로 가지지 않을 때만
왜냐면 index에 접근하는 것만으로도 그 index에 해당하는 값이 int형 맵일 경우 0, string/char형 맵일 경우 빈 문자열로 초기화되어 생기기 때문이다.
만약, 값으로 0이나 빈 문자열을 가질 수 있다면, 반드시 find()를 사용해야 원소의 존재 유무를 확인할 수 있다.
- 사용법
mp.find(찾을 원소)
: 만약 원소가 존재하면, 그곳을 가리키는 iter를 반환하고, 존재하지 않으면 map의 끝 iter를 반환한다.
#include <map>
map<int, char> mp;
for(int i=0; i<3; i++) {
mp[i] = 'a' + i;
}
if(mp.find(1) != mp.end())
cout << mp[1] << '\n';
/*
b
*/
3) vector의 find()
vector에서 사용할 find()는 <algorithm> 헤더에 존재하는 함수이다.
- 사용법
find(자료형의 시작 iter, 자료형의 끝 iter, 찾고 싶은 원소)
: 만약 그 원소가 존재하면, 그 곳을 가리키는 iter를 반환하고, 존재하지 않으면 vector의 끝 iter를 반환
이걸 응용한다면 find(v.begin(), v.end(), 찾을 원소) - v.begin() 이렇게 찾을 원소의 index로 알아낼 수 있다
#include <algorithm>
vector<int> v;
for(int i=0; i<5; i++)
v.push_back(i);
auto it = find(v.begin(), v.end(), 9);
if(it == v.end()) cout << "해당 원소 존재 X"<<'\n';
/*
해당 원소 존재 X
*/