std::sort      对vector成员进行排序;

std::sort(v.begin(),v.end(),compare);

 
std::lower_bound 在排序的vector中进行二分查找,查找第一大于等于;
std::lower_bound(v.begin(),v.end(),v.element_type_obj,compare);
 
std::upper_bound 在排序的vector中进行二分查找,查找第一个大于;
std::upper_bound(v.begin(),v.end(),v.element_type_obj,compare);
 
std::binary_search 在排序的vector中进行二分查找;
std::binary_search(v.begin(),v.end(),v.element_type_obj,compare);
 
std::unique
 将排序的vector
vector<element_type>::iterator iter = std::unique(v.begin(),v.end(),compare);
v.resize(iter-v.begin());
 
std::for_each 将迭代器指向区间的内容调用指定的函数
void show(element_type& obj);
std::for_each(v.begin(),v.end(),show);
这里也可以:
strcut showclass
{
       void  operator ()(element_type& obj){
                 //具体操作......
       }
}showobj;
std::for_each(v.begin(),v.end(),showobj);
 
std::random_shuffle将迭代器指向的内容内容打散
std::random_shuffle(v.begin(),v.end());
或:
  1. // random generator function:
  2. ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
  3. // pointer object to it:
  4. ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
random_shuffle ( myvector.begin(), myvector.end(), p_myrandom);
 
具体使用:
std::sort使用:
              std::sort(vectorobj.begin(),vectorobj.end(),compare_fun);
std::lower_bound 使用:
     std::lower_bound (vectorobj.begin(),vectorobj.end(),比较对象,compare_fun);
     比较对象的类型和vectorobj的成员类型一样。
示例:
#include <vector>
#include <algorithm>
#include <algorithm>
#include <iostream>
 
struct Student
{
    int age;
};
 
//sort和lower_bound使用比较函数的原型:
//boo function(const vector的成员类型 lit,const vector的成员类型 rit);
bool CompareOperation(const Student& lit,const Student& rit)     
{
    if(lit.age<rit.age){
        return true;
    }else{
        return false;
    }
}
 
int main(int argc,char *argv[])
{
    std::vector<Student> stuvec;
    Student a;
    a.age = 5;
    stuvec.push_back(a);
    Student b;
    b.age = 6;
    stuvec.push_back(b);
    Student c;
    c.age = 4;
    stuvec.push_back(c);
    Student d;
    d.age = 7;
    stuvec.push_back(d);
    std::cout<<"befort sort"<<std::endl;
    for(size_t index=0;index<stuvec.size();index++){
        std::cout<<stuvec[index].age<<std::endl;
    }
    std::sort(stuvec.begin(),stuvec.end(),CompareOperation);
    std::cout<<"after sort"<<std::endl;
    for(size_t index=0;index<stuvec.size();index++){
        std::cout<<stuvec[index].age<<std::endl;
    }
    std::cout<<"binary search"<<std::endl;
    std::vector<Student>::iterator iter = 
        std::lower_bound(stuvec.begin(),stuvec.end(),b,CompareOperation);
    if(iter != stuvec.end()){
        std::cout<<iter->age<<std::endl;
    }
    return 0;
}
运行结果:
stl算法库参看:
示例代码:
// lower_bound/upper_bound example
#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
#include <vector>       // std::vector
 
int main () {
  int myints[] = {10,20,30,30,20,10,10,20};
  std::vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20
 
  std::sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30
 
  std::vector<int>::iterator low,up;
  low=std::lower_bound (v.begin(), v.end(), 20); // 第一个   >= 20 的元素的迭代器
  up= std::upper_bound (v.begin(), v.end(), 20); // 第一个   > 20  的元素的迭代器                  
 
  std::cout << "lower_bound at position " << (low- v.begin()) << '\n';
  std::cout << "upper_bound at position " << (up - v.begin()) << '\n';
 
  return 0;
}
 
使用std::unique可以将有序的vector中的成员去重:
#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort,std::unique, std::for_each
#include <vector>       // std::vector
 
void show(const int& i)
{
    std::cout<<i<<std::endl;
}
 
int main () {
    int myints[] = {10,20,30,30,20,10,10,20};
    std::vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20
 
    std::sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30
    std::vector<int>::iterator iter = std::unique(v.begin(),v.end());
    v.resize(iter - v.begin());
    std::for_each(v.begin(),v.end(),show);
 
    return 0;
}
使用std::binary_search对vector进行排序;
  1. // binary_search example
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. bool myfunction (int i,int j) { return (i<j); }
  8.  
  9. int main () {
  10. int myints[] = {1,2,3,4,5,4,3,2,1};
  11. vector<int> v(myints,myints+9); // 1 2 3 4 5 4 3 2 1
  12.  
  13. // using default comparison:
  14. sort (v.begin(), v.end());
  15.  
  16. cout << "looking for a 3... ";
  17. if (binary_search (v.begin(), v.end(), 3))
  18. cout << "found!\n"; else cout << "not found.\n";
  19.  
  20. // using myfunction as comp:
  21. sort (v.begin(), v.end(), myfunction);
  22.  
  23. cout << "looking for a 6... ";
  24. if (binary_search (v.begin(), v.end(), 6, myfunction))
  25. cout << "found!\n"; else cout << "not found.\n";
  26.  
  27. return 0;
  28. }
  1. 参看:http://www.cplusplus.com/reference/algorithm/binary_search/?kw=binary_search
 

