【问题标题】:How to modify the vector of strings inside the lambda如何修改 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();
}

【问题讨论】:

    标签: c++ string vector lambda


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2016-07-06
        • 1970-01-01
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 2020-01-20
        相关资源
        最近更新 更多