[C/C++]string stl 정리_1

한우진·2023년 4월 15일
0

C++

목록 보기
1/4
post-thumbnail

네이버 한화ICT 코딩테스트 구글링 없이 보고나서 참교육 당했다. 한끝차이로 STL과 기타 등등 문법들이 엇비슷하게 기억이 안나 정리하는 글. 다 뒤졌다..

기본부터 상세한 것 까지 계속 추가하며 정리하자

String 클래스

  • C++ STL에서 제공하는 문자열 클래스
  • 문자열을 하나의 변수 타입으로 사용하면서 편하게 관리 가능
  • char*, char[]과 다르게 문자열 끝에 '\0'이 없고 동적으로 문자열의 길이를 변경할 수 있다.

입출력

string str; 문자열 생성
cin >> str 공백까지 문자열을 입력받음
getline(cin, str); '\n' 이전까지 문자열을 통째로 입력받음(공백 포함)
getline(cin, str, 'a') 'a' 문자 이전까지의 문자열을 입력받음 getline(cin, str) == getline(cin, str, '\n')
cout << str; 문자열 출력


cout, cin VS printf, scanf

cout, cin은 printf, scanf보다 입출력 속도가 느리다. 너무 많은 입출력을 cout, cin으로 처리하면 효율성 테스트에 간혹 걸리는 경우도 있다고 한다.


cin으로 입력받고 바로 getline으로 받으면?

cin으로 문자열을 받으면 '\n' 개행까지 입력을 받는다. 이럴때 바로 그다음 getline으로 문자열을 입력받아서 출력을해도 getline에 입력된 문자열은 이미 cin에서 남아있는 개행문자때문에 아무것도 출력이 되지 않는다.
이때, 입력버퍼에 남아있는 '\n' 개행문자를 지워야한다.

cin.ignore(최대문자수, 무시할문자);

기본형태는 위와 같다.

cin.ignore();

아무것도 매개변수에 넣지 않고 사용하면 남아있는 1개의 버퍼를 지워준다. 따라서 cin으로 개행문자까지 입력받고 바로 getline을 입력받으려면 하나의 개행문자만 남아있기 때문에 위처럼 cin.ignore(); 만 사용해도 무방하다.

다만 버퍼에 많은 쓰레기값들이 있어서 다 날려버리고 싶을때는

cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 입력 버퍼를 완전히 비우기

처럼 사용할 수 있다. numeric_limits::max()는 모든 플랫폼에서 2-byte 정수의 가장 큰 값을 의미한다. 기술적으로 무제한 입력을 무시하는 방법이지만 limtis 헤더를 포함해야하기 때문에 간편하게 사용하기 위해선

cin.ignore(32767, '\n'); // ignore up to 32767 characters until a \n is removed

처럼 사용할 수 있다. 32767도 마찬가지로 모든 플랫폼에서 2-byte 정수의 가장 큰 값을 정수로 나타낸 값이다.

  • 문자열 입력을 받았는데 원하는 값이 들어오고 출력되지 않는다면 ignore()함수를 사용해서 버퍼를 제거해보자.


    string 접근

  • str.at(index)
    인덱스에 해당하는 문자를 반환한다. 범위를 벗어나면 out_of_range 오류를 출력하고 core dumped를 피할 수 있다.

  • str[index]
    평소 사용하던 접근 방법. 위와 같이 인덱스에 해당하는 문자 반환 하지만 인덱스 벗어나면 core dumped. 오류 처리를 하지 않기 때문에 at보다 속도가 조금 빠름

  • str.front();
    문자열 제일 앞의 문자 반환. C++11부터 가능

  • str.back();
    문자열 제일 뒤 문자 반환

    string size

  • str.size() / str.length();
    주로 반복문의 길이를 정할때 사용하는데 문자열의 크기를 반환. 둘다 같은 값을 반환하지만 size()는 해당 string 객체가 메모리에서 실제 사용하고 있는 크기를, length()는 문자열의 길이를 반환한다.
    특이하게 배열에서는 array.length로 배열 길이를 확인

  • str.capacity();
    str.size();와 비슷하면서도 다른 함수다.

    위의 그림을 보면 직관적으로 이해할 수 있는데 string 뿐만 아니라 벡터에서도 어떤 한 문자열이나 벡터에 대한 메모리를 딱 맞춰서 할당하는 것이 아니라 여유있게 할당해준다. string와 벡터에서 push_back();으로 점점 메모리의 크기가 커지고 여유 메모리분을 넘어가는 순간 다시 재할당해주는 것이다. 마치 우리 어릴때 여유롭게 큰 신발 사서 신다가 딱 맞으면 다시 큰 신발을 사는것과 똑같은 원리다. 시스템마다 할당되는 여유 메모리 양은 다를 수 있다.

  • reserve(); VS resize();
    제대로 공부하면서 resize();는 벡터의 크기를 조절해주는 함수로 알고 있었는데 reserve(); 함수는 처음 들어보는 것 같다. 이거는 면접에서 물어볼만한 질문인거 같아 따로 정리해서 올려야겠다. 아무튼

constexpr void reserve(size_type new_cap);

size 는 그대로 capacity는 정해준 값으로 늘려준다.

constexpr void resize(size_type count);
constexpr void resize(size_type count, const value_type& value);
  

size 도 늘리고 capavity도 늘린다.

  • str.shrink_to_fit();
    C+11에서 동작하며 만약 크기가 16인 문자열을 resize(4); 한다면 size() == 4가 되지만 capacity() == 31(예시값)으로 그대로 남아있다. 그래서 메모리를 잘 활용하기 위해 size() 크기에 알맞게 다시 capacity를 조정해주는 함수
  • str.clear();
    스트링에 들어있는 문자열을 지워준다. 이때 size, length는 0이 되며 capacity는 그대로 남게 된다. 메모리를 해제하지 않고 값만 삭제한다고 보면 된다.
  • str.empty();
    스트링이 비었는지 확인한다. 비었으면 true 반환

0개의 댓글