如何修改 lambda 中的字符串向量

Posted

技术标签:

【中文标题】如何修改 lambda 中的字符串向量【英文标题】:How to modify the vector of strings inside the lambda 【发布时间】:2018-10-22 13:22:14 【问题描述】:

如何将字符串的向量传递给 lambda 并将字符复制到向量?

这里我捕获向量作为参考,但是一旦 for_each 完成,所有

“token”向量中的字符串为空,因此“final”字符串为空。

string encryption(string s) 

    string test;

    std::copy_if(s.begin(), s.end(), back_inserter(test), [](char c)
              
                  if (isspace(c))
                  
                      return false;
                  

                  return true;
              );

    int size = s.size();
    float number = sqrt(size);

    int row = ceil(number);
    int col = floor(number);

    while ((row * col) < size)
    
        row++;
    

    std::vector<string> token;
    token.reserve(row);

    for_each(test.begin(), test.end(), [&](char c) mutable
             
                 static int count = 0;
                 token[count%row] += c;
                 cout << token[count%row] << endl;
                 count++;
             );


    stringstream final;
    std::copy(token.begin(), token.end(), std::ostream_iterator<string>(final, " "));
    return final.str();

【问题讨论】:

【参考方案1】:

这里的问题是您使用reserve 调用设置向量容量,而不是它的大小(使用constructor 或@ 987654323@).

简而言之:您的向量是空的,因此循环打印根本不会迭代。

更糟糕的是,因为向量是空的,所有对它的索引都会越界并导致undefined behavior

简单的解决方法是设置向量的大小

std::vector<string> token(row);

或者

std::vector<string> token;
token.resize(row);  // Using *resize* to set the size

【讨论】:

【参考方案2】:

你在这里有未定义的行为,因为

token.reserve(row);

分配足够的内存来保存row 元素,但不会改变向量的大小。因此,在 lamdba 中索引 token

token[count%row] += c;

是越界访问。要解决此问题,请将对 std::vector::reserve 的调用更改为对 std::vector::resize 的调用:

token.resize(row);

【讨论】:

以上是关于如何修改 lambda 中的字符串向量的主要内容,如果未能解决你的问题,请参考以下文章

lambda 中的 Java 8 lambda 无法从外部 lambda 修改变量

如何更改 lambda 表达式中的字符串变量?

使用 GCC 向量扩展存储、修改和检索字符串?

如何将包装为字符串的向量转换为熊猫数据框中的numpy数组?

使用 http 端点访问 lambda 中的 HTTP 请求(标头、查询字符串、cookie、正文)对象

如何从 C++ 中的两个字符串向量创建一个字符串?