Han*_*lil 24 c++ containers stl
一些STL容器例如std::list
和std::vector
没有find()
方法作为成员函数.这是为什么?我知道有使用的替代std::find
从<algorithm>
,但仍然使用这也不是100%纯天然.
jua*_*nza 42
一般设计原则是尽可能使用std::find
,并find
在更有效时实现成员函数.
该容器做有一个find
部件是具有更有效的元素的查找机制然后在执行线性搜索容器std::find
.例如,二进制搜索树,例如std::set
和std::map
,或哈希表,例如它们的unordered
对应物.
Ton*_*roy 13
find
,lower_bound
和upper_bound
成员函数仅当提供更有效的时比使用非成员的等同物,或非成员无法运行给定容器的公共API
特别要注意的是,它std::string
具有为字符搜索find
提供类似std::find()
线性搜索功能的功能,以及std::search()
用于子字符串搜索的类似设施:虽然非成员版本可能具有相同的大O效率,但它们可能效率低于专用机器代码指令通常可用于"字符串"搜索.还有历史,便利和易于移植的因素.
除了效率问题,值得注意的是一些容器:
本质上是排序的(multi
- set
,map
)或未排序的(unordered_map
,unordered_set
),通常是未排序的(例如std::string
),或者很容易(std::vector
)
公开支持前向迭代和/或随机访问
可能私下支持二进制搜索
有一个专门用于元素访问的公共API,因此算法的潜在重用相对有限(例如unordered_map::bucket
/ ::begin(n)
等)
vector
使用大量算法进行搜索也是有意义的:
std::find
做一个强力线性O(n)搜索,它将首先"找到"低指数元素,
std::binary_search
需要一个有序矢量但跳转以实现O(log2n)复杂度.
其他选项如外推搜索和散列可能适用
你会如何选择实施和添加成员?似乎有点武断.尽管如此,使用哪种选择在性能方面也是重要的:对于一百万个元素,find
在匹配之前平均进行五十万个元素比较,并且每当元素不存在时平均为百万个元素,而binary_search
通常需要进行~20个比较.
与容器find
通常不提供这种灵活性,并且find
和/或lower_bound
/ upper_bound
它们提供可被视为替代非成员的等同物,并且可能搜索容器的唯一合理的方法.
归档时间: |
|
查看次数: |
1899 次 |
最近记录: |