C++ - STL常用算法-sort、find、count、等等【还有remove......暂时不写】

起始算法有很多,或者说太多,这里不写了,主要写一写在 vector deque stack queue set map 中出现过的算法,其他算法,以后在此补充!

这些算法使用时候,包含:#include<algorithm>

其余算法参考:https://blog.csdn.net/tick_tock97/article/details/71316372

在线手册:http://www.cplusplus.com/reference/algorithm

一、sort

没有返回值;

1 std::sort
2 default (1)
3 template <class RandomAccessIterator>
4   void sort (RandomAccessIterator first, RandomAccessIterator last);
5 custom (2)
6 template <class RandomAccessIterator, class Compare>
7   void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
 1 // sort algorithm example
 2 #include <iostream>     // std::cout
 3 #include <algorithm>    // std::sort
 4 #include <vector>       // std::vector
 5
 6 bool myfunction (int i,int j) { return (i<j); }
 7
 8 struct myclass {
 9   bool operator() (int i,int j) { return (i<j);}
10 } myobject;
11
12 int main () {
13   int myints[] = {32,71,12,45,26,80,53,33};
14   std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33
15
16   // using default comparison (operator <):
17   std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33
18
19   // 仿函数不必多言
20   std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
21
22   // using object as comp
23   std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)
24
25   // print out content:
26   std::cout << "myvector contains:";
27   for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
28     std::cout << ‘ ‘ << *it;
29   std::cout << ‘\n‘;
30
31   return 0;
32 }
33
34 Output:
35 myvector contains: 12 26 32 33 45 53 71 80

二、find

返回改元素迭代器【没找到则返回 .end()】

1 std::find
2 template <class InputIterator, class T>
3 InputIterator find (InputIterator first, InputIterator last, const T& val);

可以看到,find的返回值是一个同输入类型的迭代器。一般地,如果找到了该元素,就会返回该元素地泛型指针,如果没找到就默认返回该容器的 .end()。

find算法的底层实现如下:

1 template<class InputIterator, class T>
2   InputIterator find (InputIterator first, InputIterator last, const T& val)
3 {
4   while (first!=last) {
5     if (*first==val) return first;
6     ++first;
7   }
8   return last;
9 }

例如:

 1 vector<int> vec;
 2 it = find(vec.begin(), vec.begin(), val);
 3 if(it != vec.end()) // 代表找到了
 4 {
 5    cout << "*it" << endl;
 6 }
 7 else  // 代表 it = vec.end() 也就是没找到
 8 {
 9    cout << "not found" << endl;
10 }
 1 // find example
 2 #include <iostream>     // std::cout
 3 #include <algorithm>    // std::find
 4 #include <vector>       // std::vector
 5
 6 int main () {
 7   // using std::find with array and pointer:
 8   int myints[] = { 10, 20, 30, 40 };
 9   int * p;
10
11   // <1>在数组中查找
12   p = std::find (myints, myints+4, 30);
13   if (p != myints+4) // 注意这里写法
14     std::cout << "在数组中找到元素:" << *p << ‘\n‘;
15   else
16     std::cout << "Element not found in myints\n";
17
18   // <2>在容器中查找
19   std::vector<int> myvector (myints,myints+4);//数组初始化容器
20   std::vector<int>::iterator it;
21
22   it = find (myvector.begin(), myvector.end(), 30);
23   if (it != myvector.end())
24     std::cout << "在容器中找到元素: " << *it << ‘\n‘;
25   else
26     std::cout << "容器中没有这个元素\n";
27
28   return 0;
29 }

三、count

返回元素出现的次数

1 std::count
2 template <class InputIterator, class T>
3 typename iterator_traits<InputIterator>::difference_type
4 count (InputIterator first, InputIterator last, const T& val);

实现如下:

 1 template <class InputIterator, class T>
 2   typename iterator_traits<InputIterator>::difference_type
 3     count (InputIterator first, InputIterator last, const T& val)
 4 {
 5   typename iterator_traits<InputIterator>::difference_type ret = 0;
 6   while (first!=last) {
 7     if (*first == val) ++ret;
 8     ++first;
 9   }
10   return ret;
11 }
 1 // count algorithm example
 2 #include <iostream>     // std::cout
 3 #include <algorithm>    // std::count
 4 #include <vector>       // std::vector
 5
 6 int main () {
 7   // 统计元素在数组中出现次数
 8   int myints[] = {10,20,30,30,20,10,10,20};   // 8 elements
 9   int mycount = std::count (myints, myints+8, 10);
10   std::cout << "10 appears " << mycount << " times.\n";
11
12   //  统计元素在容器中出现次数
13   std::vector<int> myvector (myints, myints+8);
14   mycount = std::count (myvector.begin(), myvector.end(), 20);
15   std::cout << "20 appears " << mycount  << " times.\n";
16   return 0;
17 }

四、remove(参考《STL源码剖析》Page356)

1、执行remove之后,对象size不变,【不是和erase一样真的删除了】

2、remove是将相同元素,移动到容器后端;例如:

vec : 10 20 30 20 30 10

执行:vector<int>::iterator pend =   remove(vec.begin(), vec.end(), 20);

vec:    10  30  30  10  ?  ?

^

|

itr指向---------------------

