一:常用的查找算法

(一)adjacent_find():邻接查找

在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end
    vector<int> v1;

    v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); vector<int>::iterator iter = adjacent_find(v1.begin(), v1.end());  //只查找第一个
cout << *iter << endl;

(二)binary_search():二分查找

有序序列中查找value,找到则返回true
注意:在无序序列中,不可使用(虽然不会报错,但是无法正常工作)
int main()
{
vector<int> v1,v2; v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl; sort(v1.begin(), v1.end());
bool flag = binary_search(v1.begin(), v1.end(),);
if (flag)
cout << "find 8" << endl;
for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl; system("pause");
return ;
}
注意:对于vector,deque等容器需要我们先解析排序再来查找。所以set,map更加适合binary_search,自动排序

(三)count和count_if:

1)count(first,last,value):
first是容器的首迭代器,last是容器的末迭代器,value是询问的元素,
整个函数返回int型。
count函数的功能是:统计容器中等于value元素的个数。 2)count_if(first,last,comp) (在comp为true的情况下计数) 或者 count_if(first,last,value,comp) (这个是在comp为true的情况下统计容器中等于value的元素):
first为首迭代器,last为末迭代器,value为要查询的元素,comp为比较bool函数,为true则计数,函数返回型是int。 注:此两个函数复杂度是线性的,适用于小规模运算。count_if更加灵活
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional> //由于要使用到预定义函数对象,所以引入 using namespace std; template<typename T>
void ShowEle(const T& t) //用于打印容器数据
{
cout << t << " ";
}
int main()
{
vector<int> v1, v2, v3; for (int i = ; i < ;i++)
v1.push_back(rand() % ); //v1数据插入 //打印数据
for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl; int num = count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), ));
cout << num << endl; system("pause");
return ;
}

(四)find和find_if:同上

)find:  利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的迭代器。
)find_if: 使用输入的函数代替等于操作符执行find。返回被找到的元素的迭代器。
上面两个都是找到符合条件的首个元素的迭代指针
    vector<int> v1;

    v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl; vector<int>::iterator iter = find(v1.begin(), v1.end(), 8);
cout << *iter << endl;
    vector<int>::iterator iter = find_if(v1.begin(), v1.end(), bind2nd(greater<int>(),6));

cout << *iter << endl;

二:常用的排序算法

(一)merge()

merge:    合并两个有序序列,存放到另一个序列。《必须是有序序列
    vector<int> v1,v2,v3;

    v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); v2.push_back();
v2.push_back();
v2.push_back(); sort(v1.begin(), v1.end()); //必须进行排序,否则报错
sort(v2.begin(), v2.end());

v3.resize(10); //多余空间会默认存放0

merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
for_each(v3.begin(), v3.end(), ShowEle<int>);

(二)sort():使用如上

sort:  以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入比较函数。

(三)random_shuffle()

对指定范围内的元素随机调整次序。
    vector<int> v1,v2,v3;

    v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); v2.push_back();
v2.push_back();
v2.push_back(); sort(v1.begin(), v1.end()); //必须进行排序,否则报错
sort(v2.begin(), v2.end()); v3.resize(); //多余空间会默认存放0 merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), v3.end(), ShowEle<int>);
cout << endl; //对v3进行随机调序
random_shuffle(v3.begin(), v3.end()); for_each(v3.begin(), v3.end(), ShowEle<int>);

(四)reverse()

将容器中数据翻转
    for_each(v3.begin(), v3.end(), ShowEle<int>);
cout << endl; reverse(v3.begin(), v3.end()); for_each(v3.begin(), v3.end(), ShowEle<int>);
cout << endl;

三:常用的拷贝和替换算法

(一)copy()

将容器中数据拷贝到下一个容器中
    vector<int> v1,v2,v3;

    v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); v2.resize();
copy(v1.begin(), v1.end(), v2.begin());
for_each(v2.begin(), v2.end(), ShowEle<int>);

(二)replace()

replace(beg,end,oldValue,newValue):    将指定范围内的所有等于oldValue的元素替换成newValue
    replace(v2.begin(), v2.end(), 3, 13);

    for_each(v2.begin(), v2.end(), ShowEle<int>);
cout << endl;

(三)replace_if()

将指定范围内所有操作结果为true的元素用新值替换
    replace_if(v2.begin(), v2.end(), bind2nd(greater<int>(), 7), 2);  //将所有大于7的数变为2

    for_each(v2.begin(), v2.end(), ShowEle<int>);
cout << endl;

(四)swap()

交换两个容器的元素
    for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl; for_each(v2.begin(), v2.end(), ShowEle<int>);
cout << endl; swap(v1, v2);
cout << "swap v1 v2" << endl; for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl; for_each(v2.begin(), v2.end(), ShowEle<int>);
cout << endl;

四:常用的算术和生成算法

算术算法在#include<numeric>

(一)accumulate()

对指定范围内的元素求和,然后结果再加上一个由val指定的初始值
    int ret = accumulate(v1.begin(), v1.end(), );
cout << ret << endl;

(二)fill()

将输入值赋给标志范围内的所有元素
    v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); v1.resize(10); //后面扩充的全部赋值为0 for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl; fill(v1.begin() + 5, v1.end(), 6); for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl;

五:常用的集合算法

(总)set_union(),set_intersection(),set_difference():要求序列有序

set_union:  构造一个有序序列,包含两个有序序列的并集。
set_intersection: 构造一个有序序列,包含两个有序序列的交集。
set_difference: 构造一个有序序列,该序列保留第一个有序序列中存在而第二个有序序列中不存在的元素,为差集
    vector<int> v1,v2,v3;

    v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); v2.push_back();
