如何修改 lambda 中的字符串向量
Posted
技术标签:
【中文标题】如何修改 lambda 中的字符串向量【英文标题】:How to modify the vector of strings inside the 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();
【问题讨论】:
【参考方案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);
【讨论】:
以上是关于如何修改 lambda 中的字符串向量的主要内容,如果未能解决你的问题,请参考以下文章
lambda 中的 Java 8 lambda 无法从外部 lambda 修改变量
如何将包装为字符串的向量转换为熊猫数据框中的numpy数组?