c++ - 我可以做些什么来改进指针向量中的搜索?
问题描述
我的目标是检查一个名为Person*
的Person
对象的向量person_name
。该向量按名称的字母顺序排序。制作临时文件Person
是我见过的让这个 lower_bound 调用与该名称一起工作的唯一方法。是否有更有效的方法来执行此操作,或者是否有temp
必要执行比较?
//person_name is a string
Person temp(person_name);
auto it = lower_bound(personVec.begin(), personVec.end(), &temp, personCompare());
if (it != personVec.end() && (*it)->getName() == person_name) {}
else { return false; }
解决方案
temp
不需要。您需要具有适当签名的比较器。
例如,当使用
and类型取消引用personVec.begin()
结果时,您可以使用此类签名的比较器:Person*&
person_name
PersonName
bool compare(Person* const& a, PersonName const& b);
这只是普通函数,但其他具有此类签名的可调用函数也可以使用。然后你可以直接使用lower_bound
with person_name
:
auto it = lower_bound(personVec.begin(), personVec.end(), person_name, compare);
您的一般问题是关于如何提高性能。这是不可能通过看到 4 行程序来暗示的。应该通过在数据量大的情况下对整个程序进行剖析并分析结果来发现。例如,排序可能personVec
比它花费更多的时间lower_bound
。然后使用unordered_set
代替vector
可以提供比优化搜索功能更好的结果vector
。
推荐阅读
- wordpress - 移动变化描述
- tomcat - Tomcat 关闭的方式有什么不同?
- oracle - SQL 给出错误:ORA-00909:参数数量无效
- react-native - 在 iOS 上 react-native-maps 本地图块/离线
- language-agnostic - x64 机器上的 8 位读取
- python - 业务季度在 python 中结束
- python - python中的多个饼图尺寸错误
- api - 如何使用公钥保护 Web API 免受未经授权的访问?
- c++ - 如何在 NS-3 中模拟期间更改两个节点之间的数据速率?
- visual-studio-2017 - 错误 MSB3073 命令“ng build --aot”以代码 9009 退出