v2.push_back();
v2.push_back(); sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end());
v3.resize(
10);
    set_union(v1.begin(), v1.end(), v2.begin(), v2.end(),v3.begin());

    for_each(v3.begin(), v3.end(), ShowEle<int>);
cout << endl;

    set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),v3.begin());

    for_each(v3.begin(), v3.end(), ShowEle<int>);
cout << endl;

    set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(),v3.begin());

    for_each(v3.begin(), v3.end(), ShowEle<int>);
cout << endl;

六:常用的遍历算法

(一)for_each()

用指定函数依次对指定范围内所有元素进行迭代访问。

(二)transform()

可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。
注:可以修改自己序列,只需要将第三个参数写为自己即可

(三)算法使用案例

template<typename T>
void ShowEle(const T& t) //用于打印容器数据
{
cout << t << " ";
} //自定义二元函数对象---数据相加
template<typename T>
class MySumAdd :public binary_function<T, T, int>
{
public:
int operator()(const T& t1, const T& t2) const
{
return t1 +
t2;
}

}; int main()
{
vector<int> v1; for (int i = ; i < ;i++)
v1.push_back(rand() % ); //v1数据插入

for_each(v1.begin(), v1.end(), ShowEle<int>
);
cout << endl; //将v1中所有数据加2
transform(v1.begin(), v1.end(), v1.begin(), bind2nd(MySumAdd<int>(), 2)); for_each(v1.begin(), v1.end(), ShowEle<int>);
cout << endl; system("pause");
return ;
}

03--STL算法(常用算法)的更多相关文章

  1. STL标准库-算法-常用算法

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...

  2. C++ STL 之 常用算法

    #include <iostream> #include <vector> #include <algorithm> using namespace std; // ...

  3. STL中常用算法

    一.排序 sort sort(first_pointer,first_pointer+n,cmp) 默认为升序 若要使用降序,自行写cmp 函数 bool cmp(int a,int b){ retu ...

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

    学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配 ...

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

    1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<alg ...

  6. 28.STL常用算法

    #include <algorithm> 算法 常用版本 描述 返回Type std::find() find(_InIt _Fisrt,_InIt _Last, _Ty& _Va ...

  7. C++ STL——常用算法

    目录 一 常用查找算法 二 常用遍历算法 注:原创不易,转载请务必注明原作者和出处,感谢支持! 注:内容来自某培训课程,不一定完全正确! 一 常用查找算法 /* find算法 查找元素 @param ...

  8. ACM常用算法及练习(2)

    ACM常用算法及练习 知识类型 重要度 容易度 应掌握度 典型题 其他           数据结构(5) 链表 ★★☆ ★★★ ★★☆     栈 stack ★★★ ★★★ ★★★ HLoj120 ...

  9. ACM常用算法及练习(1)

    ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...

  10. 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)

    相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...

随机推荐

  1. SQL SERVER中如何查找存储过程中一段代码

    select b.name ,a.text from syscomments a,sysobjects b where and object_id(b.name)=a.id and b.xtype i ...

  2. logstash可以考虑在项目中用起来

    在用Node.js开发项目的时候,我们常用 log4js 模块来进行日志的记录,可以通过配置 log4js 的 Appenders 将日志输出到Console.File和GELF等不同的地方. log ...

  3. 混合应用 微信登录授权 微信登录认证失败 ios PGWXAPI错误-1 code:-100 / 安卓 message:invalid appsecret innerCode:40125

    最近项目需要做微信登录,于是利用HTML5+ API Reference的OAuth模块管理客户端的用户登录授权验证功能,允许应用访问第三方平台的资源.(链接:https://www.dcloud.i ...

  4. MySQL5.7版本安装(压缩包形式)

    1.去官网下载 MySQL 压缩包 2.配置环境变量 3.创建配置文件my.ini (放置 mysql-5.7.28-winx64 目录下) my.ini 配置文件 编写如下内容 [client] p ...

  5. 2018 南京网络预赛Sum ——莫比乌斯反演

    题意 设 $f(n)$ 为 $n=ab$ 的方案数,其中 $a,b$ 为无平方因子数.求 $\displaystyle  \sum_{i=1}^nf(i)$,$n \leq 2e7$. 分析 显然,可 ...

  6. docker学习(六)

    一.Dockerfile使用 Dockerfile 可以允许用户创建自定义的镜像. 1.基本结构Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行.一般的,Dockerfile ...

  7. 设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。

    设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件. 我实现的功能是提供父目录(兄弟目录),输入文件名,创建树型目录结构,文本文件不可以再有子目录 ...

  8. BigDecimal进行除法运算时的坑

      循环小数输出的坑 BigDecimal做除法时如果出现除不尽(循环小数)的情况,会抛异常: BigDecimal a = new BigDecimal("1"); System ...

  9. Arrays.binarySearch采坑记录及用法

    今天在生产环境联调的时候,发现一个很奇怪的问题,明明测试数据正确,结果却是结果不通过,经过debug查询到原来是Arrays.binarySearch用法错误,记录一下,避免后续再次犯错 具体测试如下 ...

  10. Highcharts 的使用(各种统计图)(难点:绑定数据)

    1.我们先打开 官方下载的 文件包 打开 index.htm 页面 里面有非常多的 统计图. 我是用的是3D charts 中的 3D column 也就是 3D的柱状图. 选择一个 后 会有非常棒的 ...