在我正在研究的项目中,我被迫使用c ++ 98。我需要在某些结构向量中执行快速查找,只使用这些结构中的少数元素作为键,我到目前为止很高兴地传递给std::lower_bound
和std::upper_bound
一个value
参数具有与那些结构不同的类型和比较函数,可以正确处理这种异构情况。
这一切都按预期工作,但今天我突然意识到标准可能不允许这样做,我在一些文件中找到了这种预感的确认,例如this one也提出了对标准的修订。 ,我现在正在学习,已经在C ++ 0x中实现,this other paper confirms。
我的问题是:我的代码是按预期工作的事实,尽管不遵守标准的字母,仅仅是巧合,是一种副作用具体实现,我应该更改编译器以及诸如此类的无保证结果?
换句话说,我是否真的应该真正地将我的代码更改为符合标准(这会使其大大复杂化),或者我可以不打扰并让它成为,考虑到这个代码库不会被编译为任何东西除了g ++之外呢?
答案 0 :(得分:1)
只有你能决定保持现状是否值得冒险。但是,如果您转到C++11
,则措辞已更改为允许您正在执行的操作。
我认为编译器供应商不太可能改变他们的标准库如何适用于旧版标准。因此,除非您将其移动到未经测试的编译器,否则我无法看到您的C++98
代码很可能会中断。即使发生了这种情况,您也可以随时实施自己的{drop-in-replacement)版本的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);
1 要求:[first,last]的元素e应根据表达式e&lt;来分割。 价值或比较(e,价值)。
2 返回:[first,last]范围内的最远迭代器i,使得对于[first,i]范围内的任何迭代器j,以下相应条件成立:* j&lt; value或comp(* j,value)!= false。
3 复杂性:至多log 2(最后 - 第一次)+ O(1)比较。
要求 2 并未规定value
与*e
的类型相同。
您参考的文件也是:
但它合法吗?标准在这个问题上的立场并不令人鼓舞。首先,25.3表示为了使算法正常工作,比较对象必须对值进行严格的弱排序。
这来自C++03
标准,并且不我在C++11
标准中发现的措辞
25.4 排序和相关操作 [ alg.sorting ]
3 对于所有采用比较的算法,都有一个使用运算符&lt;代替。那就是comp(* i, * j)!= false默认为* i&lt; * j!= false。对于 25.4.3 中描述的算法以外的算法,如果算法正常工作,comp必须对值进行严格的弱排序。
它明确豁免了std::lower_bound
使用的算法:
25.4.3 二进制搜索 [ alg.binary.search ]
1 本节中的所有算法都是二进制搜索的版本,并假设被搜索的序列是通过将搜索关键字绑定到隐含的或者参数而形成的表达式进行分区的。显式比较函数。
这个措辞允许&#34;一个参数&#34;比较函数与容器元素的类型不同。它只需要匹配&#34;搜索键&#34;。