[英]After using a transform to fill up a vector, the new c++11 for loop doesn't work
我目前正在学习STL,我正在研究映射,过滤等主题。我最近学到了很多新东西,比如新的c ++ 11 for loop(有auto)我(有点)不明白工作方式,但我想使用“transform”函数来填充另一个向量(映射主题)。 但是在我构建程序并运行它之后,它给了我一个错误:“无法寻找值初始化的矢量迭代器”
我不确定那意味着什么或有什么错误,你们能帮助我理解for循环概念以及我在这里做错了什么?
ps最后“变换”的操作符是用一个lambda thingy(我仍然需要学习并且不知道)在教程中完成的,我试图创建一个函数并猜测它会起作用。
int mult(int a) {
return a * 10;
}
int main() {
vector<int> v{ 1,2,3,4,5 };
vector<int> v1;
for (auto& i : v) {
cout << i << endl;
}
if (v1.empty()) cout << "v1 is empty" << endl;
cout << "v1" << endl;
transform(v.begin(), v.end(), v1.begin(), mult);
for (auto &i : v1) {
cout << i << endl;
}
}
transform
不会扩展范围,它只会写入假定为非空的现有范围。 v1
为空,因此无法存储转换结果。 您可以选择确保v1
包含足以覆盖算法的元素:
vector<int> v1(v.size());
或者使用std::back_inserter
创建一个增加v1
大小的迭代器:
transform(v.begin(), v.end(), back_inserter(v1), mult);
这是UB(未定义的行为),它不会填充任何内容:
transform(v.begin(), v.end(), v1.begin(), mult);
你要:
std::transform(v.begin(), v.end(), std::back_inserter(v1), mult);
作为一般规则,对开始/结束迭代器的操作不会更改容器的大小。
你的代码只是将数据写入空缓冲区,破坏内存或更糟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.