Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建QList的深度副本(Qt4.8)_C++_Qt - Fatal编程技术网

C++ 如何创建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

我正在尝试制作QList的深度副本,我正在使用Qt4.8。在下面的代码中,
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) {
    }    
}