코테를 c++로 하면서 느낀점은..속도를 제외하고 c++의 좋은점을 아직 잘 모르겠다는 점이다..
항상 코딩테스트를 보면 string을 잘라야하는 순간이 생기는데 그럴때마다 자바로 갈아타고 싶다..
이미 자바로 갈아탔고,, 또 느끼는건 문자열은 파이썬이 최고다..ㅎ
그래서 그냥 split 함수를 외워서 사용하기로 했다.
코테를 준비하는 분들이라면 split 함수는 외워서 쓰는게 나을듯합니다🙄
1. istringstream 과 getline 함수를 사용
급하신 분은 바로 코드로 ㄱ
해당 예시는 문자열을 공백(" ")구분자로 자르고 벡터에 넣는 예시입니다.
* istringstream은 공백을 구분해주기에 공백외의 구분자(ex. ' , ' )가 필요한 경우 1) 코드를 사용해주세요
(물론 공백이 구분자인 분도 사용하셔도 됩니다)
공부하기 위해 보시는 분들이라면 바로 밑의 1)코드 말고 그 밑에 있는 istringstream에 대한 설명부터 보고 1)코드를 보는 걸 추천합니다.
- istringstream은 sstream 을 include해 사용할 수 있는 stream class이다. => include<sstream> 해줄것
* 간단히 말하자면 istringstream은 문자열을 추출해내는 작업이다. 여기서는 입력스트림으로 사용한다.
- getline 설명은 밑에서 3)으로 ㄱ ㄱ
1) 구분자가 있는 경우 split으로 잘라 vector 에 넣기
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;
int main()
{
string str="java c c++ python";
istringstream ss(str);
string stringBuffer;
vector<string> x;
x.clear();
cout<<"어떻게 잘리는지 확인해봅시다 ->";
//구분자가 , 이라면 getline(ss, stringBuffer, ',')쓰면됨
while (getline(ss, stringBuffer, ' ')){
x.push_back(stringBuffer);
cout<<stringBuffer<<" ";
}
cout<<endl<<"vector 값을 출력해보자."<<endl;
for(int i=0;i<x.size();i++){
cout<<x[i]<<endl;
}
return 0;
}
2) about istringstream
- istringstream 은 문자열 포맷을 parsing 할 때 사용합니다.
*얘 자체도 자르는 기능이 있다고 봐야한다..코드를 보면서 확인하시길
=> 문자열에서 필요한 값을 추출하고, 공백과 \n을 무시합니다.
그래서 공백이 있는 문자열을 나누기에는 편하다
- 밑에처럼 str()을 사용하면 문자열 확인 가능
- ss>>str1 ;을 하면 str1에 처음으로 잘린 'java'가 들어간다.
=> 잘린 두개의 문자열을 저장하고 싶으면?
ss>>str1>>str2; 을 하면 str1에는 'java' 가 들어가고 str2에는 'c'가 들어간다.
=> 이걸 이용해 while문에 (ss>>str_copy)이런식으로 조건을 걸어주면 whil문이 알아서 잘린 갯수대로 도는 것같다. => 코드에서 ss_count를 통해 확인 가능
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;
int main()
{
string str="java c c++ python";
istringstream ss(str);
istringstream ss2(str);
string stringBuffer;
string str_copy;
string str_copy2;
vector<string> x;
x.clear();
int ss_count=0;
//ss.str()을 하면 알아서 문자열이 추출된다.
cout<<"1결과-> "<<ss.str()<<endl;
//ss의 사이즈는 문자열의 길이가 출력된다.
cout<<"ss의 size: "<<ss.str().size()<<endl;
//잘린 ss를 이런식으로 다른 문자열에 copy할 수 있다.
cout<<"다른 문자열에 복사(옮기기)-> ";
while(ss>>str_copy){
cout<<str_copy<<",";
}
cout<<endl;
//vector에 넣으려했는데 ss가 몇개로 나뉜건지 size를 알수가 없다..그래서 ss2>>str_copy2를 조건으로 걸었다.
//ss2를 사용한 이유는 위에서 이미 ss를 사용해서 str_copy에 넣었기 때문에 사용이 안되더라..그래서 ss2와 str_copy2를 만들었다
cout<<"vector에 넣고 확인해봅시다"<<endl;
while(ss2>>str_copy2){
x.push_back(str_copy2);
ss_count++;
}
for(int i=0;i<x.size();i++){
cout<<x[i]<<endl;
}
cout<<"몇개가 잘렸는지 확인해봅시다: "<<ss_count<<endl;
return 0;
}
-3) getline()에 대해
ls : 입력스트림 object
str: 입력받은 문자열을 저장할 string 객체
delim : 구분자로 이 문자에 도달할 시 추출이 중단됨
istream & getline(istream& ls, string& str, delim)
2. find 함수& substr 사용
이건 구분자가 2개이상일때 사용하기 유용하다.
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
using namespace std;
int main()
{
string str="java,c,c++,python";
int previous =0;
int current=0;
vector<string> x;
x.clear();
current= str.find(',');
//find는 찾을게 없으면 npos를 리턴함
while(current!=string::npos){
string substring=str.substr(previous,current-previous);
x.push_back(substring);
previous = current+1;
current=str.find(',',previous);
}
x.push_back(str.substr(previous,current-previous));
for(int i=0;i<x.size();i++){
cout<<x[i]<<endl;
}
return 0;
}
https://makedotworld.tistory.com/28
'까먹어서 다시하는 c++' 카테고리의 다른 글
c++ atoi, stoi 문자열을 int 로 - string to int (0) | 2020.04.24 |
---|---|
c++ equals, equal 함수 구현하기- 문자열 비교하기(==, compare, strcmp) (0) | 2020.04.24 |
c++ STL map (0) | 2019.06.10 |
까먹어서 다시하는 c++ 1일차 (5) | 2019.05.08 |