시간의 제한 사항만 없다면 요긴하게 사용할 수 있는 find, erase.
오늘은 이 두 가지에 대해서 알아볼 것이다.
더불어 string과 벡터에서의 사용이 조금식은 달라서 헷갈리는 부분도 있는데 같이 정리하도록 하겠다.
헤더파일 : #include <algorithm>
사용법 : find(v.begin(), v.end(),찾을 대상)
v.begin() 부터 v.end()까지 순서대로 대상을 찾으며, 일치하는 대상의 첫 번째 이터레이터를 반환한다.
대상이 존재하지 않는다면 v.end() 를 반환한다.
만약 일치하는 인덱스를 확인하고 싶은 것 이라면 -v.begin()을 해주면 된다.
if( find(v.begin(), v.end(),찾을 대상) == v.end() ){
cout << "존재하지 않습니다."
}
와 같이 사용하면 될 것 같다.
헤더파일 : #include <string>
사용법 : String str = "go do go do bo ja";
str.find("go");
해당 string에 포함되어 있는 대상의 첫 번째 인덱스를 반환한다.
대상은 문자열은 물론 문자하나도 가능하다.
만약 일치하는 대상이 없으면 string::npos 를 반환한다.
if(str.find("go") == string::npos){
cout<<"존재하지 않습니다.";
}
헤더파일 : #include <vector>
사용법 : v.erase(v.begin() + index); --- 인덱스번째에 있는 원소를 제거한다. 정확히는 iterator를 사용해서 제거한다.
주의점 : 원소가 지워지고 나면 자동으로 뒤의 원소들이 앞쪽으로 채워진다.
-> 반복문을 사용할 때 조심해야 한다. 원소의 인덱스가 수정되기 때문
-> 벡터의 크기가 크면 클수록 수정에 대한 cost가 크기 때문에 벡터의 크기가 너무 크면 자제해야 한다.
반환값으로는 삭제된 원소의 바로 뒤의 iterator값을 반환한다.
Tip(!) 위의 find 함수는 iterator를 반환하기 때문에 둘이 같이 혼합하여 사용할 수 있다.
vector<int> sd = { 3, 4, 7, 8, 9, 11};
sd.erase(find(sd.begin(),sd.end(),4));
위와 같이 찾자마자 바로 삭제시켜버릴 수 있다. 하지만 배열의 크기가 일정 수준을 넘어가면 시간초과가 날것이 자명함으로
최후의 수단으로 남겨두자.
헤더파일 : #include <string>
사용법 : 1. 특정 위치에서 특정 길이만큼 (0~5까지 없어진다.)
str.erase(0,6);
2. 특정 위치 (이터레이터를 인자로 받는다.)
str.erase(str.begin()+2);
<How to 코테 with C++> 4. 대문자, 소문자 변환 (0) | 2023.03.16 |
---|---|
<How to 코테 with C++> 3. Stack (0) | 2023.03.12 |
<How to 코테 with C++> 1. Vector (0) | 2023.03.08 |