簡體   English   中英

如何創建QList的深層副本(Qt 4.8)

[英]How to create a deep copy of a QList (Qt 4.8)

我正在嘗試制作QList的深層副本,我正在使用Qt 4.8。 在下面的代碼中, mDataTest類的QList<unsigned char>成員變量。

在第一個例子中,我認為下面的代碼應該有效,但是在Qt的隱式共享(即寫時復制)概念中深入探討,我懷疑這是否是正確的方法。

Test::Test(QList<unsigned char> &aData) {
    mData.QList(aData);
}

根據Qt,

QList :: QList(const QList&other)

構造其他的副本。

此操作需要恆定時間,因為隱式共享QList。 這使得從函數返回QList的速度非常快。 如果修改了共享實例,它將被復制(寫時復制),並且需要線性時間。

我想確保如果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

要強制執行深層復制,只需在函數內部復制列表。 但是當然,最好只將參數作為副本傳遞給參考,這簡化了代碼。

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) {
    }    
}

這也將創建隱式深層復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM