使用变换填充向量后,新的 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 在&lt;iterator&gt; @DavidPetriashvili 一般来说,迭代器不可能从它正在迭代的容器中插入或删除。只有从 back_inserter 返回的那种专门的迭代器才能做到这一点。 @john 是的,我明白了,我实际上尝试过执行 front_inserter,但代码出错了。从前面做同样的事情有什么问题? (添加了 库) @DavidPetriashvili - 查阅您使用的迭代器和容器的文档。 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 循环不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在for循环C ++之外访问向量[关闭]

用向量填充c ++中的简单动态数组[重复]

通过for循环将值附加到向量不起作用

如何通过使用for循环c ++放入另一个向量来组织一个向量

C ++:终止遍历字符串向量的循环的最优雅方法?

填充二维向量的parallel_for lambda函数后出错