如何修改 lambda 内部字符串的向量
How to modify the vector of strings inside the lambda
如何将字符串的向量传递给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);
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 将字符串存储在c++中的稳定内存中
- 编译包含字符串的代码时遇到问题
- 如何修改 lambda 内部字符串的向量
- 如何创建一个函数来提取向量内部字符串中的字段?
- 在字符串的内部找到多个子字符串
- 如何查找查看一个字符串是否位于另一个字符串内部并替换它
- 每个循环从基本字符串到内部矢量的转换
- 内部字符串/字符如何在 int 和 float 中存储
- 在QStringList内部查看重复的字符串并获得重复的数量
- C++ - 将输入字符串作为内部代码变量进行评估
- c++使用字符串流从字符串内部提取int
- 为每个使用内部字符串时运行时错误
- Windows NT 二进制可执行文件内部常量字符串编码
- 来自字符串库组件内部的"error: invalid operands to binary expression"
- 如何使用c++ 11语言环境工具来使用UTF-8作为字符串的内部表示
- 类内部结构内部的字符串
- Qt正则表达式增强正则表达式转换从字符串内部取数
- 添加Mono内部调用,其中字符串通过引用传递
- 函数内部的字符串文字:自动变量或在堆中分配的