C++之STL算法使用参考

  • 算法(algorithm)是用于模板技术实现的适用于各种容器的通用程序
  • 算法常常通过迭代器间接地操作容器元素,而且通常会返回迭代器作为算法运算的结果
  • STL大约提供了70个算法,每个算法都是一个模板函数或者一组模板函数,能够在许多不同类型的容器上进行操作,各个容器则可能包含着不同类型的数据元素
  • STL中的算法覆盖了在容器上实施的各种常见操作,如遍历、排序、检索、插入及删除元素等操作。STL中许多算法不仅适用于系统提供的容器类,而且适用于普通的C++数组或自定义容器

find和count

  • find用于查找指定数据在某个区间中是否存在,该函数返回等于指定值的第一个元素位置,如果没找到就返回最后元素位置
  • count用于统计某个值在指定区间出现的次数
cpp 复制代码
find(beg, end, value);
count(beg, end, value);
cpp 复制代码
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int main(void){
    int a1[] = {100,200,300,400,500,600,700,800,900,1000};
    int *ptr = find(a1, a1+10, 800);
    cout << "400出现在数组a1的位置: " << ptr - a1 << endl;
    list<int> L1;
    int a2[] = {20,30,40,50,60,60,70,60,80};
    for(int i=0; i<sizeof(a2)/sizeof(a2[0]); i++){
        L1.push_back(a2[i]);
    }
    
    list<int>::iterator it;
    it = find(L1.begin(), L1.end(), 80);
    if(it != L1.end()){
        cout << "L1链表中存在元素: " << *it << endl;
        cout << "它是链表中第: " << distance(L1.begin(), it) + 1 << "个节点"<< endl;
    }
    int n1 = count(a1, a1+10, 500);
    cout << "a1 数组中 500出现了: "<<n1<< "次"<<endl;
    int n2 = count(L1.begin(), L1.end(), 60);
    cout << "L1 容器中 60出现了: " <<n2 <<"次"<< endl;
    return 0;
}
  • find算法从一个容器中查找指定的值,search算法则是从一个容器查找由另一个容器所指定的顺序值
cpp 复制代码
search(beg1, end1, beg2, end2);//左闭右开
  • search将在[beg1, end1)区间查找有无与[beg2, end2)相同的子区间,如果找到就返回[beg1, end1)内第一个相同元素的位置,如果没有找到返回end1
cpp 复制代码
#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
using namespace std;
int main(void){
    int a1[] ={10,20,30,40,50,60,70,80,90};
    int a2[]= {70,80,90};
    int *ptr = search(a1, a1+9, a2, a2+3);
    if(ptr == a1+9)
        cout << "not match" << endl;
    else
        cout << "math: " << ptr - a1 << endl;
    
    list<int> L;
    vector<int> V;
    for(int i=0; i<9; i++){
        L.push_back(a1[i]);
    }
    for(int i=0; i<3; i++){
        V.push_back(a2[i]);
    }
    
    list<int>::iterator pos;
    pos = search(L.begin(), L.end(), V.begin(), V.end());
    cout << distance(L.begin(), pos) << endl;
    return 0;
}:

merge

  • merge可对两个容器进行合并,将结果存放在第3个容器中,其用法如下:
cpp 复制代码
merge(beg1, end1, beg2, end2, dest)
  • merge将[beg1,end1)与[beg2, end2)区间合并,把结果存放在dest容器中。如果参与合并的两个容器中的元素是有序的,则合并的结果也是有序的。
  • list链表也提供了一个merge成员函数, 它能够把两个list类型的链表合并在一起。同样地,如果合并前的链表是有序的,则合并后的链表仍然有序
cpp 复制代码
#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
using namespace std;
int main(void){
    int a1[] ={10,20,30,40,50,60,70,80,90};
    int a2[]= {70,80,90, 100};
    int a3[13] = {0};
    merge(a1, a1+9, a2, a2+4, a3);
    for(int i=0; i<13; i++){
        cout << a3[i] << "\t" ;
    }
    cout << endl;
    
    list<int> L1;
    list<int> L2;
    for(int i=0; i<9; i++){
        L1.push_back(a1[i]);
    }
    for(int i=0; i<4; i++){
        L2.push_back(a2[i]);
    }
    L1.merge(L2);
    list<int>::iterator it;
    for(it=L1.begin(); it!=L1.end(); it++){
        cout << *it << "\t";
    }
    cout << endl;
    return 0;
}

sort

  • sort可对指定容器区间内的元素进行排序,默认排序的方式为从小到大,其用法入下:
cpp 复制代码
sort(beg, end);
  • beg, end)是要排序的区间,sort将按从小到大的顺序对该区间的元素进行排序

int main(void){
int a1[] ={10,2,-30, 840,550,6,120};
sort(a1, a1+7);
for(int i=0; i<7; i++){
cout << a1[i] << "\t";
}
cout << endl;
int a2[] ={10,2,-30, 840,550,6,120};
vector<int> V;
vector<int>::iterator it;
for(int i=0; i<7; i++){
V.push_back(a2[i]);
}
sort(V.begin(), V.end());
for(it=V.begin(); it!=V.end(); it++){
cout << *it << "\t";
}
cout << endl;
return 0;
}

复制代码
相关推荐
樱木Plus1 天前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit3 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_4 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星4 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛6 天前
delete又未完全delete
c++
端平入洛7 天前
auto有时不auto
c++
哇哈哈20218 天前
信号量和信号
linux·c++
多恩Stone8 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马8 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
超级大福宝8 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode