异构容器查找 C++98
heterogeneous containers lookup in C++98
在我正在从事的一个项目中,我被迫使用c ++ 98。由于需要在某些结构向量中执行快速查找,仅使用这些结构的几个元素作为键,到目前为止,我很高兴地传递给std::lower_bound
并std::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本节中的所有算法都是二叉搜索的版本,并假设所搜索的序列相对于通过将搜索键绑定到隐含或显式比较函数的参数而形成的表达式进行分区。
此措辞允许比较函数的"参数"与容器元素的类型不同。它只需要匹配"搜索键"。
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 使用正则表达式regex_search在字符串中查找字符串
- 使用gcc从静态链接的文件中查找可选符号
- 在C++中查找范围的长度
- 算法问题:查找从堆栈中弹出的所有序列
- 在Windows中查找扬声器输出的当前音量级别
- 如何在C++中使用X509证书模在令牌中查找私钥
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在 for 循环中查找问题时遇到困难
- 如何在文件中查找字节序列
- 如何在 c++98 中通过特定字段在 QList 中查找对象?
- 异构容器查找 C++98
- 在 C++ 98 中的对向量中按键查找对