C++中STL常用算法


算法主要是由头文件 组成。 是所有STL头文件中最大的一个,其中常用的功能涉 及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等…体积很小,只 包括在几个序列容器上进行的简单运算的模板函数. 定义了一些模板类,用以声明 函数对象。

1、常用的遍历算法

1、for_each:遍历容器元素


遍 历 算 法 遍 历 容 器 元 素 
	@param beg 开 始 迭 代 器 
	@param end 结 束 迭 代 器 
	@param _callback 函 数 回 调 或 者 函 数 对 象 
	@return 函 数 对 象
for_each(iterator beg, iterator end, _callback); 

2、transform算法 将指定容器区间元素搬运到另一容器中

注意 : 
transform 不会给目标容器分配内存,所以需要我们提前分配好内存 
	@param beg1 源容器开始迭代器 
	@param end1 源容器结束迭代器 
	@param beg2 目标容器开始迭代器 
	@param _cakkback 回调函数或者函数对象 
	@return 返回目标容器迭代器
transform(iterator beg1, iterator end1, iterator beg2, _callbakc);

在这里插入图片描述

int myTransInt(int val)
{
    return val;
}
class MyTransInt{
public:
    int operator()(int val)
    {
        return val;
    }
};

void test02()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);

    //将v1容器的元素 帮运到 v2中
    vector<int> v2;
    //预先:设置v2的大小(注意!!!)
    v2.resize(v1.size());

    //transform(v1.begin(),v1.end(),v2.begin(), 搬运方式);
    //transform(v1.begin(),v1.end(),v2.begin(),myTransInt);
    transform(v1.begin(),v1.end(),v2.begin(),MyTransInt());

    for_each(v2.begin(),v2.end(),[](int val){cout<<val<<" ";});
    cout<<endl;
}

运行结果:
在这里插入图片描述

2、常用的查找算法

2.1、find算法 查找元素

find算 法 查 找 元 素 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器 
	@param value 查 找 的 元 素 
	@return 返 回 查 找 元 素 的 位 置
find(iterator beg, iterator end, value) 

失败返回v.end()

#include<string>
class Person
{
public:
    string name;
    int age;
public:
    Person(string name,int age)
    {
        this->name = name;
        this->age = age;
    }
    bool operator==(const Person &ob)
    {
        if(this->name == ob.name && this->age==ob.age)
            return true;
        return false;
    }
};
void test03()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);

    vector<int>::iterator ret;
    ret = find(v1.begin(),v1.end(),20);
    if(ret != v1.end())
    {
        cout<<"找到的数据为:"<<*ret<<endl;
    }

    vector<Person> v2;
    v2.push_back(Person("德玛西亚",18));
    v2.push_back(Person("小法",19));
    v2.push_back(Person("小炮",20));
    v2.push_back(Person("牛头",21));

    Person tmp("小炮",20);
    vector<Person>::iterator ret2;
    //对于find寻找自定义数据 需要重载==
    ret2 = find(v2.begin(),v2.end(),tmp);
    if(ret2 != v2.end())
    {
        cout<<"找到的数据name="<<(*ret2).name<<",age="<<(*ret2).age<<endl;
    }
}

运行结果:
在这里插入图片描述

2、find_if条件查找


find_if算 法 条 件 查 找 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器 
	@param callback 回 调 函 数 或 者 谓 词 ( 返 回 bool类 型 的 函 数 对 象 )
	@return bool
	查 找 返 回 true
	否 则 false
find_if(iterator beg, iterator end, _callback);
bool myGreaterThan20(int val)
{
    return val>20;
}
class MyGreaterThan20{
public:
    bool operator()(int val)
    {
        return val>20;
    }
};

void test04()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);

    //寻找第一个大于20的数
    vector<int>::iterator ret;
    //ret = find_if(v1.begin(),v1.end(), myGreaterThan20 );
    ret = find_if(v1.begin(),v1.end(), MyGreaterThan20() );
    if(ret != v1.end())
    {
        cout<<"寻找到的数据为:"<<*ret<<endl;
    }
}

运行结果:
在这里插入图片描述

