首先,我是 C 和 Qt 的完整初學者,我正在使用 Qt 6.2 和 C 11。這是我有問題的代碼:
QSet<QList<QString>> listSet;
for(int i = 0; i < 10; i )
{
QList<QString> myList;
for(int r = 0; r < 10; r )
{
myList << "Item" QString::number(r);
}
listSet.insert(myList);
}
qInfo() << listSet.count();
我原以為我會得到“10”的輸出,但我得到的是“1”。我將代碼更改為此,它解決了問題,但我無法解決它:
QSet<QList<QString>> listSet;
for(int i = 0; i < 10; i )
{
QList<QString> myList;
myList << "default" QString::number(i);
for(int r = 0; r < 10; r )
{
myList << "Item" QString::number(r);
}
listSet.insert(myList);
}
qInfo() << listSet.count();
我想知道為什么 C 會這樣。
uj5u.com熱心網友回復:
QSet是獨特物件的集合。剪下的第一個代碼產生 10 個彼此相等的myList物件。因此,QSet只得到一個唯一的myList物件:qInfo() << listSet.count();輸出 1。
第二個片段生成不相等的myList物件,它們的區別在于第一個串列項,并qInfo() << listSet.count();輸出 10。
uj5u.com熱心網友回復:
想一想:
using StringList = QList<QString>;
using SetOfStringLists = QSet< StringList >;
因此,您正在定義一組字串串列。
但是,您在內回圈中創建的所有串列都完全相同。
因此該集合將只保留一個!這實際上是預期的行為。
當您添加更改時
myList << "default" QString::number(i);
然后你讓每一個添加的專案都是獨一無二的,因為i它在外回圈中!
我確實編譯并運行了你的第一個例子,修改如下
#include <QSet>
#include <QList>
#include <QDebug>
int main()
{
QSet<QList<QString>> listSet;
for(int i = 0; i < 10; i )
{
QList<QString> myList;
//myList << "default" QString::number(i);
for(int r = 0; r < 10; r )
{
myList << "Item" QString::number(r);
}
listSet.insert(myList);
qInfo() << myList;
}
qInfo() << listSet.count();
}
它輸出
$ ./testqt
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
1
當你注釋掉你添加的那行時,它變成
$ ./testqt
("default0", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default1", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default2", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default3", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default4", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default5", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default6", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default7", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default8", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
("default9", "Item0", "Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
10
uj5u.com熱心網友回復:
QSet 基于哈希
QSet 基于hash;如果兩個項的哈希值相等,則 QSet不會開辟新空間。而QList的hash計算方法是基于它的元素。
換句話說,如果兩個 QList 具有相同的元素,它們將具有相同的哈希值。而且,因為它們具有相同的哈希值,所以 QSet 不會開辟新的空間。
從您的第一個代碼:每個 qlist 都具有相同的元素:
{"Item0","Item1","Item2","Item3",....}
因為它們具有相同的元素,所以它們將具有相同的哈希值。最后,QSet 將只有一個元素。
但是,在您的第二個代碼中,每個 qlist 都有不同的哈希值:
qlist0: {"default0", "Item0", "Item1", ...}
qlist1: {"default1", "Item0", "Item1", ...}
...
...
可以看到,每個qlist的第一個元素都不一樣,因此會有不同的hash,QSet會為每個qlist開辟一個新的空間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/392574.html
上一篇:Python子行程沒有將大括號作為引數傳遞?或者雙引號的問題
下一篇:Qt事件資料解構式
