我正在尝试拆分字符串并将其放入矢量
但是,每当有连续的分隔符时,我也想保留一个空标记:
例如:
replace LAPSE2 with Base2.LAPSE for seek(GROUP_T + POL, [Base2])
我想将此字符串标记为:;分隔符 但在诸如::和;之间的分隔符之间 我想在我的向量中插入一个空字符串;
string mystring = "::aa;;bb;cc;;c"
另外我的要求是不要使用升级库。
如果有任何可以借给我一个想法。
感谢
标记字符串但不包含空标记的代码
so my desired output for this string is:
"" (empty)
aa
"" (empty)
bb
cc
"" (empty)
c
答案 0 :(得分:4)
您可以使用一些简单的更改来使算法正常工作。首先,不要在开头跳过分隔符,然后不要在字符串中间跳过分隔符,只需将位置增加1即可。此外,您的npos
检查应确保两个位置都不是npos
,因此它应该是&&
而不是||
。
void Tokenize(const string& str,vector<string>& tokens, const string& delimiters)
{
// Start at the beginning
string::size_type lastPos = 0;
// Find position of the first delimiter
string::size_type pos = str.find_first_of(delimiters, lastPos);
// While we still have string to read
while (string::npos != pos && string::npos != lastPos)
{
// Found a token, add it to the vector
tokens.push_back(str.substr(lastPos, pos - lastPos));
// Look at the next token instead of skipping delimiters
lastPos = pos+1;
// Find the position of the next delimiter
pos = str.find_first_of(delimiters, lastPos);
}
// Push the last token
tokens.push_back(str.substr(lastPos, pos - lastPos));
}
答案 1 :(得分:2)
我有一个使用 iterators 的版本:
std::vector<std::string> split_from(const std::string& s
, const std::string& d, unsigned r = 20)
{
std::vector<std::string> v;
v.reserve(r);
auto pos = s.begin();
auto end = pos;
while(end != s.end())
{
end = std::find_first_of(pos, s.end(), d.begin(), d.end());
v.emplace_back(pos, end);
pos = end + 1;
}
return v;
}
使用您的界面:
void Tokenize(const std::string& s, std::vector<std::string>& tokens
, const std::string& delims)
{
auto pos = s.begin();
auto end = pos;
while(end != s.end())
{
end = std::find_first_of(pos, s.end(), delims.begin(), delims.end());
tokens.emplace_back(pos, end);
pos = end + 1;
}
}