std::random_shuffle将指定的迭代器区间的内容随机打散:

  1. // random_shuffle example
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <functional>
  5. #include <vector>
  6. #include <ctime>
  7. #include <cstdlib>
  8. using namespace std;
  9.  
  10. // random generator function:
  11. ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
  12.  
  13. // pointer object to it:
  14. ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;
  15.  
  16. int main () {
  17. srand ( unsigned ( time (NULL) ) );
  18. vector<int> myvector;
  19. vector<int>::iterator it;
  20.  
  21. // set some values:
  22. for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
  23.  
  24. // using built-in random generator:
  25. random_shuffle ( myvector.begin(), myvector.end() );
  26.  
  27. // using myrandom:
  28. random_shuffle ( myvector.begin(), myvector.end(), p_myrandom);
  29.  
  30. // print out content:
  31. cout << "myvector contains:";
  32. for (it=myvector.begin(); it!=myvector.end(); ++it)
  33. cout << " " << *it;
  34.  
  35. cout << endl;
  36.  
  37. return 0;
  38. }

C++算法库学习__std::sort__对 vector进行排序_排序后就可以进行使用std::lower_bound进行二分查找(查找第一个大于等于指定值的迭代器的位置)__std::unique的更多相关文章

  1. mahout算法库(四)

    mahout算法库 分为三大块 1.聚类算法 2.协同过滤算法(一般用于推荐) 协同过滤算法也可以称为推荐算法!!! 3.分类算法 算法类 算法名 中文名 分类算法               Log ...

  2. C++ algorithm算法库

    C++ algorithm算法库 Xun 标准模板库(STL)中定义了很多的常用算法,这些算法主要定义在<algorithm>中.编程时,只需要在文件中加入#include<algo ...

  3. 安装Python算法库

    安装Python算法库 主要包括用NumPy和SciPy来处理数据,用Matplotlib来实现数据可视化.为了适应处理大规模数据的需求,python在此基础上开发了Scikit-Learn机器学习算 ...

  4. scikit-learn 线性回归算法库小结

    scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的不同和各自的使用场景. 线性回归的目的是要得到输 ...

  5. dlib库学习之一

    dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...

  6. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  7. muduo网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

  8. Effective STL 学习笔记: 多用 vector & string

    Effective STL 学习笔记: 多用 vector & string 如果可能的话, 尽量避免自己去写动态分配的数组,转而使用 vector 和 string . 原书作者唯一想到的一 ...

  9. GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

    带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...

随机推荐

  1. jq 常用手册

    1.替换标签 $("img[src='/_layouts/images/lstbulet.gif']").attr("src", "/huadong/ ...

  2. 修改mysql root密码

    mysql密码丢失后,在mysql命令行下执行如下命令,即可将root用户密码清空: mysqld_safe --skip-grant-tables& mysql修改密码 mysql修改,可在 ...

  3. Codeforces Round #240 (Div. 1) B. Mashmokh and ACM DP

                                                 B. Mashmokh and ACM                                     ...

  4. springMVC之异常处理

    1. 自己定义一个异常类: UserException.java public class UserException extends RuntimeException { private stati ...

  5. 蓝桥 ADV-233 算法提高 队列操作 【STL】

      算法提高 队列操作   时间限制:1.0s   内存限制:256.0MB      问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. ...

  6. VIDIOC_S_INPUT 作用 (转载)

    转载:http://blog.csdn.net/kickxxx/article/details/7088658 G_INPUT和S_INPUT用来查询和选则当前的input 一个video设备节点可能 ...

  7. Objective-C 声明属性

    创建: 2018/01/24 完成: 2018/01/25 遗留: TODO 声明属性(declared property)  属性的声明与功能  属性的声明 @property 读写 @proper ...

  8. Avito Code Challenge 2018 A~E

    A. Antipalindrome 还以为是什么神dp结果就是分情况讨论啊 原串是一串一样的字符的话输出0,是回文串的话输出n-1,否则直接输出原串长度 #include<iostream> ...

  9. 爬虫—Selenium使用

    Selenium使用 Selenium是一个自动化测试工具,可以驱动浏览器器执行特定的动作,如点击,下拉等.同时还可以获取浏览器当前呈现页面的源代码,可见即可爬. 1.准备 我们使用谷歌Chrome浏 ...

  10. Unity项目 - Boids集群模拟算法

    1987年Craig W.Reynolds发表一篇名为<鸟群.牧群.鱼群:分布式行为模式>的论文,描述了一种非常简单的.以面向对象思维模拟群体类行为的方法,称之为 Boids ,Boids ...