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