STL基础--算法(不修改数据的算法)

不修改数据的算法

  • count, min and max, compare, linear search, attribute
// 算法中Lambda函数很常用:
num = count_if(vec.begin(), vec.end(), [](int x){return x<10;});  

bool lessThan10(int x) {
   return x<10;
}

vector<int> vec = {9,60,90,8,45,87,90,69,69,55,7};
vector<int> vec2 = {9,60,70,8,45,87};
vector<int>::iterator itr, itr2;
pair<vector<int>::iterator, vector<int>::iterator> pair_of_itr;

// C++ 03: 一些算法可以在tr1或者boost中找到
vector<int> vec = {9,60,90,8,45,87,90,69,69,55,7};
  1. 计数 Counting

    int n = count(vec.begin()+2, vec.end()-1, 69);   // 2 元素值等于69的个数
    int m = count_if(vec.begin(), vec.end(), [](int x){return x==69;}); // 3  元素满足谓词的个数
    int m = count_if(vec.begin(), vec.end(), [](int x){return x<10;}); // 3  
  2. 最大小值 Min and Max
    itr = max_element(vec.begin()+2, vec.end());  // 90 返回第一个最大元素的迭代器
    
    itr = max_element(vec.begin(), vec.end(),
                  [](int x, int y){ return (x%10)<(y%10);}); // 9 自定义比较函数
    
    // 大多数算法有一个简单形式和一个更通用的形式
    
    itr = min_element(vec.begin(), vec.end());  // 7
    // 通用形式的min_element()
    
    pair_of_itr = minmax_element(vec.begin(), vec.end(),  // {60, 69}
                              [](int x, int y){ return (x%10)<(y%10);});
    // 返回一个pair, 包含第一个最小值和最后一个最大值
  3. 线性搜索(当数据未排序时使用)
    //    返回第一个匹配的
    itr = find(vec.begin(), vec.end(), 55);
    
    itr = find_if(vec.begin(), vec.end(), [](int x){ return x>80; });
    
    itr = find_if_not(vec.begin(), vec.end(), [](int x){ return x>80; });
    
    itr = search_n(vec.begin(), vec.end(), 2, 69);  // 连续2个69
    // 通用形式的search_n()
    
    // 搜索子串
    vector<int> sub = {45, 87, 90};
    itr = search( vec.begin(), vec.end(), sub.begin(), sub.end());
          // 搜索第一个匹配的子串
    itr = find_end( vec.begin(), vec.end(), sub.begin(), sub.end());
          // 搜索最后一个匹配的子串
    // 通用形式: search(), find_end()
    
    // 搜索任意一个
    vector<int> items  = {87, 69};
    itr = find_first_of(vec.begin(), vec.end(), items.begin(), items.end());
          // 搜索任意一个在items中的元素
    itr = find_first_of(vec.begin(), vec.end(), items.begin(), items.end(),
                      [](int x, int y) { return x==y*4;});
          // 搜索任意一个在items中的元素,且满足谓词
    
    // 搜索相邻
    itr = adjacent_find(vec.begin(), vec.end());  // 搜索相邻两个相同的元素
    itr = adjacent_find(vec.begin(), vec.end(), [](int x, int y){ return x==y*4;});
             // 通用版本,自定义谓词
  4. 范围比较
    if (equal(vec.begin(), vec.end(), vec2.begin())) {
      cout << "vec and vec2 are same.\n";
    }
    
    if (is_permutation(vec.begin(), vec.end(), vec2.begin())) {
        cout << "vec and vec2 have same items, but in differenct order.\n";
    }
    
    pair_of_itr = mismatch(vec.begin(), vec.end(), vec2.begin());
    // 找到第一个不同的元素
    // pair_of_itr.first是vec的迭代器
    // pair_of_itr.second是vec2的迭代器
    
    //词典比较: 用"less than"逐元素比较
    lexicographical_compare(vec.begin(), vec.end(), vec2.begin(), vec2.end());
    // {1,2,3,5} < {1,2,4,5}
    // {1,2}     < {1,2,3}
    
    // 通用形式:
    //   equal(), is_permutation(), mismatch(), lexicographical_compare()
  5. 检查属性
    is_sorted(vec.begin(), vec.end());  // 检查vec是否排序
    
    itr = is_sorted_until(vec.begin(), vec.end());
    // itr指向第一个不满足排序的元素
    // 通用形式: is_sorted(), is_sorted_until()
    
    is_partitioned(vec.begin(), vec.end(), [](int x){return x>80;} );
            // 检查vec是否由谓词的条件分成了两个部分(x>80)
    
    is_heap(vec.begin(), vec.end());  // 检查vec是否是一个堆,heap
    itr = is_heap_until(vec.begin(), vec.end());  // 找到第一个不是堆的位置
    
    // 通用形式: is_heap(), is_heap_until()
  6. All, any, none
    all_of(vec.begin(), vec.end(), [](int x) {return x>80} );
    // 所有的元素都满足
    
    any_of(vec.begin(), vec.end(), [](int x) {return x>80} );
    // 任意一个元素满足
    
    none_of(vec.begin(), vec.end(), [](int x) {return x>80} );
    // 所有元素都不满足