2.3、adjacent_find算法 查找相邻重复元素

adjacent_find算 法 查 找 相 邻 重 复 元 素
	@param beg容 器 开 始 迭 代 器
	@param end容 器 结 束 迭 代 器 
	@param _callback回调函数或者谓词(返回bool类型的函数对象)
	@return返回相邻元素的第一个位置的迭代器 
adjacent_find(iterator beg, iterator end, _callback);
void test05()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(20);
    v1.push_back(40);
    v1.push_back(50);
    v1.push_back(50);
    vector<int>::iterator ret;
    //对于普通数据 不需要回调函数
    ret = adjacent_find(v1.begin(),v1.end());
    if(ret != v1.end())
    {
        cout<<"寻找到重复的数据:"<<*ret<<endl;
    }

    vector<Person> v2;
    v2.push_back(Person("德玛西亚",18));
    v2.push_back(Person("小法",19));
    v2.push_back(Person("小法",19));
    v2.push_back(Person("牛头",21));
    vector<Person>::iterator ret2;
    ret2 = adjacent_find(v2.begin(),v2.end());
    if(ret2 != v2.end())
    {
        cout<<"寻找到重复的数据:"<<(*ret2).name<<" "<<(*ret2).age<<endl;
    }
}

运行结果:
在这里插入图片描述

2.4、binary_search算法 二分查找法(容器必须有序)

binary_search算 法 二 分 查 找 法
	注 意 :
	在 无 序 序 列 中 不 可 用 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器 
	@param value 查 找 的 元 素 
	@return bool 查找到返回 true 否则 false
bool binary_search(iterator beg, iterator end, value); 
void test06()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    bool ret = binary_search(v1.begin(),v1.end(),30);
    if(ret == true)
    {
        cout<<"找到"<<endl;//找到
    }
    else
    {
        cout<<"未找到"<<endl;
    }
}

2.5、count算法 统计元素出现次数

count算 法 统 计 元 素 出 现 次 数 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器 
	@param value 回 调 函 数 或 者 谓 词 ( 返 回 bool类 型 的 函 数 对 象 )
	@return int 返 回 元 素 个 数
count(iterator beg, iterator end, value); 
void test07()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(10);
    v1.push_back(40);
    v1.push_back(10);

    cout<<count(v1.begin(),v1.end(),10)<<endl;//3
}

2.6、count_if算法 统计元素出现次数

count_if算 法 统 计 元 素 出 现 次 数 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器 
	@param callback 回 调 函 数 或 者 谓 词 ( 返 回 bool类 型 的 函 数 对 象 )
	@return int返 回 元 素 个 数
count_if(iterator beg, iterator end, _callback); 
bool myGreaterThan10(int val)
{
    return val>10;
}
class MyGreaterThan10
{
public:
    bool operator()(int val)
    {
        return val>10;
    }
};
void test07()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(10);
    v1.push_back(40);
    v1.push_back(10);

    cout<<count(v1.begin(),v1.end(),10)<<endl;//3

    //普通函数
    cout<<count_if(v1.begin(),v1.end(), myGreaterThan10)<<endl;//2
    //函数对象
    cout<<count_if(v1.begin(),v1.end(), MyGreaterThan10())<<endl;//2
    //内建函数对象
    cout<<count_if(v1.begin(),v1.end(), bind2nd(greater<int>(),10))<<endl;//2
}

运行结果:
在这里插入图片描述

3、常用排序算法

3.1、merge算法 容器元素合并,并存储到另一容器中(每个容器必须有序)

merge算 法 容 器 元 素 合 并 , 并 存 储 到 另 一 容 器 中
	注 意 : 两 个 容 器 必 须 是 有 序 的 
	@param beg1 容 器 1 开 始 迭 代 器 
	@param end1 容 器 1 结 束 迭 代 器 
	@param beg2 容 器 2 开 始 迭 代 器 
	@param end2 容 器 2 结 束 迭 代 器 
	@param dest 目 标 容 器 开 始 迭 代 器
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterat or dest)
void test01()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);

    vector<int> v2;
    v2.push_back(2);
    v2.push_back(4);
    v2.push_back(6);
    v2.push_back(8);

    vector<int> v3;
    //预先:设置v3的大小
    v3.resize(v1.size()+v2.size());

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

    for_each(v3.begin(),v3.end(),[](int val){cout<<val<<" ";});
    cout<<endl;
}

