gpt4 book ai didi

python - C++:迭代时std::vector中的push_back

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:28 25 4
gpt4 key购买 nike

以下代码片段提供了一个非常奇怪的输出。我期待一个溢出(Python 给出一个 MemoryError)

#include <iostream>
#include <vector>

int main()
{
std::vector<int> a{1,2,3};

for( auto const & item : a)
a.push_back(item);


for( auto const & item : a)
std::cout<<item<<',';

return 0;
}

输出:1,2,3,1,0,3,

如何解释这个结果?

如果你在 Python 中做类似的事情,它会给出一个内存错误。

>>> a = range(0,20)
>>> for i in a:
a.append(i)



Traceback (most recent call last):
File "<pyshell#3>", line 2, in <module>
a.append(i)
MemoryError

>>>

我想到了这个问题,因为上面的代码编写方式被认为是绑定(bind)安全的。对于绑定(bind)安全容器,在 foreach type iteration 期间不应增长/收缩。所以,这是一个有漏洞的抽象。

有没有一种方法可以包装这个 foreach 循环,以便在循环体中不允许任何导致大小修改/重新分配的操作。

最佳答案

在 C++ 中,向 vector 添加元素可能会导致重新分配包含的数据,这将使所有迭代器失效。这意味着您不能在插入新元素的同时使用迭代器遍历 vector (这是基于范围的 for 循环所做的)。

但是您可以使用索引进行迭代并使用 vector 大小作为条件,因为索引将始终相同。

关于python - C++:迭代时std::vector中的push_back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35938329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com