[C++] string.erase(), string.find(), algorithm헤더의 find()함수

jh Seo·2023년 7월 18일
0

C++공부

목록 보기
20/21
post-custom-banner

개요

[소수 찾기 문제]를 풀던 중, 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"가 된다!

string.erase()

//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);
  1. erase인자에 숫자가 들어가면 해당 숫자에 해당하는 인덱스값부터 len길이만큼 날려버린다.
  2. erase인자에 iterator가 들어가면 해당 iterator가 가리키는 값만 지운다.
  3. erase인자에 시작 iterator, 끝 iterator가 들어가면
    [시작 iterator,끝 iterator) 이렇게 지워진다.

string.find()

//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;
  1. pos인덱스부터 시작해서 인자로 들어온 string형을 탐색해서 시작위치 반환한다.

  2. pos인덱스부터 시작해서 s가 가리키는 문자열을 탐색해서 시작위치 반환

  3. pos 인덱스부터 시작해서 s가 가리키는 문자열을 탐색후 첫 문자부터
    n개만큼의 부분 문자열을 원본 문자열에서 탐색한 후 시작위치 반환.

  4. pos인덱스부터 시작해서 char형 원소 c를 탐색 후, 해당 위치 반환

네 가지 전부 못 찾았을 때는 string::npos를 반환한다!

algorithm헤더내부의 find함수

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/

profile
코딩 창고!
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

항상 좋은 글 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

아주 유익한 내용이네요!

답글 달기