2017-06-14 90 views
-2

我有一个函数来标记一个向量字符串,并返回没有分隔符的地方。但是,我想用分隔符返回。Tokenize返回一个包含分隔符的向量 - C++

希望的输出: tokenize("<ab><>cd<", "<>")

  • 应显示: “<”, “AB”, “>”, “<”, “>”, “CD”, “<”

这里是我的功能:

vector<string> tokenize1(const string& s, const string& delim) { 

vector<string> tokens; 

string::size_type lastPos = s.find_first_not_of(delim, 0); 
string::size_type pos = s.find_first_of(delim, lastPos); 

while (string::npos != pos || string::npos != lastPos) { 
    tokens.push_back(s.substr(lastPos, pos - lastPos)); 
    lastPos = s.find_first_not_of(delim, pos); 
    pos = s.find_first_of(delim, lastPos); 
} 

return tokens; 

} 
+0

根据定义,标记化函数会丢弃分隔符。你想要做的是别的。目的是什么? – ZDF

回答

0

我不太清楚为什么你想这样做,但你已经有了几乎所有的代码。这里有一个小修改,它将单个分隔字符填充到令牌向量中(如果您很乐意返回分隔符块,例如"><>"而不是"<", ">", "<"),并向其中添加整个非分隔符块,则会进行更改。

std::vector<std::string> tokenize2(const std::string& s, const std::string& delim) 
{ 
    std::vector<std::string> tokens; 

    auto nextDelimiter = s.find_first_of(delim, 0); 
    auto nextNonDelimiter = s.find_first_not_of(delim, 0); 

    while (std::string::npos != nextDelimiter || std::string::npos != nextNonDelimiter) 
    { 
    if (nextNonDelimiter > nextDelimiter) 
    { 
     for (auto d = nextDelimiter; d < nextNonDelimiter && d < s.size(); d++) 
     tokens.push_back(s.substr(d, 1)); 

     nextDelimiter = s.find_first_of(delim, nextNonDelimiter); 
    } 
    else 
    { 
     tokens.push_back(s.substr(nextNonDelimiter, nextDelimiter - nextNonDelimiter)); 
     nextNonDelimiter = s.find_first_not_of(delim, nextDelimiter); 
    } 
    } 

    return tokens; 
} 

注意使用auto(因为我们活在未来,现在)和std::(因为using namespace std;被认为是不好的做法,有很好的理由)。

+0

谢谢!是的,你说得对,我们应该从现在开始使用汽车。 – user2163449

相关问题