C ++有人可以解释string()

时间:2013-12-10 15:23:49

标签: c++

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而不是那条长行替换这一行。

3 个答案:

答案 0 :(得分:4)

  

这条线的用途是什么?

find_first_ofkar中找到第一个出现的任何字符,从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超出范围并被销毁 - 这是暂时的。