我从我在问题上得到的答案中得到了这个向量函数
vector<string> split(const string& s, char delim)
{
vector<string> elems(2);
string::size_type pos = s.find(delim);
elems[0] = s.substr(0, pos);
elems[1] = s.substr(pos + 1);
return elems;
}
但是,它只接受2个元素。如何根据字符串s中存在多少分隔符来修改它以接受?
例如,如果我有这个:
user#password#name#fullname#telephone
有时候尺寸可能不同。
无论有多少元素,如何能够灵活地使这个功能工作,并且能够像上面这个函数一样分割?
只是为了进一步解释我的问题:
我想要实现的是使用此向量函数进行拆分的能力,相同的分隔符为N大小而不是固定为大小为2.
此函数只能拆分字符串中的最大2个元素,而不是分割核心转储
中的结果如前所述我只需要使用
user:pass
现在我添加了更多属性,所以我需要能够拆分
user:pass:name:department
其中x [2]和x [3]将分别返回名称和部门
他们都将使用相同的分隔符。
进一步更新:
我尝试使用以下答案中提供的此功能
vector<string> split(const string& s, char delim)
{
bool found;
vector<string> elems;
while(1){
string::size_type pos = s.find(delim);
if (found==string::npos)break;
elems.push_back(s.substr(0, pos));
s=s.substr(pos + 1);
}
return elems;
}
我收到了一些错误
server.cpp: In function ‘std::vector<std::basic_string<char> > split(const string&, char)’:
server.cpp:57:22: error: passing ‘const string {aka const std::basic_string<char>}’ as ‘this’ argument of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]’ discards qualifiers [-fpermissive]
答案 0 :(得分:1)
vector<string> elems;
while(1){
string::size_type pos = s.find(delim);
if (found==string::npos)break;
elems.push_back(s.substr(0, pos));
s=s.substr(pos + 1);
}
if(s.size())elems.push_back(s);
return elems;
答案 1 :(得分:0)
嗯,嗯,请查看push_back
成员函数...
答案 2 :(得分:0)
几乎重复的one answer提供了通用的分割功能:
std::vector<std::string> split(std::string const& str, std::string const& delimiters = "#") {
std::vector<std::string> tokens;
// Skip delimiters at beginning.
string::size_type lastPos = str.find_first_not_of(delimiters, 0);
// Find first "non-delimiter".
string::size_type pos = str.find_first_of(delimiters, lastPos);
while (string::npos != pos || string::npos != lastPos) {
// Found a token, add it to the vector.
tokens.push_back(str.substr(lastPos, pos - lastPos));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
// Find next "non-delimiter"
pos = str.find_first_of(delimiters, lastPos);
}
return tokens;
}
可以很容易地包装到:
std::vector<std::string> split(std::string const& str, char const delimiter) {
return split(str,std::string(1,delimiter));
}