使用变换填充向量后,新的 c++11 for 循环不起作用
Posted
技术标签:
【中文标题】使用变换填充向量后,新的 c++11 for 循环不起作用【英文标题】:After using a transform to fill up a vector, the new c++11 for loop doesn't work 【发布时间】:2019-08-07 11:25:52 【问题描述】:我目前正在学习 STL,并且正在研究映射、过滤等主题。 我最近学到了很多新东西,比如新的 c++11 for loop(with auto) 我(有点)不了解事情的工作方式,但我想使用“转换”功能来填充另一个向量(映射主题)。但是在我构建程序并运行它之后,它给了我一个错误,如下所示: “无法寻找值初始化的向量迭代器”
我不确定这意味着什么或有什么错误,你们能帮我理解 for 循环的概念以及我在这里做错了什么吗?
p.s 最后,“转换”的运算符是用 lambda 东西(我仍然需要学习并且不知道)在教程中完成的,我尝试制作一个函数并猜测它会起作用。
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;
【问题讨论】:
【参考方案1】:transform
不会扩展范围,它只会写入假定非空的现有范围。 v1
为空,因此无法存储转换结果。您的选择是确保 v1
包含足够的元素以供算法覆盖:
vector<int> v1(v.size());
或者使用std::back_inserter
创建一个迭代器来增加v1
的大小:
transform(v.begin(), v.end(), back_inserter(v1), mult);
【讨论】:
啊,我现在明白这是怎么回事了。还没有学会这个 back_inserter 的东西。它在哪个图书馆?感谢你的回答。我不认为向量中需要有空间,以为它只会插入东西。 @DavidPetriashvili 在<iterator>
@DavidPetriashvili 一般来说,迭代器不可能从它正在迭代的容器中插入或删除。只有从 back_inserter
返回的那种专门的迭代器才能做到这一点。
@john 是的,我明白了,我实际上尝试过执行 front_inserter,但代码出错了。从前面做同样的事情有什么问题? (添加了 std::vector
不支持在前面插入,因为你需要std::deque
【参考方案2】:
这是 UB(未定义的行为),它不填充任何内容:
transform(v.begin(), v.end(), v1.begin(), mult);
你想要的:
std::transform(v.begin(), v.end(), std::back_inserter(v1), mult);
作为一般规则,开始/结束迭代器上的操作不会改变容器的大小。
您的代码只是将数据喷入了一个空缓冲区,从而破坏了内存或更糟。
【讨论】:
感谢您的回答。我是新手,所以我不知道UB是什么意思。你能告诉我吗? UB 是未定义的行为。很糟糕,你的程序可以做任何事情。 明白。谢谢!以上是关于使用变换填充向量后,新的 c++11 for 循环不起作用的主要内容,如果未能解决你的问题,请参考以下文章