如何创建一个QList的深度拷贝(Qt 4.8)
How to create a deep copy of a QList (Qt 4.8)
我正试图使QList的深度拷贝,我使用Qt 4.8。在下面的代码中,mData
是Test
类的QList<unsigned char>
成员变量。
首先,我认为下面的代码应该工作,但是在Qt的隐式共享(即写时复制)概念中深入研究,我怀疑这是否是正确的方法。
Test::Test(QList<unsigned char> &aData) {
mData.QList(aData);
}
根据Qt,
QList::QList(const QList &其他)
构造另一个的副本。
这个操作花费常量时间,因为QList是隐式的共享。这使得从函数返回QList非常快。如果一个共享实例被修改,它将被复制(copy-on-write),并且这需要线性时间
我想确保如果aData
超出范围,或者如果aData
的内容被修改,这不会改变mData
的内容。这是否可能不需要迭代和复制每个列表条目单独?
注意:这不是Qt 4.5的副本- QList::QList(const QList&) -这是一个深度复制构造函数吗?因为这个问题隐含地问如果是深度拷贝,如何创建深度拷贝而不是。
如果需要,Qt的隐式复制机制将自动创建QList
的深度拷贝。
QList<int> a;
a.append(1);
a.append(2);
现在我们有一个有两个值的列表a
。
QList<int> b = a;
// a = 1, 2
// b = 1, 2
b
的副本与a
相同。这两个列表共享相同的数据,因此复制操作几乎不需要时间,但是b
在内部被标记为副本。
b.append(3);
// a = 1, 2
// b = 1, 2, 3
另一个例子:
QList<int> a;
a << 1 << 2 << 3;
// a = 1, 2, 3
QList<int> b = a;
// a = 1, 2, 3; b = 1, 2, 3
b[0] = 7;
// a = 1, 2, 3; b = 7, 2, 3
一旦你改变了b上的一些内容,就会进行隐式深度复制。如何修改复制的列表并不重要,它适用于任何方法。
如果使用引用,则不会自动生成深拷贝:
void addElement(QList<int> &x, int e) {
x.append(e);
}
QList<int> a;
a.append(1);
a.append(2);
addElement(a, 3);
// a = 1, 2, 3
要强制深度复制,只需在函数内部复制列表。当然,最好将参数作为copy传递,而不是作为引用传递,这样可以简化代码。
void printListPlus1(QList<int> &x) {
QList<int> xCopy = x;
xCopy.append(1);
// print the list
}
QList<int> a;
a << 1 << 2;
// a = 1, 2
printListPlus1(a);
// a = 1, 2
因此,实际上,您可以使用QList和任何其他类似于原始数据类型的Qt容器,如int
或QString
。隐式复制在后台自动完成。
所以你的例子应该只使用一个简单的复制:
class Test {
QList<int> _m;
public:
Test(QList<int> m) : _m(m) {
}
}
类Test
自动创建参数m
的深度拷贝。由于隐式复制机制,使用参数m
的副本并不比使用引用慢多少。深度复制在列表的第一次修改时自动完成。
如果您想使用引用,请使用const引用:
class Test {
QList<int> _m;
public:
Test(const QList<int> &m) : _m(m) {
}
}
这也会创建一个隐式深拷贝
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- OpenGL在启用深度测试时不会丢弃我的碎片
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- C++尝试深度复制唯一指针时出现内存访问冲突
- 试图找到二叉树的深度
- 与浅拷贝构造函数和深拷贝构造函数混淆
- 操纵安卓相机的深度图导致应用程序崩溃
- 深度值没有意义 R200 相机
- 对如何制作双链表的深度副本感到困惑?
- 以C++访问 HoloLens 2 深度图像
- 在 c++ 中使用深度复制的运算符重载
- 使用复制构造函数修复浅拷贝
- 指向指向对象的指针数组的指针的深度拷贝
- 如何执行char *的深度拷贝
- Poco::JSON::Object的深度拷贝
- c++深度拷贝中的内存泄漏
- 链表的深度拷贝
- 一个结构体的深度拷贝,它嵌入了许多简单的变量和一个嵌套结构体
- 如何创建一个QList的深度拷贝(Qt 4.8)
- 多线程深度拷贝