gpt4 book ai didi

C++ 浅拷贝和深拷贝 - 反射(reflect) vector 的 num_items 的变化

转载 作者:搜寻专家 更新时间:2023-10-31 00:14:08 27 4
gpt4 key购买 nike

我目前正在大学学习 C++ 类(class)。我了解使用 vector 进行浅层和深层复制的一般概念,但是我的教科书中有一个例子让我感到困惑。

请假设它是一个实现不佳的 vector ,没有定义复制构造函数,因此它只执行数据的浅拷贝。

我明白第一部分发生了什么

In the statement

vector<int> v2(v1);

vector v1作为常量引用参数传递给 vector 拷贝 构造函数,所以 v1无法更改,变量v2然后是 初始化为 vector 的拷贝 v1 .每个数据字段将是 复制,以及以后对 v2 所做的任何更改应该不会影响 v1 .什么时候 v1.the_data 中的值复制过来,都是v1.the_datav2.the_data将指向同一个数组

因为 v1.the_datav2.the_data指向同一个对象, 声明

v1[2] = 10;

也改变了v2[2] .为此,v2被认为是浅拷贝 的 v1 .

但是我很难理解这部分。我不太清楚为什么 v2.num_items也不会在浅拷贝中改变。

The statement

v1.push_back(20);

will insert 20 into v1[5] and will change v1.num_items to 6, but will not change v2.num_items.

我目前的想法是 v1.the_datav2.the_data指向内存中的同一位置,因此它们“共享”相同的 vector ,因此当将 20 添加到它的末尾时,两个 vector 都应该获得一个额外的整数。

如果能帮助我理解为什么 v2 的项目数量不会改变,我将不胜感激。什么时候v1已修改。

最佳答案

假设我们正在谈论标准的 std::vector :

当您在此语句中复制 vector 时:

vector<int> v2(v1);

v2 是通过复制 v1 的每个元素构建的。 v1 和 v2 不共享任何内存。

这部分:

both v1.the_data and v2.the_data will point to the same array

Because v1.the_data and v2.the_data point to the same object,

错了。

您可以通过将每个 vector 的底层数组地址与 data() member function 进行比较来说服自己。 .

编辑:

假设您疯狂到不使用 std::vector 并使用在复制时“共享”其后端数组的实现(我不会谈论此设计的问题:谁拥有数组?谁删除[]它?)

你的老师提出的问题是当v1被修改时(例如添加一个元素),v2不知道它,并且大小不变。

对一个 vector 所做的任何 push_back(或类似操作)都应该被数组的其他所有所有者观察到,以正确反射(reflect)数组的大小。

要么:

1) 你实现某种观察者模式让每个 vector 知道任何修改(这比听起来更难)

2) 您使用技巧将长度存储在后端数组本身中。

当通过其中一个 vector 引用修改“共享”数组时,您会遇到类似的问题,使每个迭代器都无效……一场噩梦! STL 容器全部设计为管理它们自己的内存,因此始终提供深层复制语义,这是有充分理由的。

关于C++ 浅拷贝和深拷贝 - 反射(reflect) vector 的 num_items 的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24265124/

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