例如:

 1 // remove algorithm example
 2 #include <iostream>     // std::cout
 3 #include <algorithm>    // std::remove
 4 #include<vector>
 5
 6 using namespace std;
 7
 8 int main() {
 9     int myints[] = { 10,20,30,30,20,10,10,20 };      // 10 20 30 30 20 10 10 20
10
11     vector<int> vec(myints, myints + sizeof(myints)/sizeof(int));
12     // bounds of range:
13     //int* pbegin = myints;
14     //int* pend = pbegin + sizeof(myints) / sizeof(int);
15
16     //pend = std::remove(pbegin, pend, 20);         // 10 30 30 10 10 ?  ?  ?
17     //std::cout << "range contains:";
18     //for (int* p = pbegin; p != pend; ++p)
19     //    std::cout << ‘ ‘ << *p;
20     //std::cout << ‘\n‘;
21
22     //================================================================
23
24     vector<int>::iterator pend = remove(vec.begin(), vec.end(), 20);
25     // 执行remove之后 vec的size不变
26     // vec = 10 30 30 10 10 ?  ?  ?        至于后面三个,是残余数据不确定的
27     for(vector<int>::iterator itr = vec.begin(); itr != pend; itr++ )
28     {
29         cout << *itr << " "; // 10 30 30 10 10
30     }
31     cout << endl;
32     vec.erase(pend, vec.end()); // 你可以再加一步,完成删除操作   10 30 30 10 10
33
34     return 0;
35 }

有关 remove_copy remove_if remove_copy_if 暂时不更新;用什么学什么,就是这个原则。

原文地址:https://www.cnblogs.com/winslam/p/9499164.html

时间: 2024-11-05 23:31:25

C++ - STL常用算法-sort、find、count、等等【还有remove......暂时不写】的相关文章

STL 常用算法

1.      STL 常用算法 l  for_each() 例1 //普通函数 voidFuncShowElemt2(int &t) { cout << t << " "; } vector<int> v1; v1.push_back(1); v1.push_back(3); v1.push_back(5); //通过回调函数  谁使用for_each 谁去填写回调函数的入口地址 for_each(v1.begin(), v1.end(),

[C++ STL] 常用算法总结

1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象. 2 常用算法介绍 STL中算法大致分为四类: 非可变序列算法:指不直接修改其所操作的容器内容的算法. 可变序列算法:指可以修改它们所操作的容器内容的算法. 排序

STL排序算法sort

要使用STL中的算法,需要在程序头文件引入#include <algorithm> 1.对基本类型的数组从小到大排序: sort(数组名+n1,数组名+n2); n1和n2都是int类型的表达式,可以包含变量 如果n1=0,则 + n1可以不写  将数组中下标范围为[n1,n2)的元素从小到大排序.下标为n2的元素不在排序区间内 2.对元素类型为T的基本类型数组从大到小排序: sort(数组名+n1,数组名+n2,greater<T>()); 3.用自定义的排序规则,对任何类型T的

STL常用算法

1.copy()函数 int myints[]={10,20,30,40,50,60,70}; std::vector<int> myvector (7); std::copy ( myints, myints+7, myvector.begin() ); 将一个容器中的元素复制到另一个容器中 2.count()函数 int myints[] = {10,20,30,30,20,10,10,20};   // 8 elements int mycount = std::count (myint

c++ STL常用算法使用方法

#include <string> #include <vector> #include <functional> #include <iostream> using namespace std; void print(vector<int>& list, const string &des) { cout<<"after "<<des.c_str()<<", th

STL常用算法总结 by StoneXie

include<algorithm> 1 sort(起始地址,结束地址+1,比较函数)作用:对连续存储的元素从起始地址到结束地址从小到大排序情况1:从大到小排序定义比较函数例子: bool cmp(int a,int b) { return(a>b); } 情况2:结构体数组排序法1:重载运算符(定义在结构体内部) struct Edge{ int no,w;//按w从小到大,w相同时按no从小到大 bool friend operator <(Edge a,Edge b) { i

STL中的常用算法

C++STL 常用算法,使用时包含#include <algorithm> 一.非变异算法 是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理.元素查找.子序列搜索.统计和匹配.非变异算法具有极为广泛的适用性,基本上可应用与各种容器. 1查找容器元素find 它用于查找等于某值的元素.它在迭代器区间[first,last)(闭开区间)上查找等于value值的元素,如果迭代器i所指的元素满足*i=value,则返回迭代器i:未找到满足条件的元素,返回last.函数原型:find( v1.

STL——配接器、常用算法使用

学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配而来.其实适配器也是一种设计模式,该种模式是将一个类的接口转换成用户希望的另外一个接口.简单的说:就是需要的东西就在眼前,但却不能用或者使用不是很方便,而短时间又无法改造它,那我们就通过已存在的东西去适配它. STL中的适配器一共有三种: ①应用于容器的即容器适配器:比如stack和queue就是对

STL算法 — sort

能使用STL的sort系列算法的前提是容器的迭代器必须为随机迭代器.所以,vector和deque天然适用.STL的sort算法采用了一些策略,在不同情况下采用不同的排序算法,以达到各种算法优势互补的效果.基本的原则是:数据量大时采用快速排序,数据量小时采用插入排序(这是对快排常用的一种优化策略),递归层次过深改用堆排序. 首先是插入排序.它的平均和最坏时间复杂度都为O(N2),量级小于千,那么插入排序还是一个不错的选择.SGI STL的插入排序默认以增序排列,另外还可以传入一个仿函数作为比较规