如何在C ++中返回foreach循环的值?

时间:2019-05-23 10:41:16

标签: c++ string c++11 boost

我需要多行字符串,然后加上空格。

我正在使用boost :: split来分割字符串并将值分配给向量。然后在for-each循环中,我向向量值添加空格。

static string test(){

    std::string text = "This is a sentence.\nAnd another sentence";
    string nl = "\n";
    string pad="     ";
    string txt;
    std::vector<std::string> results;

    boost::split(results, text, boost::is_any_of(nl));

    for(string line : results){
      txt = pad + line + nl;
      cout << txt;
    }
    return txt;
  }

我应该得到如下的返回值。 cout结果正确,但无法获得返回值txt。

      This is a sentence.
      And another sentence

4 个答案:

答案 0 :(得分:2)

拥有

 for(string line : results){
   txt = pad + line + nl;
   cout << txt;
 }
 return txt;

返回 txt 是循环中pad + line + nl last 值,如果 results 为空,则为空字符串

  

cout结果正确,但无法获取返回值txt。

可能意味着您只需要折叠每个字符串并返回结果:

string r;

for(string line : results){
  txt = pad + line + nl;
  cout << txt;
  r += txt;
}
return r;

或类似的东西可能没有 pad

答案 1 :(得分:1)

另一种方式:

static string test(){
    std::string text = "This is a sentence.\nAnd another sentence\n";
    std::string result = "   " + boost::algorithm::replace_all_copy(s, "\n", "\n    ");
    std::cout << result;
    return result;
}

答案 2 :(得分:1)

您的循环:

for(string line : results){
  txt = pad + line + nl;
  cout << txt;
}
return txt;
在每次循环迭代中

重置txt(并且一次打印一次该迭代的文本)。这样一来,循环之后您将只剩下最终迭代的值。

相反,将追加附加到txt以保留所有值。因此,您还需要将cout提升到循环之外:

for(string line : results){
  txt += pad + line + nl;
}
cout << txt;
return txt;

答案 3 :(得分:1)

我将显示已构建矢量的函数部分。因此,我将展示的功能得到了简化,但演示了如何构建和返回结果字符串。

#include <iostream>
#include <string>
#include <vector>

static std::string test( const std::vector<std::string> &results )
{    
    const std::string pad( "     " );

    std::string::size_type n = 0;
    for ( const std::string &s : results ) n += s.length();

    n += results.size() * ( pad.size() + sizeof( '\n' ) );

    std::string txt;
    txt.reserve( n );

    for ( const std::string &s : results ) txt += pad + s + '\n';

    return txt;
}

int main()
{
    std::vector<std::string> results = { "This is a sentence.", "This is a sentence." };

    std::cout << test( results );
}

程序输出为

 This is a sentence.
 This is a sentence.

要使代码更有效,您应该为字符串txt保留足够的空间。循环

    for ( const std::string &s : results ) n += s.length();

计算向量中存储的所有字符串的总大小。

注意:例如,您可以使用标头std::accumulate中声明的标准算法<numeric>而不是循环

std::string::size_type n = std::accumulate( std::begin( results ), std::end( results ), 
                                            std::string::size_type( 0 ),
                                            []( const std::string::size_type acc, const std::string &s )
                                            {
                                                return acc + s.size();
                                            } );

然后,为每个字符串添加填充空格的长度和字符'\n'的长度。

因此,所有人都准备构建从函数返回的结果字符串。

std::string txt;
txt.reserve( n );

for ( const std::string &s : results ) txt += pad + s + '\n';

return txt;