首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建QList的深层副本(QT4.8)

如何创建QList的深层副本(QT4.8)
EN

Stack Overflow用户
提问于 2015-05-18 15:36:32
回答 1查看 11.9K关注 0票数 5

我试图制作一个QList的深拷贝,我正在使用QT4.8。在下面的代码中,mDataTest类的一个QList<unsigned char>成员变量。

在最初的例子中,我认为下面的代码应该可以工作,但是深入研究Qt的隐式共享(即在写上复制)的概念,我怀疑这是否是正确的方法。

代码语言:javascript
复制
Test::Test(QList<unsigned char> &aData) {
    mData.QList(aData);
}

根据Qt的说法

QList:: QList (const QList等) 构造另一个副本。 此操作需要恒定的时间,因为QList是隐式共享的。这使得从函数返回QList的速度非常快。如果一个共享实例被修改,它将被复制(在写上复制),这需要线性时间。

我想确保如果aData超出了范围,或者aData的内容被修改了,这不会改变mData的内容。这是否可能不需要分别迭代和复制每个列表条目?

注意:这不是Qt 4.5 - QList::QList(const QList&) - is this a deep copy constructor?的复制,因为这个问题含蓄地问如何创建深拷贝,而不是,如果是深拷贝的话。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-18 16:33:16

如果需要,Qt的隐式复制机制将自动创建QList的深度副本。

代码语言:javascript
复制
QList<int> a;
a.append(1);
a.append(2);

现在我们有一个具有两个值的列表a

代码语言:javascript
复制
QList<int> b = a;
// a = 1, 2
// b = 1, 2

b的副本与a相同。这两个列表共享相同的数据,因此复制操作几乎不需要时间,但是b在内部被标记为副本。

代码语言:javascript
复制
b.append(3);
// a = 1, 2
// b = 1, 2, 3

另一个例子是:

代码语言:javascript
复制
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上的某些内容,就会生成一个隐式的深拷贝。无论如何修改复制的列表,它都适用于任何方法。

如果您使用的是引用,则没有自动生成的深度副本:

代码语言:javascript
复制
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

要执行深度复制,只需在函数中复制列表。但是当然,最好将参数作为复制传递,而不是作为引用传递,这样可以简化代码。

代码语言:javascript
复制
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和任何类似于原始数据类型(如intQString )的Qt容器。隐式复制在“背景”中自动完成。

你的例子

因此,您的示例应该使用一个简单的副本:

代码语言:javascript
复制
class Test {
    QList<int> _m;
public:
    Test(QList<int> m) : _m(m) {
    }    
}

Test自动创建参数m的深度副本。由于隐式复制机制,使用参数m的副本并不比使用引用慢得多。深度复制在列表的第一次修改时自动完成。

如果要使用引用,请使用const引用:

代码语言:javascript
复制
class Test {
    QList<int> _m;
public:
    Test(const QList<int> &m) : _m(m) {
    }    
}

这也将创建一个隐式的深拷贝。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30307391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档