C++ 如何创建QList的深度副本(Qt4.8)
我正在尝试制作QList的深度副本,我正在使用Qt4.8。在下面的代码中,C++ 如何创建QList的深度副本(Qt4.8),c++,qt,C++,Qt,我正在尝试制作QList的深度副本,我正在使用Qt4.8。在下面的代码中,mData是Test类的QList成员变量 首先,我认为下面的代码应该可以工作,但是深入研究Qt的隐式共享(即写时复制)概念,我怀疑这是否是正确的方法 Test::Test(QList<unsigned char> &aData) { mData.QList(aData); } Test::Test(QList&aData){ mData.QList(aData); } 根据Qt, QLis
mData
是Test
类的QList
成员变量
首先,我认为下面的代码应该可以工作,但是深入研究Qt的隐式共享(即写时复制)概念,我怀疑这是否是正确的方法
Test::Test(QList<unsigned char> &aData) {
mData.QList(aData);
}
Test::Test(QList&aData){
mData.QList(aData);
}
根据Qt,
QList::QList(常量QList和其他)
构造其他对象的副本
此操作需要固定的时间,因为QList是隐式的
共享。这使得从函数返回QList非常快。如果
修改共享实例后,将复制它(写入时复制),然后
这需要线性时间
我想确保如果aData
超出范围,或者如果aData
的内容被修改,这不会改变mData
的内容。这是否可能,而不必分别迭代和复制每个列表条目
注意:这不是的副本,因为此问题隐式询问如果某事物是深度副本,如何创建深度副本”,而不是。如果需要,Qt的隐式复制机制将自动创建
QList
的深度副本
QList<int> a;
a.append(1);
a.append(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
类Test
自动创建参数m
的深度副本。由于隐式复制机制,使用参数m
的副本并不比使用引用慢多少。深度副本在第一次修改列表时自动完成
如果要使用引用,请使用常量引用:
class Test {
QList<int> _m;
public:
Test(const QList<int> &m) : _m(m) {
}
}
类测试{
QList_m;
公众:
测试(常数列表和m):\u m(m){
}
}
这也将创建一个隐式深度复制。“我怀疑这是否是正确的方法“-你试过看会发生什么吗?请注意,容器在写入时具有副本的概念意味着,如果创建副本并更改源容器,副本将保留原始内容,而不保留对源所做的更改。可能的副本不是副本,请参阅我在问题底部添加的注释。
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
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
class Test {
QList<int> _m;
public:
Test(QList<int> m) : _m(m) {
}
}
class Test {
QList<int> _m;
public:
Test(const QList<int> &m) : _m(m) {
}
}