如何修改Lambda内部的字符串向量

时间:2018-10-22 13:22:15

标签: c++ string vector lambda

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

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

“令牌”向量中的字符串为空,因此“最终”字符串为空。

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();
}

2 个答案:

答案 0 :(得分:3)

这里的问题是您通过reserve调用设置了向量 capacity ,但没有设置其 size (您可以使用{{3 }}或constructor)。

简而言之:您的向量为 empty ,因此循环打印不会因此而重复。

更糟糕的是,由于向量为空,因此所有索引都将超出范围并导致resize

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

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

或者

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

答案 1 :(得分:3)

您在这里有未定义的行为,例如

token.reserve(row);

分配足够的内存来容纳row个元素,但不会更改向量的大小。因此,在lamdba内为token编制索引

token[count%row] += c;

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

token.resize(row);