C++中vector嵌套容器push_back是否复制元素的疑问
C++ 嵌套vector与Java嵌套ArrayList的行为差异
是的,每次调用vec.push_back(temp)时,C++都会创建temp的独立副本并插入到vec中。
C++ 侧行为解析
C++的vector遵循值语义:当你将一个vector对象传入push_back时,容器会调用该对象的拷贝构造函数,生成一个完全独立的副本存入容器。这个副本拥有自己的内存空间,和原temp对象互不干扰。
你的代码执行流程对应的状态变化:
- 第一次
push_back:temp为[1],vec中存入该状态的副本; - 第二次
push_back:temp新增元素后变为[1,2],vec中存入这个新状态的副本; - 第三次
push_back:temp移除最后一个元素回到[1],vec再次存入当前状态的副本。
最终运行代码输出:
vec size: 3 1 1 2 1
Java 侧行为解析
Java的ArrayList遵循引用语义:你向容器中添加的不是对象本身,而是指向该对象的引用。三次add(temp)操作,本质是把同一个temp对象的引用重复存入外层ArrayList。
后续对temp的修改(添加、移除元素)都是直接修改同一个对象的内容,因此遍历外层容器时,所有引用指向的都是temp的最终状态,输出为:
List size: 3 1 1 1
内容的提问来源于stack exchange,提问作者give_it_a_bit
相关产品推荐
相关产品推荐