原文地址:https://www.cnblogs.com/logchen/p/10202267.html

时间: 2024-07-28 16:53:57

STL基础--算法(不修改数据的算法)的相关文章

STL基础--算法(修改数据的算法)

修改元素的算法 copy, move, transform, swap, fill, replace, remove vector<int> vec = {9,60,70,8,45,87,90}; // 7 items vector<int> vec2 = {0,0,0,0,0,0,0,0,0,0,0}; // 11 items vector<int>::iterator itr, itr2; pair<vector<int>::iterator, v

盘点一下数据平滑算法

在自然语言处理中,经常要计算单词序列(句子)出现的概率估计.我们知道,算法在训练时,语料库不可能包含所有可能出现的序列.  因此,为了防止对训练样本中未出现的新序列概率估计值为零,人们发明了好多改善估计新序列出现概率的算法,即数据平滑算法. Laplace 法则 最简单的算法是Laplace法则,思路很简单,统计测试数据集中的元素在训练数据集中出现的次数时,计数器的初始值不要设成零,而是设成1.这样,即使该元素没有在训练集中出现,其出现次数统计值至少也是1.因此,其出现的概率估计值就不会是零了.

c++ 提高4 map容器 共性机制 使用时机 比较| STL算法 算法基础仿函数 谓词 函数适配器 遍历算法

[本文谢绝转载] <大纲> STL 容器 map 容器的4中初始化 遍历 map容器 元素的删除观测map.insert返回值,方法123,已存在就报错,初始化方法4会覆盖 map的查找,异常处理 map容器的range返回两个迭代器 multimap案例,按照部门_增删员工信息 容器共性机制 把对象放到容器中,会自动执行拷贝构造函数 各个容器的使用时机 vector与deque的比较: 算法 算法基础 函数对象(仿函数) 函数对象 与普通函数的区别:--  相同之处 函数对象 与普通函数的区

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

几个新角色:数据科学家、数据分析师、数据(算法)工程师

大数据分析的几个新角色:数据科学家.数据分析师.数据(算法)工程师 数学科学家:(发明算法) 运用统计分析.机器学习.分布式处理等技术,从大量数据中提取出对业务有意义的信息,以易懂的形式传达给决策者,并创造出新的数据应用服务的人才. 对享有的模型进行优化.改进,所以涉及到对具体算法的精通和理解,并不断通过AB Test进行验证. 例如:Google的搜索PageRank算法的创始人拉里佩奇Larry Page,他是博士而且在读书期间创造的此算法. 李开复也应该算一个,解决中文搜索及尝试了语音识别

stl中的容器、迭代器和算法----vector中的find实现

来源 http://blog.csdn.net/huangyimin/article/details/6133650 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求.容器自身可能由数组或链表实现,或者容器中的每个元素都有特殊的关键值. 迭代器 用于遍历一个数据集中的每个元素.这些数据集可能是容器或者容器的子集.迭代器的主要优点是它们为任意类型的容器提供一个小巧并且通用(注意通用很重要)的接口.例如,迭代器接口的一个操作

一个基础而奇怪的问题:算法执行加法、乘法、除法性能无区别?

一个基础而奇怪的问题:算法执行加法.乘法.除法性能无区别? 计算机原理分析觉得:加法.乘法和除法的计算性能依次减少,但减少到什么程度? 编写C程序用30次百万数据计算来測试时间差异性,代码例如以下: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 void add(float x[], long n) { float sum = 0; for(long i = 0; i

一个基础而奇怪的问题:算法运行加法、乘法、除法性能无差别?

一个基础而奇怪的问题:算法运行加法.乘法.除法性能无差别? 计算机原理分析认为:加法.乘法和除法的计算性能依次降低,但降低到什么程度? 编写C程序用30次百万数据计算来测试时间差异性,代码如下: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 void add(float x[], long n) { float sum = 0; for(long i = 0; i &

十大基础实用算法之迪杰斯特拉算法、最小生成树和搜索算法

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s