2017-07-03 77 views
1

在我正在開發的一個項目中,我不得不使用C++ 98。由於需要在特定的結構向量中執行快速查找,僅使用這些結構的幾個元素作爲鍵,我迄今已愉快地傳遞給std::lower_boundstd::upper_bound a value參數,其類型與那些結構和比較函數不同將妥善處理這種異構情況。C++ 98異構容器查找

這一切都按預期工作,但今天我突然意識到這可能不被標準所允許,並且我在幾篇論文中發現了這種預感的確認,如this one,其中也提出了對標準的修改,現在學習,已經在C++ 0x中實現,如this other paper confirms

我的問題是:是事實,我的代碼工作正常,儘管標準的信,一個偶然的巧合,具體實施的一個副作用,無保證的結果應該不會持久我改變編譯器和什麼?

換句話說,我真的應該真的真的改變自己的代碼以符合標準(這會使其複雜化),或者我可以不打擾並放過它,考慮到這個代碼庫不會被編譯除了g ++之外的其他任何東西?

+1

你爲什麼認爲這是不允許的?我一直在做幾次,如果不允許,原型將使用'std :: iterator_traits :: value_type'而不是'T'。 –

+0

你可以用一小段代碼展示你的用例嗎?這目前不是很容易閱讀 –

+0

這是我在第一篇文章中解釋的,與用例一起鏈接。 –

回答

1

只有您可以決定保持現狀是否值得冒險。但是,如果您轉移到C++11,措辭已更改爲允許您正在執行的操作。

我認爲這不太可能編譯器廠商會改變他們的標準庫如何工作的舊版本的標準。所以我看不出它很可能是你的C++98代碼會中斷,除非你將它移動到一個未經測試的編譯器。即使發生了這種情況,您也可以實施自己的(放入替換版)std::lower_bound以適應。

根據我對C++11標準的閱讀,你很好。

25.4.3.1 LOWER_BOUND [ lower.bound ]

template<class ForwardIterator, class T> 
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value); 

template<class ForwardIterator, class T, class Compare> 
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 

需要:的[第一,最後的元素e)須相對於該表達式被劃分值或comp(e,值)。

返回:最遠迭代i的範圍[第一,最後],使得對於在範圍[任何迭代Ĵ第一,i)的下列相應條件成立:*Ĵ<值或補償(*Ĵ ,值)!= false。

複雜性:最多log 2(last -f irst)+ O(1)比較。

要求沒有規定value是相同類型的如同*e

你也引用文件說:

但它是合法的嗎?標準在這個問題上的立場並不令人鼓舞。一方面,25.3表示爲了使算法正常工作,比較對象必須在值上產生嚴格的弱排序。

這個來自C++03標準,是不是C++11標準找到措詞指出這一點:

25.4排序和相關業務[ alg.sorting ]

對於所有人取比較,有一個使用運算符<的版本。也就是說,comp(* i, * j)!= false默認爲* i < * j!= false。對於25.4.3中描述的算法以外的其他算法要正確工作,comp必須對這些值進行嚴格的弱排序。

它給出一個明確的豁免由std::lower_bound所使用的算法:

25.4.3二進制搜索[ alg.binary.search ]

所有在本節中的算法是二進制搜索的版本,並假定搜索的序列是相對於expr進行分區的通過將搜索關鍵字與隱含或顯式比較函數的參數綁定而形成。

該措辭允許比較函數的「參數」與容器元素具有不同的類型。它只需要匹配「搜索鍵」。