查找
一 、在未排序区间只能选择 count find count_if find_if 效率是线性的 相等性判断
count 统计个数
set s;
Widget w;
...
size_t n =
s.count(w);
find 是否有这样的值,有在哪里?
list::iterator it =
find(lw.begin(),lw.end(),w);
if(it !=
lw.end())
{
}
else
...
二
、排序区间有更多选择 binary_search lower_bund upper_bound equal_range 效率是对数时间 等价性判断
binary_search 测试一个区间是否存在某特定值。
if(binary_search(vw.begin(),vw.end(),w))
{
}
lower_bund 查找某特定值,并返回一迭代器 找到的话,迭代器指向该值的第一份拷贝,没有找到的话,迭代器指向适合插入该值的位置
upper_bound 查找某特定值,并返回一迭代器 找到的话,迭代器指向该值的最后一份拷贝的下一位置,没有找到的话,迭代器指向适合插入该值的位置
区间删除
int val = 4
vt.erase(vt.begin(),
lower_bound(vt.begin(),vt.end(),val)); 删除 val = 4
之前数据 1 2 2 3 被删掉
=》小于
vt.erase(vt.begin(),upper_bound(vt.begin(),vt.end(),val)); 删除 至少与val=4 等价的数据 5之前的被删掉
=》小于等于
按顺序插入 一个排序的区间,并且希望等价的对象仍然保持原有的顺序。upper_bound将起到作用
Effective STL 167 示例
-
list lp;
-
lp.sort(PersonNameLess());
-
-
Person newPerson;
-
..
-
lp.insert(upper_bound(lp.begin(),lp.end(),newPerson,PersonNameLess()),
-
newPerson);
equal_range 返回一对迭代器,第一个等于lower_bound 第二个等于upper_bound 返回的迭代器,二者相同表明找到对象区间为空,没有找到这样的值,并且二者指向适合插入的位置;如果二者不相同,表明找到这样的值。
-
vector vw
-
sort(vw.begin(),vw.end());
-
typedef vector::iterator VWIter;
-
typedef pare VWiterPair;
-
VWIterPair p = equal_range(vw.begin(),vw.end(),w);
-
if(p.first != p.second){
-
... //找到特定值,first 指向第一个等价对象,second指向最后一个等价对象的下一位置
-
}
-
else
-
{
-
//没有找到特定值,first second都指向w的插入位置
-
}
这里需要注意一个问题,经过排序序列容器 vector list 或 deque 也是有序空间,不要只想到有序的关联容器。
阅读(786) | 评论(0) | 转发(0) |