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());
或:
// random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
// pointer object to it:
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进行排序;
// binary_search example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std; bool myfunction (int i,int j) { return (i<j); } int main () {
int myints[] = {1,2,3,4,5,4,3,2,1};
vector<int> v(myints,myints+9); // 1 2 3 4 5 4 3 2 1 // using default comparison:
sort (v.begin(), v.end()); cout << "looking for a 3... ";
if (binary_search (v.begin(), v.end(), 3))
cout << "found!\n"; else cout << "not found.\n"; // using myfunction as comp:
sort (v.begin(), v.end(), myfunction); cout << "looking for a 6... ";
if (binary_search (v.begin(), v.end(), 6, myfunction))
cout << "found!\n"; else cout << "not found.\n"; return 0;
}
参看:http://www.cplusplus.com/reference/algorithm/binary_search/?kw=binary_search
 

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

// random_shuffle example
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std; // random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;} // pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom; int main () {
srand ( unsigned ( time (NULL) ) );
vector<int> myvector;
vector<int>::iterator it; // set some values:
for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9 // using built-in random generator:
random_shuffle ( myvector.begin(), myvector.end() ); // using myrandom:
random_shuffle ( myvector.begin(), myvector.end(), p_myrandom); // print out content:
cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it; cout << endl; return 0;
}

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. OpenFileDiag 使用

    MSDN模版 Stream myStream =null; OpenFileDialog openFileDialog1 =newOpenFileDialog(); openFileDialog1.I ...

  2. MySQL具体解释(21)------------缓存參数优化

    数据库属于 IO 密集型的应用程序.其主要职责就是数据的管理及存储工作. 而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优 ...

  3. 【C++&爬虫】C++实现网络爬虫&socket初级教程

    2019年了,发现以前的很多教程都不能用了. 我自己写的socket发给服务器总是返回301错误——资源永久转移.很多教程都是这样,困扰了我很久. 终于我发现了一篇能用的爬虫代码,参考MSDN以及众多 ...

  4. Robot Framework 怎样写好Test Case

    1.介绍 这是一个关于如何用Robot Framework写好Test Case的高层次的指导准则 怎样实际的与系统进行交互不在此文档范围内 最重要的准则是使测试用例尽可能的让熟悉此领域的人觉得简单易 ...

  5. ubuntu14安装docker-ce

    先卸载旧的docker sudo apt-get remove docker docker-engine docker.io docker-ce 通过HTTPS使用存储库(repository) su ...

  6. iOS如何查看静态库.a文件支持的cpu类型

    打开终端: 输入 lipo -info 然后将你要查看的静态库.a 文件找到,拖入 -info 后边.假设路径为A,即为 lipo -info A 回车键,然后就会看到静态库是否支持 armv7,ar ...

  7. 【POJ 1201】 Intervals

    [题目链接] 点击打开链接 [算法] 令sum(n)表示区间[1,n]中选了几个点 那么,显然有以下不等式 : 1. sum(n)- sum(n - 1) >= 0 2. sum(n) -  s ...

  8. [loj6089]小Y的背包计数问题

    https://www.zybuluo.com/ysner/note/1285358 题面 小\(Y\)有一个大小为\(n\)的背包,并且小\(Y\)有\(n\)种物品. 对于第\(i\)种物品,共有 ...

  9. 解决 IDEA 中文乱码

    一.打开Intellij的根目录,找到下图的两个文件(根据你的系统是32位或64位选择其中一个配置文件),在配置文件中添加:-Dfile.encoding=UTF-8 二.   配置IDE编码 点击F ...

  10. git删除远程分支和本地分支以及更改本地和分支名字

    问题描述: 当我们集体进行项目时,将自定义分支push到主分支master之后,如何删除远程的自定义分支呢 问题解决: (1)使用命令git branch -a 查看所有分支 注: 其中,remote ...