STL中常用的算法(寻找最大值,最小值,索引,区间内查找算法等等)

STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中。众多算法中,查找算法是应用最为普遍的一类。

使用STL的Vector时,利用函数 max_element,min_element,distance可以获取Vector中最大、最小值的值和位置索引:

代码如下:

#include <algorithm>
#include <iostream>
 
int main()
{
    std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};
 
    std::vector<double>::iterator biggest = std::max_element(std::begin(v), std::end(v));
    //or std::vector<double>::iterator biggest = std::max_element(v.begin(), v.end);
 
    
    std::cout << "Max element is " << *biggest<< " at position " <<std::distance(std::begin(v), biggest) << std::endl;
    //另一方面,取最大位置也可以这样来写:
    //int nPos = (int)(std::max_element(v.begin(), v.end()) - (v.begin());
    //效果和采用distance(...)函数效果一致
    //说明:max_element(v.begin(), v.end()) 返回的是vector<double>::iterator, 
    //相当于指针的位置,减去初始指针的位置结果即为最大值得索引。
 
    auto smallest = std::min_element(std::begin(v), std::end(v));
    std::cout << "min element is " << *smallest<< " at position " <<std::distance(std::begin(v), smallest) << std::endl;
}
 


 
输出:
 
 

Max element is 5 at position 4
min element is 1 at position 0

当然还有求和

为了对vector中的所有元素求和,我们利用accmulate这个函数。

头文件#include <numeric>。
    int num=accumulate(va.begin(),va.end(),0); //求和

单个元素查找

1、 find() 比较条件为元素是否相等的查找:

1

2

template <class InputIterator, class T>

InputIterator find (InputIterator first, InputIterator last, const T& val);

2、find_if() 自定义比较函数 
从给出的区间中查找第一个满足比较函数的元素

1

2

3

4

5

bool cmpFunction (int i) {

  return ((i%30)==0);

}

it = std::find_if (myvector.begin(), myvector.end(), cmpFunction);

std::cout << "first:" <<  *it <<std::endl;

3、count() 统计元素出现的次数 
std::count() 统计区间中某个元素出现的次数 
std::count_if() 自定义比较函数

4、min_element() 查找给定区间内最小值

5、max_element() 查找给定区间内最大值

6、binary_search() 有序区间的二分查找 
binary_search() 用来在一个有序区间中使用二分法查找元素是否在这个区间中,该算法的返回值为bool表示是否存在

1

2

3

4

5

6

template <class ForwardIterator, class T>

  bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)

{

  first = std::lower_bound(first,last,val);

  return (first!=last && !(val<*first));

}

 

7、lower_bound() 返回有序序列给定区间[first, last) (左闭右开)内的第一个大于等于value的位置。如果所有元素都小于value,则返回last。

1

2

3

4

5

template< class ForwardIterator, class Type >

ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const Type &value );

 

template< class ForwardIterator, class Type, class Compare>

ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const Type &value, Compare comp ); //支持自定义比较函数

 

8、upper_bound() 返回有序序列给定区间[first, last) (左闭右开)内的第一个大于value的位置。如果所有元素都小于等于value,则返回last。

1

2

3

4

5

template< class ForwardIterator, class Type >

ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const Type &value );

 

template< class ForwardIterator, class Type, class Compare>

ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const Type &value, Compare comp ); //支持自定义比较函数

 

其中lower_bound/upper_bound 可以用于任何支持随机访问的容器中,比如vector,deque,数组。对于不支持随机访问的容器如 set/map,这些容器有同名的方法来进行 lower_bound/upper_bound 操作。

1

2

3

4

map::lower_bound(key):返回map中第一个大于或等于key的迭代器指针

map::upper_bound(key):返回map中第一个大于key的迭代器指针

set::lower_bound(val):返回set中第一个大于或等于val的迭代器指针

set::upper_bound(val):返回set中第一个大于val的迭代器指针

 

区间查找(区间整体匹配)

1、search() 查找子区间首次出现的位置 
find() 用来查找单个元素,search() 用来查找一个子区间,比如 从myvector中查找自取件[20, 30] 的位置

1

2

3

4

int needle1[] = {20,30};

it = std::search (myvector.begin(), myvector.end(), needle1, needle1+2);

if (it!=myvector.end())

std::cout << "needle1 found at position " << (it-myvector.begin()) << '\n';

 

search() 支持自定义比较函数,比如查询给定区间中每个元素比目标区间小1的子区间:

1

2

3

4

5

6

7

8

9

bool cmpFunction (int i, int j) {

  return (i-j==1);

}

int myints[] = {1,2,3,4,5,1,2,3,4,5};

std::vector<int> haystack (myints,myints+10);

 

int needle2[] = {1,2,3};

// using predicate comparison:

it = std::search (haystack.begin(), haystack.end(), needle2, needle2+3, cmpFunction);

 

2、find_end() 查找子区间最后一次出现的位置 
search()查找子区间第一次出现的位置,而find_end() 用来查找子区间最后一次出现的位置,find_end()支持自定义比较函数。

3、equal() 判断两个区间是否相等

4、mismatch() 查询两个区间首次出现不同的位置

集合查找(集合内任意一个元素匹配)

find_first_of() 查找给定集合中的任意一个元素

 

参考:https://blog.csdn.net/leonardohaig/article/details/81484372 

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11STL常用的排序算法有以下几种: 1. sort sort是STL常用的排序算法,它可以对容器的元素进行排序。sort的时间复杂度为O(NlogN),使用快速排序算法实现。sort的基本使用方法如下: ```c++ sort(begin, end); // 对区间[begin, end)内的元素排序 ``` 其,`begin`和`end`分别是容器要排序的元素的起始和结束迭代器。 此外,sort还可以接受一个可调用对象作为参数,来实现自定义的排序方法。例如,可以按照元素的某个属性进行排序: ```c++ sort(v.begin(), v.end(), [](const auto& a, const auto& b) { return a.property < b.property; }); // 按照元素的property属性进行排序 ``` 2. stable_sort stable_sort与sort的用法类似,也可以对容器的元素进行排序,但它保证了相等元素的相对顺序不会发生改变。stable_sort的时间复杂度为O(NlogN),使用归并排序算法实现。stable_sort的基本使用方法如下: ```c++ stable_sort(begin, end); // 对区间[begin, end)内的元素排序 ``` 3. partial_sort partial_sort可以对容器的元素进行部分排序,即只将前k个最小(或最大)的元素放在容器的前k个位置上。partial_sort的时间复杂度为O(Nlogk),使用堆排序算法实现。partial_sort的基本使用方法如下: ```c++ partial_sort(begin, middle, end); // 将区间[begin, end)内的前middle-begin个元素排序,其他元素保持原有顺序 ``` 其,`middle`是一个迭代器,指向容器排序后前middle-begin个元素的末尾位置。 4. nth_element nth_element可以找出容器第k小(或第k大)的元素。nth_element的时间复杂度为O(N),使用快速选择算法实现。nth_element的基本使用方法如下: ```c++ nth_element(begin, nth, end); // 将区间[begin, end)内的元素排序,使得第nth个元素是第nth小的元素 ``` 其,`nth`是一个迭代器,指向容器第nth小的元素。 以上就是C++11STL常用的排序算法,可以根据实际需求选择适合的算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值