[英]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&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.