네이버 한화ICT 코딩테스트 구글링 없이 보고나서 참교육 당했다. 한끝차이로 STL과 기타 등등 문법들이 엇비슷하게 기억이 안나 정리하는 글. 다 뒤졌다..
기본부터 상세한 것 까지 계속 추가하며 정리하자
string str; 문자열 생성
cin >> str 공백까지 문자열을 입력받음
getline(cin, str); '\n' 이전까지 문자열을 통째로 입력받음(공백 포함)
getline(cin, str, 'a') 'a' 문자 이전까지의 문자열을 입력받음 getline(cin, str) == getline(cin, str, '\n')
cout << str; 문자열 출력
cout, cin은 printf, scanf보다 입출력 속도가 느리다. 너무 많은 입출력을 cout, cin으로 처리하면 효율성 테스트에 간혹 걸리는 경우도 있다고 한다.
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()함수를 사용해서 버퍼를 제거해보자.
str.at(index)
인덱스에 해당하는 문자를 반환한다. 범위를 벗어나면 out_of_range 오류를 출력하고 core dumped를 피할 수 있다.
str[index]
평소 사용하던 접근 방법. 위와 같이 인덱스에 해당하는 문자 반환 하지만 인덱스 벗어나면 core dumped. 오류 처리를 하지 않기 때문에 at보다 속도가 조금 빠름
str.front();
문자열 제일 앞의 문자 반환. C++11부터 가능
str.back();
문자열 제일 뒤 문자 반환
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도 늘린다.