我需要存儲QSet [QTime](或類似的)數據。我想要做的事情是讓在範圍內的元素,其中A和B可以不存在即獲取由不存在的元素限制的QSet的子集
矢量[INT] 5 7 9 11 13 範圍(6,11)=> 7 9 11
的子集可能嗎?也許有更好的方法呢? 感謝您的建議
我需要存儲QSet [QTime](或類似的)數據。我想要做的事情是讓在範圍內的元素,其中A和B可以不存在即獲取由不存在的元素限制的QSet的子集
矢量[INT] 5 7 9 11 13 範圍(6,11)=> 7 9 11
的子集可能嗎?也許有更好的方法呢? 感謝您的建議
明顯的解決方案是std::set<QTime>
。它是訂購,並提供lower_bound
和upper_bound
方法。這些不需要實際的邊界出現在集合中。
當然可以編寫代碼來做到這一點,但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
確實有秩序,這消息給我!)
計算機科學中的「set」一詞與C++中的std :: set非常不相關,它明確地被命令(如oppposed到'std :: unordered_set') – MSalters
std :: set有順序嗎?我在別處見過的每一套「集合」都不能保證順序。 STL不是我用過的東西,已經足以注意到這一點......我曾希望他們稱他們爲「ordered_set」和「set」。感謝您指出這一點,我會研究他們的推理。 – HostileFork
是的,它甚至是一個模板參數:'template
+1對於新來的事實...雖然我會提到Qt集合類在基於Qt的整體項目中提供了幾個與標準庫不同的特性。與我的代碼庫最相關的是線程安全的隱式共享:http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html – HostileFork
隱式共享已被證明是多線程應用程序中的一個負擔。擁有多個獨立副本比單個副本更好。內存很便宜,同步不是。 – MSalters