2012-06-10 90 views
2

我可以依靠的假設(換句話說:是不是通過標準保證的?)是:C++ set ordered iterating - 迭代集合的結果,按標準排序?

  • set<T>::begin()將指向一套最小的元素?
  • 迭代設置,(從set<T>::begin()set<T>::end())會按遞增順序給元素嗎?
  • 並且只是爲了確定:這些屬性是否適用於map中的密鑰?

我的意思是setmapSTL

P.S.我知道與operator<()並定義自己的比較。請確保我有關此標準的說法嗎?

回答

5

是的,您可以依靠定義,依賴於元素(鍵)bool operator<或比較函數作爲模板參數傳遞給set(map)。所以根據使用的比較器,排序將從最小到最大。

在C++ 11標準,§23.2.4,處理關聯容器的要求:

每個關聯容器參數對密鑰和一個排序關係比較誘導嚴格弱序(25.4 )在Key的元素上。另外,map和multimap將任意類型T與Key關聯。 Compare類型的對象稱爲容器的比較對象。

然後,在相同的部分:

關聯容器的迭代器的基本性質是它們通過其中非降序由限定在鍵的非遞減次序將容器 迭代用於 構建它們的比較。對於任何兩個可提領迭代i和j,使得從i到j的距離爲正, value_comp(*Ĵ,* I)==假

其中value_comp是比較函數。

+0

你可以參考標準? –

+0

@GrzegorzWierzowiecki我剛剛添加了C++ 11標準中的一些引用。 – juanchopanza

+0

謝謝。這正是我很好奇的。順便說一句。你知道它是否適用於較早的C++標準嗎? –

6

順序取決於比較使用的函數(地圖上的第三個模板參數,設置的第二個參數)。默認值爲std::less<T>,它給出了集合/地圖的升序,是的。

1

簡答:是的。

較長的回答:std :: set和std :: map都採用第二個模板化參數 - 一個用於比較元素的二元謂詞。默認情況下,這是std :: less - 一個實現單個布爾函數的類 - 它本身是根據運算符<定義的。

除非您在實例化stl模板時另行指定,否則運算符<將定義鍵的順序。注:如果您使用不定義(部分)順序的布爾謂詞,可能會發生奇怪的事情。 :)

+1

你做錯了。較長的答案應該是「yeeeeeeeeeeeeeeeeeees」。 –