반응형
std :: string을 벡터로 분할하는 올바른 방법
중복 가능성 :
문자열을 분할하는 방법?
문자열을 문자열 벡터로 분할하는 올바른 방법은 무엇입니까? 구분자는 공백 또는 쉼표입니다.
공백으로 구분 된 문자열의 경우 다음을 수행 할 수 있습니다.
std::string s = "What is the right way to split a string into a vector of strings";
std::stringstream ss(s);
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
산출:
What
is
the
right
way
to
split
a
string
into
a
vector
of
strings
쉼표와 공백이 모두있는 문자열
struct tokens: std::ctype<char>
{
tokens(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table()
{
typedef std::ctype<char> cctype;
static const cctype::mask *const_rc= cctype::classic_table();
static cctype::mask rc[cctype::table_size];
std::memcpy(rc, const_rc, cctype::table_size * sizeof(cctype::mask));
rc[','] = std::ctype_base::space;
rc[' '] = std::ctype_base::space;
return &rc[0];
}
};
std::string s = "right way, wrong way, correct way";
std::stringstream ss(s);
ss.imbue(std::locale(std::locale(), new tokens()));
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
산출:
right
way
wrong
way
correct
way
편리한 방법은 boost의 문자열 알고리즘 라이브러리 입니다.
#include <boost/algorithm/string/classification.hpp> // Include boost::for is_any_of
#include <boost/algorithm/string/split.hpp> // Include for boost::split
// ...
std::vector<std::string> words;
std::string s;
boost::split(words, s, boost::is_any_of(", "), boost::token_compress_on);
문자열에 공백과 쉼표가 모두 있으면 문자열 클래스 함수를 사용할 수 있습니다.
found_index = myString.find_first_of(delims_str, begin_index)
루프에서. ! = npos를 확인하고 벡터에 삽입합니다. 구식을 선호한다면 C를 사용할 수도 있습니다.
strtok()
방법.
vector<string> split(string str, string token){
vector<string>result;
while(str.size()){
int index = str.find(token);
if(index!=string::npos){
result.push_back(str.substr(0,index));
str = str.substr(index+token.size());
if(str.size()==0)result.push_back(str);
}else{
result.push_back(str);
str = "";
}
}
return result;
}
split ( "1,2,3", ",") ==> [ "1", "2", "3"]
split ( "1,2,", ",") ==> [ "1", "2", ""]
split("1token2token3","token") ==> ["1","2","3"]
You can use getline with delimiter:
string s, tmp;
stringstream ss(s);
vector<string> words;
while(getline(ss, tmp, ',')){
words.push_back(tmp);
.....
}
i made this custom function that will convert the line to vector
#include <iostream>
#include <vector>
#include <ctime>
#include <string>
using namespace std;
int main(){
string line;
getline(cin, line);
int len = line.length();
vector<string> subArray;
for (int j = 0, k = 0; j < len; j++) {
if (line[j] == ' ') {
string ch = line.substr(k, j - k);
k = j+1;
subArray.push_back(ch);
}
if (j == len - 1) {
string ch = line.substr(k, j - k+1);
subArray.push_back(ch);
}
}
return 0;
}
참고URL : https://stackoverflow.com/questions/5607589/right-way-to-split-an-stdstring-into-a-vectorstring
반응형
'programing tip' 카테고리의 다른 글
fedora에서 mariadb의 기본 비밀번호는 무엇입니까? (0) | 2020.12.06 |
---|---|
NULL 필드 CONCAT (0) | 2020.12.06 |
EditText의 Android 키보드 다음 버튼 문제 (0) | 2020.12.06 |
JavaScript를 사용하여 HTML 16 진수 색상 코드를 무작위로 생성하는 방법은 무엇입니까? (0) | 2020.12.06 |
프로그래밍 방식으로 UIsegmentedControll을 어떻게 전환합니까? (0) | 2020.12.06 |