2011-10-24 37 views
0

我需要存儲QSet [QTime](或類似的)數據。我想要做的事情是讓在範圍內的元素,其中A和B可以不存在即獲取由不存在的元素限制的QSet的子集

矢量[INT] 5 7 9 11 13 範圍(6,11)=> 7 9 11

的子集

可能嗎?也許有更好的方法呢? 感謝您的建議

回答

1

明顯的解決方案是std::set<QTime>。它是訂購,並提供lower_boundupper_bound方法。這些不需要實際的邊界出現在集合中。

+0

+1對於新來的事實...雖然我會提到Qt集合類在基於Qt的整體項目中提供了幾個與標準庫不同的特性。與我的代碼庫最相關的是線程安全的隱式共享:http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html – HostileFork

+0

隱式共享已被證明是多線程應用程序中的一個負擔。擁有多個獨立副本比單個副本更好。內存很便宜,同步不是。 – MSalters

0

當然可以編寫代碼來做到這一點,但QSet是一個「無序」集合,沒有特別有效的操作來完成你所要求的操作。你很可能一一列舉,並測試每一個元素,看它是否有資格:

QSet<QTime> set; 
QTime earliest = QTime::fromString("1.30", "m.s"); 
QTime latest = QTime::fromString("10.30", "m.s"); 
... 
QSet<QTime> subset; 
QSetIterator<QTime> i (set); 
while (i.hasNext()) { 
    QTime t = i.next(); 
    if ((t >= earliest) && (t <= latest)) { 
     subset.insert(t); 
    } 
} 

如果這還不夠快爲你的目的,你將不得不使用不同的數據結構和技術。如果你想要你的子集進行排序,那麼你需要將它存儲在一個有序的集合中,但是我不會將它稱爲「子集」,而更像是「子範圍」或「切片」。 (這個詞在計算機科學的「設置」,通常意味着元素的順序是不是爲軟件的有趣......但@MSalters指出,std::set確實有秩序,這消息給我!)

+0

計算機科學中的「set」一詞與C++中的std :: set非常不相關,它明確地被命令(如oppposed到'std :: unordered_set') – MSalters

+0

std :: set有順序嗎?我在別處見過的每一套「集合」都不能保證順序。 STL不是我用過的東西,已經足以注意到這一點......我曾希望他們稱他們爲「ordered_set」和「set」。感謝您指出這一點,我會研究他們的推理。 – HostileFork

+0

是的,它甚至是一個模板參數:'template > class set'。即默認值是遞增的,但是'set >'按降序排列。 – MSalters

相關問題