异构容器查找 C++98

heterogeneous containers lookup in C++98

本文关键字:C++98 查找 异构      更新时间:2023-10-16

在我正在从事的一个项目中,我被迫使用c ++ 98。由于需要在某些结构向量中执行快速查找,仅使用这些结构的几个元素作为键,到目前为止,我很高兴地传递给std::lower_boundstd::upper_bound一个类型与这些结构不同的value参数和一个比较函子,可以正确处理这种异构情况。

这一切都按预期工作,但今天我突然意识到这可能是标准不允许的,我在几篇论文中发现了这种预感的证实,比如这篇论文也提出了对标准的修正,我现在正在学习,正如另一篇论文所证实的那样,已经在 C++0x 中实施。

我的问题是:尽管不遵守标准的文字,但我的代码是否按预期工作,仅仅是巧合,特定实现的副作用,我应该更改编译器的不保证结果等等?

换句话说,我真的应该真的真的将我的代码更改为符合标准(这将使它大大复杂化(,或者我可以不打扰并让它成为,考虑到这个代码库暂时不会用 g++ 以外的任何东西编译?

只有你能决定保持现状是否值得冒险。但是,如果您移动到C++11,措辞已更改以允许您正在做的事情。

我认为编译器供应商不太可能改变他们的标准库对旧版本标准的工作方式。所以我看不出你的C++98代码很可能会中断,除非你把它移动到一个未经测试的编译器。即使发生这种情况,您始终可以实现自己的(直接替换(版本的std::lower_bound以适应。

根据我对C++11标准的阅读,你很好。

25.4.3.1lower_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要求:[第一个,最后一个(的元素e应根据表达式e进行划分<值或复合(e,值(。>

2返回:范围 [first,last] 中最远的迭代器 i,使得对于范围 [first,i] 中的任何迭代器 j,以下相应的条件成立:*j<值或>

3复杂性:最多对数 2(最后 − f irst(+ O(1( 比较。

要求2并不规定value*e属于同一类型。

您引用的文档还说:

但这合法吗?该标准在这个问题上的立场并不令人鼓舞。首先,25.3 表示,为了使算法正常工作,比较对象必须对值进行严格的弱排序。

这来自C++03标准,而不是我在C++11标准中找到的措辞,该标准指出:

25.4分拣及相关操作[藻类分拣]

3对于所有采用比较的算法,有一个版本改用运算符<。也就是说,comp(*i, *j( != false 默认为 *i <*j != false。对于25.4.3中描述的算法以外的算法才能正常工作,comp 必须对值进行严格的弱排序。

它明确豁免了std::lower_bound使用的算法:

25.4.3二叉搜索[alg.binary.search]

1本节中的所有算法都是二叉搜索的版本,并假设所搜索的序列相对于通过将搜索键绑定到隐含或显式比较函数的参数而形成的表达式进行分区。

此措辞允许比较函数的"参数"与容器元素的类型不同。它只需要匹配"搜索键"。