Chinaunix首页 | 论坛 | 博客
  • 博客访问: 291425
  • 博文数量: 63
  • 博客积分: 814
  • 博客等级: 军士长
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 15:46
文章分类

全部博文(63)

文章存档

2017年(1)

2016年(4)

2015年(13)

2014年(9)

2012年(3)

2011年(33)

分类: C/C++

2015-04-10 13:42:23


查找
一 、在未排序区间只能选择 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 示例


点击(此处)折叠或打开

  1. list lp;
  2. lp.sort(PersonNameLess());

  3. Person newPerson;
  4. ..
  5. lp.insert(upper_bound(lp.begin(),lp.end(),newPerson,PersonNameLess()),
  6.           newPerson);



equal_range 返回一对迭代器,第一个等于lower_bound 第二个等于upper_bound 返回的迭代器,二者相同表明找到对象区间为空,没有找到这样的值,并且二者指向适合插入的位置;如果二者不相同,表明找到这样的值。 


点击(此处)折叠或打开

  1. vector vw
  2. sort(vw.begin(),vw.end());
  3. typedef vector::iterator VWIter;
  4. typedef pare VWiterPair;
  5. VWIterPair p = equal_range(vw.begin(),vw.end(),w);
  6. if(p.first != p.second){
  7. ... //找到特定值,first 指向第一个等价对象,second指向最后一个等价对象的下一位置
  8. }
  9. else
  10. {
  11.                                    //没有找到特定值,first second都指向w的插入位置
  12. }



这里需要注意一个问题,经过排序序列容器 vector list 或 deque  也是有序空间,不要只想到有序的关联容器。
 
阅读(750) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~