运行结果:
在这里插入图片描述

3.2、sort算法 容器元素排序

sort算 法 容 器 元 素 排 序 
	@param beg 容 器 1 开 始 迭 代 器 
	@param end 容 器 1 结 束 迭 代 器 
	@param _callback 回 调 函 数 或 者 谓 词 ( 返 回 bool类 型 的 函 数 对 象 )
sort(iterator beg, iterator end, _callback) 

3.3、random_shuffle算法 对指定范围内的元素随机调整次序

random_shuffle算 法 对 指 定 范 围 内 的 元 素 随 机 调 整 次 序
	@param beg容 器 开 始 迭 代 器
	@param end容 器 结 束 迭 代 器
random_shuffle(iterator beg, iterator end) 
#include<time.h>
void test02()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);

    //srand设置种子
    srand(time(NULL));

    for_each(v1.begin(),v1.end(),[](int val){cout<<val<<" ";});
    cout<<endl;

    //需要配置 srand
    random_shuffle(v1.begin(),v1.end());

    for_each(v1.begin(),v1.end(),[](int val){cout<<val<<" ";});
    cout<<endl;
}

运行结果:
在这里插入图片描述

3.4、reverse算法 反转指定范围的元素

reverse算 法 反 转 指 定 范 围 的 元 素 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器
reverse(iterator beg, iterator end)
void test03()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);
    for_each(v1.begin(),v1.end(),[](int val){cout<<val<<" ";});
    cout<<endl;//1 3 5 7

    reverse(v1.begin(),v1.end());

    for_each(v1.begin(),v1.end(),[](int val){cout<<val<<" ";});
    cout<<endl;//7 5 3 1
}

4、常用拷贝和替换算法

4.1、copy算法 将容器内指定范围的元素拷贝到另一容器中

copy算 法 将 容 器 内 指 定 范 围 的 元 素 拷 贝 到 另 一 容 器 中 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器 
	@param dest 目 标 起 始 迭 代 器
copy(iterator beg, iterator end, iterator dest) 
#include<iterator>
void test04()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);

    vector<int> v2;
    //预先:设置大小
    v2.resize(v1.size());

    copy(v1.begin(),v1.end(),v2.begin());

    for_each(v2.begin(),v2.end(),[](int val){cout<<val<<" ";});
    cout<<endl;//1 3 5 7

    //copy秀一下:用copy输出(了解)
    copy(v2.begin(),v2.end(), ostream_iterator<int>(cout," ") );
}

运行结果:
在这里插入图片描述

4.2、replace算法 将容器内指定范围的旧元素修改为新元素

replace算 法 将 容 器 内 指 定 范 围 的 旧 元 素 修 改 为 新 元 素 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器 
	@param oldvalue 旧 元 素 
	@param oldvalue 新 元 素
replace(iterator beg, iterator end, oldvalue, newvalue) 

4.3、replace_if算法 将容器内指定范围满足条件的元素替换为新元素

replace_if算 法 将 容 器 内 指 定 范 围 满 足 条 件 的 元 素 替 换 为 新 元 素
	@param beg容 器 开 始 迭 代 器
	@param end容 器 结 束 迭 代 器 
	@param callback 函 数 回 调 或 者 谓 词 ( 返 回 Bool类 型 的 函 数 对 象 )
	@param oldvalue新 元 素
replace_if(iterator beg, iterator end, _callback, newvalue)
void test05()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);

    //将容器中的3替换成3000
    replace(v1.begin(),v1.end(),3,3000);
    copy(v1.begin(),v1.end(), ostream_iterator<int>(cout," ") );
    cout<<endl;

    vector<int> v2;
    v2.push_back(1);
    v2.push_back(3);
    v2.push_back(5);
    v2.push_back(7);
    //将容器的大于3替换成3000
    replace_if(v2.begin(),v2.end(),  bind2nd(greater<int>(),3) , 1000 );
    copy(v2.begin(),v2.end(), ostream_iterator<int>(cout," ") );
    cout<<endl;
}

