우리가 문제를 해결하다 보면 대소문자를 구분하지 않고 문자열을 비교해야 하는 경우가 있습니다.
"Talk" 와 "taLk" 를 같은 문자열로 보겠다는 뜻입니다.
어떻게 하면 이 두 문자열을 같은 문자열로 만들어 줄 수 있을까요?
간단한 방법이 하나 있습니다.
모든 영문자를 대문자로 변경하거나 소문자로 변경해주면 됩니다.
저는 소문자로 변경해주는 방법에 대해서 이야기해보겠습니다.
가장 먼저 떠오르는 생각은 반복문으로 문자열의 첫 문자부터 끝 문자까지 확인하면서 대문자를 소문자로 변경해주는 방법입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include<iostream> #include<vector> #include<string> using namespace std; int main() { vector<string> vt = {"Talk", "taLk"}; cout<<"before: "<<vt[0]<<" "<<vt[1]<<endl; for (string &str : vt) { for(char &ch : str){ if('A'<=ch&&ch<='Z') ch += 32; } } cout<<"after: "<<vt[0]<<" "<<vt[1]<<endl; return 0; } | cs |
[실행 결과]
이렇게요!
하지만 STL을 이용하면 더 쉬워집니다.
algorithm 헤더 파일에 있는 transform 함수를 사용하는 방법입니다.
transform()은 네 개의 인자를 받습니다.
첫 번째 인자 : 변경할 문자열의 시작을 가리키는 이터레이터
두 번째 인자 : 변경할 문자열의 끝을 가리키는 이터레이터
세 번째 인자 : 변경할 문자열의 시작을 가리키는 이터레이터
네 번째 인자 : 지정한 범위 내의 문자열에 적용할 함수 (::tolower 은 대문자를 소문자로 변경, ::toupper 은 소문자를 대문자로 변경)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include<iostream> #include<vector> #include<cctype> #include<string> #include<algorithm> using namespace std; int main() { vector<string> vt = {"Talk", "taLk"}; cout<<"before: "<<vt[0]<<" "<<vt[1]<<endl; for(int i=0; i<vt.size(); i++){ transform(vt[i].begin(), vt[i].end(), vt[i].begin(), ::tolower); } /* for (string &str : vt) { for(char &ch : str){ if('A'<=ch&&ch<='Z') ch += 32; } } */ cout<<"after: "<<vt[0]<<" "<<vt[1]<<endl; return 0; } | cs |
쉽죠? 대소문자를 구분하지 않아야 할 경우엔 위와 같은 방법으로 해결해보세요!
'■ C++ > STL 알고리즘' 카테고리의 다른 글
[STL 알고리즘] sort - 구조체 정렬 (0) | 2019.12.18 |
---|---|
[C++] next_permutation()을 활용한 조합 생성 (0) | 2019.03.26 |
[C++] STL vector를 활용한 배열 동적 할당 (0) | 2019.03.26 |