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

How to modify the vector of strings inside the lambda

本文关键字:内部 字符串 向量 lambda 何修改 修改      更新时间:2023-10-16

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

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

">

token"向量中的字符串为空,因此"最终"字符串为空。

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

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

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

更糟糕的是,由于向量是空的,因此所有索引到其中都将超出界限并导致未定义的行为

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

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

或者或者

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

这里有未定义的行为,如

token.reserve(row);

分配足够的内存来容纳row元素,但不更改矢量的大小。因此,在 lamdba 内部索引token

token[count%row] += c;

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

token.resize(row);