[소수 찾기 문제]를 풀던 중, c++ string의 멤버함수들을 잘 몰라서 삽질한 부분이 있어서 정리한다.
기본적인 목표는 string형안에서 원하는 char원소를 제거하기.
string s= "abcdef"에서 char형 원소 'd'를 지워본다고 하자.
처음 시도했던 방식은 string.erase('d')이다.
하지만 이런식으로하면 오류가 뜬다.
erase의 인자로는 반복자나 인덱스 위치가 들어가야하기 때문.
따라서 string.erase(string.find('d'))를 사용했지만
이런식으로 실행하면 밑의 erase정의에서 볼 수 있듯이
d부터 뒤에가 다날라가서 s="abc"가 되어버린다.
결국 밑의 string.erase()정의에서 보듯이 iterator을 매개변수로 넣어줘야 한다.
하지만 string.find()는 해당 원소의 인덱스를 반환하므로
다른 방식을 써야한다.
검색해보니 algorithm헤더의 find함수가 존재했다.
find함수에 string의 시작 iterator, string의 끝 iterator, 찾으려는 char원소 값을 넣어주면
해당 char원소를 가리키는 iterator을 반환한다.
find(s.begin(),s.end(),'d')
이런식으로 찾으면 'd'의 iterator을 찾는다.
우리가 원하는 방식을 다 찾았다.
s.erase(find(s.begin(),s.end(),'d'));
이렇게 실행시 s="abcef"가 된다!
//sequence (1)
string& erase (size_t pos = 0, size_t len = npos);
//character (2)
iterator erase (iterator p);
//range (3)
iterator erase (iterator first, iterator last);
//string (1)
size_t find (const string& str, size_t pos = 0) const;
//c-string (2)
size_t find (const char* s, size_t pos = 0) const;
//buffer (3)
size_t find (const char* s, size_t pos, size_t n) const;
//character (4)
size_t find (char c, size_t pos = 0) const;
pos인덱스부터 시작해서 인자로 들어온 string형을 탐색해서 시작위치 반환한다.
pos인덱스부터 시작해서 s가 가리키는 문자열을 탐색해서 시작위치 반환
pos 인덱스부터 시작해서 s가 가리키는 문자열을 탐색후 첫 문자부터
n개만큼의 부분 문자열을 원본 문자열에서 탐색한 후 시작위치 반환.
pos인덱스부터 시작해서 char형 원소 c를 탐색 후, 해당 위치 반환
네 가지 전부 못 찾았을 때는 string::npos를 반환한다!
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);
Returns an iterator to the first element in the range [first,last) that compares equal to val. If no such element is found, the function returns last.
특징으로는 ==연산자를 통해 비교를 한다.
first iterator부터 last iterator전까지 값중에서 val값을 탐색한다.
찾지 못한다면 last iterator을 반환하고, 찾았다면 val값의 iterator을 반환한다.
https://modoocode.com/240
https://cplusplus.com/reference/algorithm/find/?kw=find
https://cplusplus.com/search.do?q=string.erase
https://cplusplus.com/reference/string/string/find/
항상 좋은 글 감사합니다.