vector< string > tokenize( string in, string kar ) {
string::iterator cp = in.begin();
vector< string > oot;
while( cp != in.end() ) {
while( cp != in.end() && count( kar.begin(), kar.end(), *cp ) )
cp++;
if( cp != in.end() )
oot.push_back( string( cp, find_first_of( cp, in.end(), kar.begin(), kar.end() ) ) );
cp = find_first_of( cp, in.end(), kar.begin(), kar.end() );
};
return oot;
};
有人可以解释这一行:
string( cp, find_first_of( cp, in.end(), kar.begin(), kar.end() )
这条线的用途是什么? 我想我们可以用单个单词* cp而不是那条长行替换这一行。
答案 0 :(得分:4)
这条线的用途是什么?
find_first_of
在kar
中找到第一个出现的任何字符,从cp
到字符串的结尾(如果没有找到,则给出字符串的结尾)。 kar
包含用于分隔标记的字符,因此会查找以cp
开头的标记的结尾。
然后创建一个包含cp
中字符的字符串,但不包括找到的分隔符。这个字符串是一个令牌,所以把它推到我们要返回的令牌序列上。
我想我们可以用单个词
替换这一行*cp
不,*cp
是单个字符,而不是单个字。要获取整个令牌,您需要找到令牌的结尾,这就是此代码的作用。
您可以通过仅搜索令牌的结尾来简化代码:
if (cp != in.end()) {
string::iterator token_end = find_first_of( cp, in.end(), kar.begin(), kar.end() );
oot.push_back(string(cp, token_end));
cp = token_end;
}
答案 1 :(得分:2)
这构造了一个基于两个迭代器的字符串,cp
启动迭代器,以及first_first_of()
的结果,看起来它正在寻找范围kar.begin() -> kar.end()
范围内的第一个元素cp
结束字符串in
。
所以,不,你不能做你刚才所说的(任何方式*cp
都是一个角色。)
答案 2 :(得分:1)
此代码:
string( cp, find_first_of( cp, in.end(), kar.begin(), kar.end() )
使用提供的4个参数创建std::
字符串的未命名(即匿名)实例。
在更广泛的背景下看待这一点:
oot.push_back( string( cp, find_first_of( cp, in.end(), kar.begin(), kar.end() ) ) );
显示构造的未命名字符串随后传递给push_back
。此代码完成后,未命名的string
超出范围并被销毁 - 这是暂时的。