栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【模板】算法基础之STL常用算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【模板】算法基础之STL常用算法

标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要表出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用。

以下算法需要头文件#include  

一、排序

sort (first, last)对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序。
stable_sort (first, last)对于 [first, last) 范围内值相同的元素,该函数不会改变它们的相对位置。
partial_sort (first, middle, last)从 [first,last) 范围内,筛选出 middle-first 个最小的元素并排序存放在该区间中。
partial_sort_copy (first, last, result_first, result_last)从 [first, last) 范围内筛选出 result_last-result_first 个元素排序并存储到 [result_first, result_last) 指定的范围中。
is_sorted (first, last)检测 [first, last) 范围内是否已经排好序,默认检测是否按升序排序。
is_sorted_until (first, last)如果 [first, last) 范围的元素没有排好序,则该函数会返回一个指向首个不遵循排序规则的元素的迭代器。
void nth_element (first, nth, last)找到 [first, last) 范围内按照排序规则(默认按照升序排序)应该位于第 nth 个位置处的元素,并将其放置到此位置。同时使该位置左侧的所有元素都比其存放的元素小,该位置右侧的所有元素都比其存放的元素大。

注:

  1. 容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持。
  2. 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持<小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符;
  3. sort() 函数在实现排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。
  4. int cmp(int a,int b)//自定义排序规则(降序)
    {
        return a>b;
    }

 二、合并

1.merge()//将 2 个有序序列合并为 1 个有序序列

Iterator merge (Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator result);以默认的升序排序作为排序规则
Iterator merge (Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Iterator result, Compare comp);以自定义的 comp 规则作为排序规则

2.inplace_merge()//将2个存储在同一个数组或容器中的有序序列合并为1个有序序列

void inplace_merge (Iterator first, Iterator middle, Iterator last);默认采用升序的排序规则
void inplace_merge (Iterator first, Iterator middle, BidirectionalIterator last, Compare comp);采用自定义的 comp 排序规则
 
三、查找 
Iterator find (Iterator first, Iterator last, const T& val);在[first,last)内查找等于val的第一个元素
Iterator find_if (Iterator first, Iterator last, UnaryPredicate pred);find_if() 函数会根据指定的pred查找规则,在[first,last)内查找第一个符合该函数要求(使函数返回 true)的元素。
Iterator find_if_not (Iterator first, Iterator last, UnaryPredicate pred);查找第一个不符合谓词函数规则的元素。
Iterator find_end (Iterator first1, Iterator last1, Iterator first2, Iterator last2);(BinaryPredicate pred)查找序列 [first1, last1) 中最后一个子序列 [first2, last2) (pred 规则)
Iterator find_first_of (Iterator first1, Iterator last1, Iterator first2, Iterator last2);(BinaryPredicate pred)在 A 序列中查找和 B 序列中任意元素相匹配的第一个元素(pred 规则)
Iterator lower_bound (Iterator first, Iterator last, const T& val);(Compare cmp)在 [first, last) 区域内查找不小于 val 的元素(cmp 规则)
Iterator upper_bound (Iterator first, Iterator last, const T& val);(Compare cmp)

查找[first, last)区域中第一个大于 val 的元素。

(cmp 规则)

pair equal_range (Iterator first, Iterator last, const T& val);(cmp)找到 [first, last) 范围内所有等于 val 的元素 (cmp规则)
bool cmp(int i) {//自定义查找规则
  return ((i%2)==1);
}
四、排列
bool next(prev)_permutation(iterator start,iterator end)当前序列不存在(上)下一个排列时,函数返回false,否则返回true
bool is_permutation(_FwdIt1 _First1, _FwdIt1 _Last1, _FwdIt2 _First2)检查一个序列是不是另一个序列的排列,如果是,会返回 true。
int num[3]={1,2,3};//“原地”生成全排列
do
{
    cout< 
五、去重  
iterator unique(iterator it_1,iterator it_2);对容器中[it_1,it_2)范围的元素进行去重,返回去重后容器中不重复序列的最后一个元素的下一个元素
vector alls;
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());   // 去掉重复元素
六、赋值
void fill (Iterator first, Iterator last, const T& val)为容器中的每个元素赋以val,通常用于初始化
int v[10];
fill(v,v+10,-1);//给一维数组赋值
fill(v[0],v[0]+10*10,-1);//给多维数组赋值

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862191.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号