그냥 게임개발자

string의 메서드 본문

C++ 나만의 복습

string의 메서드

sudoju 2024. 3. 31. 19:17
#include <stdio.h>

using namespace std;

int main()
{
    string str = "hehe";
    str += " enough!";
    str.pop_back();
    cout << str << " : " << str.size() << '\n';
    cout << char(* str.begin()) << '\n';
    cout << char(* (str.end() - 1)) << '\n';
    
    // string& insert (size_t pos, const string& str);
    str.insert(0, "test ");
    cout << str << " : " << str.size() << '\n';
    
    // string& erase (size_t pos = 0, size_t Len = npos);
    str.erase(0, 5);
    cout << str << " : " << str.size() << "\n";
    
    // size_t find (const string& str, size_t pos = 0);
    auto it = str.find("hehe");
    if (it != string::npos)
    {
        cout << "포함!" << '\n';
    }
    
    cout << it << '\n';
    cout << string::npos << '\n';
    
    // string substr (size_t pos = 0, size_t len = npos) const;
    cout << str.substr(5, 2) << '\n';
    
    return 0;
}

/*
결과 출력물

hehe enough : 11
h
h
test hehe enough : 16
hehe enough : 11
포함!
0
18446744073709551615
en
*/

 

어우 무슨 처음부터 코드야

 

아아 진정하자.

 

사실 저 코드는 string에서 많이 사용하는 메서드들을 모아놓은 거니 차근차근 살필거다...

화내지마시구요...

화내지마여..ㅎ...

 

 

+=

메서드는 아니지만 문자열을 더할 때 보통 +=를 써서 문자열 또는 문자를 더한다.

push_back()이라는 메서드가 있지만 이는 문자 하나씩밖에 더하지 못해서 보통은 +=를 쓴다.

 

push_back()

#include <stdio.h>

using namespace std;

int main()
{
    string str = "Hello";
    str.push_back(' ');
    str.push_back('W');
    str.push_back('o');
    str.push_back('r');
    str.push_back('l');
    str.push_back('d');
    
    cout << s;
    return 0;
}


// 결과물
// Hello World

 

아 나중에 포스트 할 vector의 push_back()과 비슷하긴 한데 좀 다르다.

string의 push_back()은 문자 하나씩밖에 못넣는 것을 알아두자.

 

사실 여기서 + 를 쓰게되면 해당 문자열을 뒤에 추가해서 확장하는 것은 맞지만 +=의 경우네는 해당 문자열을 추가해서 확장하는 것이지만 +는 쓰게 되면 새로운 문자열을 만들어서 재할당하는 것이기에 시간이 더 들게 된다.

그래서 문자열을 추가할 때는 +보다는 +=를 쓰는 것이 좋다.

 

#include <stdio.h>
using namespace std;

int main()
{
    string str = "abc";
    // good choice
    a += "d";
    // bad choice
    a = a + "d";
}

 

begin()

문자열의 첫번째 요소를 가리키는 이터레이터를 반환한다.
이 이터레이터를 기반으로 *를 통해 해당 위치의 값을 가져올 수 있다.
※ 이터레이터와 *(포인터)는 추후에 또 포스팅 할 예정

end()

문자열의 마지막 요소 그 다음을 가리키는 이터레이터를 반환
참고로 begin()과 end()는 자료구조인 vector, Array, List, map, set에서도 존재하며 똑같은 의미임.

size()

문자열의 사이즈를 반환한다. O(1)의 시간 복잡도를 가짐

insert(위치, 문자열)

특정 위치에 문자열을 삽입한다. O(n)의 시간 복잡도를 가짐

erase(위치, 크기)

특정위치에 크기만큼 문자열을 지운다. O(n)의 시간복잡도를가짐

pop_back()

문자열 끝을 지운다. O(1)의 시간복잡도를 가진다.

find(문자열)

특정 문자열을 찾아 위치를 반환한다.
만약 해당 문자열을 못찾을 경우 string::npos를 반환하며 O(n)의 시간복잡도를 가진다.
string::npos란? size_t 타입의 최대값을 의미한다.
size_t 타입의 최대값은 운영체제에 따라 달라지며 64bit 운영체제라면 64bit 부호가 없는 최대 정수, 32bit 운영체제라면 32bit 부호가 없는 최대 정수값을 가진다.

64bit → string::npos(18446744073709551615)
32bit → string::npos(4294967295)

이 값들을 반환한다.

substr(위치, 크기)

특정 위치에서 크기만큼의 문자열을 추출
O(n)의 시간 복잡도를 가짐
크기를 넣지 않는다면 위치로부터 문자열 가장 끝자리까지 문자열을 추출

 

#include <stdio.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    string a = "aaabb";
    string b = a.substr(2);	// (0부터시작)2번째 자리부터 맨끝까지 문자열 추출
    cout << b << '\n';		// abbb
    return 0;
}

엥 갑자기 ios tie NULL이거뭐야 라고 할 수 있는데

이것은 알고리즘 문제를 풀 때 있어 시간 초과를 방지하기 위해서 이것들을 추가해줘야 한다.

위 코드를 작성하면 입출력 속도가 빨라진단다.

음.. 그럼 이 것들은 무엇일까

 

다음 포스팅에서 작성하도록 하겠다

 

찡긋 진짜루

 

'C++ 나만의 복습' 카테고리의 다른 글

ASCII 코드와 문자열  (0) 2024.03.31
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);  (0) 2024.03.31
타입? 타입변환?  (0) 2024.03.31
출력  (0) 2024.03.31
입력  (0) 2024.03.31