首页 > 解决方案 > 如何修改 lambda 中的字符串向量

问题描述

如何将字符串向量传递给 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();
}

标签: c++stringvectorlambda

解决方案


这里的问题是您通过调用设置了向量容量reserve而不是它的大小(您使用构造函数或设置resize)。

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

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

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

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

或者,

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

推荐阅读