运行结果:
在这里插入图片描述

4.4、swap算法 互换两个容器的元素

swap算 法 互 换 两 个 容 器 的 元 素 
	@param c1 容 器 1 
	@param c2 容 器 2
swap(container c1, container c2) 

5、算术生成算法

5.1、accumulate算法 计算容器元素累计总和

accumulate算 法 计 算 容 器 元 素 累 计 总 和
	@param beg容 器 开 始 迭 代 器
	@param end容 器 结 束 迭 代 器 
	@param value 累 加 值
accumulate(iterator beg, iterator end, value) 
void test06()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);
    v1.push_back(7);

    int sum = accumulate(v1.begin(),v1.end(),1000);
    cout<<"sum = "<<sum<<endl;//1016
}

5.2、fill算法 向容器中添加元素

fill算 法 向 容 器 中 添 加 元 素 
	@param beg 容 器 开 始 迭 代 器 
	@param end 容 器 结 束 迭 代 器 
	@param value t 填 充 元 素
fill(iterator beg, iterator end, value)

#include<iterator>
#include<vector>
#include<algorithm>
void test07()
{
    vector<int> v;
    v.resize(5);
    fill(v.begin(),v.end(),50);
    for_each(v.begin(),v.end(),[](int vel){cout<<vel<<" ";});
    cout<<endl;
}

6、常用集合算法

在这里插入图片描述
在这里插入图片描述

6.1、set_intersection算法 求两个set集合的交集

set_intersection算法 求两个set集合的交集
	注意:两个集合必须是有序序列
	@param beg1 容器1开始迭代器
	@param end1 容器1结束迭代器
	@param beg2 容器2开始迭代器
	@param end2 容器2结束迭代器
	@param dest  目标容器开始迭代器
	@return 目标容器的最后一个元素的迭代器地址
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)

6.2、set_intersection算法 求两个set集合的交集

set_union算法 求两个set集合的并集
	注意:两个集合必须是有序序列
	@param beg1 容器1开始迭代器
	@param end1 容器1结束迭代器
	@param beg2 容器2开始迭代器
	@param end2 容器2结束迭代器
	@param dest  目标容器开始迭代器
	@return 目标容器的最后一个元素的迭代器地址
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)

6.3、set_difference算法 求两个set集合的差集

set_difference算法 求两个set集合的差集
	注意:两个集合必须是有序序列
	@param beg1 容器1开始迭代器
	@param end1 容器1结束迭代器
	@param beg2 容器2开始迭代器
	@param end2 容器2结束迭代器
	@param dest  目标容器开始迭代器
	@return 目标容器的最后一个元素的迭代器地址
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)
void test08()
{
    vector<int> A;
    A.push_back(1);
    A.push_back(3);
    A.push_back(5);
    A.push_back(7);
    A.push_back(9);

    vector<int> B;
    B.push_back(7);
    B.push_back(9);
    B.push_back(2);
    B.push_back(4);
    B.push_back(6);

    //求交集
    vector<int> v1;//存放交集
    v1.resize(min(A.size(),B.size()));

    vector<int>::iterator myEnd= set_intersection(A.begin(),A.end(),B.begin(),B.end(), v1.begin());
    copy(v1.begin(), myEnd, ostream_iterator<int>(cout," ") );
    cout<<endl;

    //求并集
    vector<int> v2;//存放并集
    v2.resize(A.size()+B.size() );
    myEnd = set_union(A.begin(),A.end(),B.begin(),B.end(), v2.begin());
    copy(v2.begin(), myEnd, ostream_iterator<int>(cout," ") );
    cout<<endl;

    //求差集 A 差 B
    vector<int> v3;//存放并集
    v3.resize( A.size() );
    myEnd = set_difference(A.begin(),A.end(),B.begin(),B.end(), v3.begin());
    copy(v3.begin(), myEnd, ostream_iterator<int>(cout," ") );
    cout<<endl;
}

运行结果:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章