STL算法(二)

目录

一、排列组合

二、算术类算法

(1)求和

(2)逐步求和

(3)求内积运算 矩阵乘法

(4)求相邻元素差值

三、生成异变算法

(1)for_each访问

(2)fill 填充一部分元素

(3)fill_n

(4)填充前n个位置 通过函数去复制

(5) transform使用方式和for_each类似

四、关系类算法

(1)equal

(2)includes

(3)lexicographical_compare

(4) mismatch

五、集合运算

(1)set_union

(2)  set_intersection

(3) set_difference

(4)  set_symmetric_difference

六、堆算法


一、排列组合

  next_permutation:下一个排序序列的组合
    prev_permutation:上一个排序序列的组合
    例如序列:1,2,3
    {1,2,3}下一个序列为{1,3,2}
    {1,3,2}上一个序列为{1,2,3}

#include<functional>
#include<algorithm>
#include<iostream>
#include<array>
#include<vector>

int main()
{
    array<int, 3> data={ 1,2,3 };
    next_permutation(data.begin(), data.end());
    for (auto v : data)
    {
        cout << v;
    }
    cout << endl;
    prev_permutation(data.begin(), data.end());
    for (auto v : data)
    {
        cout << v;
    }
    vector<int> vecData = { 1,2,3,4 };
    int i = 0;
//找出所有组合
    do
    {
        cout << "第" << i + 1 << "组";
        for (auto v : vecData)
        {
            cout << v;
        }
        cout << endl;
        i++;
    } while (next_permutation(vecData.begin(), vecData.end()));

    cout << endl;
    return 0;
}

二、算术类算法

accumulate:区间求和
    
    partial_sum:相邻元素的和
    
    inner_product:序列内积运算
    
    adjacent_difference:相邻元素的差

#include<functional>
#include<algorithm>
#include<numeric>
#include<iostream>
#include<iterator>
#include<vector>

(1)求和

 vector<int> data = { 1,2,3,4,5,6,7,8,9 };
    int sum = 0;
    for (auto v : data)
    {
        sum += v;
    }
    cout << sum << endl;
    sum = 0;
    //0表示求和的起始值 相当于0加上求和值
    sum = accumulate(data.begin(), data.end(), 0);
    cout << sum << endl;

(2)逐步求和

以下面为例 就是 1  1+2  1+2+3........1+2+3+.....+9

  //2逐步求和
 vector<int> data = { 1,2,3,4,5,6,7,8,9 };
    vector<int> result(data.size());
//将结果放到result容器内
    partial_sum(data.begin(), data.end(), result.begin());
    for (auto v : result)
    {
        cout << v << " ";
    }
    cout << endl;

(3)求内积运算 矩阵乘法

//3求内积运算:矩阵乘法
//创建两个矩阵
          [1
[1 2 3 4] 2   = [1+4+9+16]
          3
          4]
    vector<int> first(4);
    vector<int> second(4);
    for (int i = 0;i < 4;i++)
    {
        first[i] = i + 1;  //1 2 3 4
        second[i] = i + 1;// 1 2 3 4
    }

    cout << inner_product(first.begin(), first.end(), second.begin(),0);
   

(4)求相邻元素差值

   vector<int> test = { 2,2,3,4,5,6,7,8,9 };
    adjacent_difference(test.begin(), test.end(),
        ostream_iterator<int>(cout, "\t"));
    //ostream_iterator<int>(cout, "\t")表示直接打印
    //可以用新容器的开始位置替换这个参数

三、生成异变算法

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>

    for_each:迭代访问
    fill:填充方式初始化容器
    fill_n:指定长度填充容器
    generate_n:填充前n个位置
    transform:一元转换和二元转换

辅助函数

void print(int data)
{
    cout << data << " ";
}

(1)for_each访问

//1.for_each遍历
    //把每个数据都经过lambda表达式内的操作
    //lambda可以替换为函数指针
    vector<int> testData = { 1,2,3,4,5,6,7,8,9 };
    for_each(testData.begin(), testData.end(),
        [](int x) {cout << x << " ";});
    cout << endl;

(2)fill 填充一部分元素

  vector<int> fillData(3);
    fill(fillData.begin(), fillData.end(), 10);
    for_each(fillData.begin(), fillData.end(), print);

(3)fill_n

vector<int> fData(4);
    fill_n(fData.begin() + 2, 2, 100);
    for_each(fData.begin(), fData.end(), print);
    cout << endl;

(4)填充前n个位置 通过函数去复制

 vector<int> gData(4);
    generate_n(gData.begin(), 2, [] {return 111;});
    for_each(gData.begin(), gData.end(), print);
    cout << endl;
    generate(gData.begin(), gData.end(), [] {return 222;});
    for_each(gData.begin(), gData.end(), print);
    cout << endl;

(5) transform使用方式和for_each类似

 vector<int> testTrans = { 1,2,3,4,5,6,7,8,9 };
    vector<int> resultTrans(testTrans.size());
    transform(testTrans.begin(), testTrans.end(), resultTrans.begin(),
        [](int data) {return -data;});
    for_each(resultTrans.begin(), resultTrans.end(), print);
    cout << endl;

四、关系类算法

   equal:两容器元素是否都相同
   includes:是否是包含关系
   lexicographical_compare:比较两个序列
   max:求最大值
   max_element:返回最大值的iterator
   min:求最小值
   min_element:求最小值的iterator
   mismatch:找到第一个不同的位置

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
#include<iomanip>

(1)equal

vector<int> one = { 1,2,3,4,5,66,77 };
	vector<int> two = { 1,2,3,4,5,77,66 };
	cout << boolalpha << equal(one.begin(), one.end(), two.begin()) << endl;;

(2)includes

vector<int> one = { 1,2,3,4,5,66,77 };
vector<int> two = { 1,2,3,4,5,77,66 };
vector<int> thrid = { 1,2,3 };
	cout << boolalpha << includes(one.begin(), one.end(), thrid.begin(), thrid.end()) << endl;;

(3)lexicographical_compare

比较大小 第一个小于第二个就返回true

vector<int> one = { 1,2,3,4,5,66,77 };
vector<int> two = { 1,2,3,4,5,77,66 };
cout << boolalpha << lexicographical_compare(one.begin(), one.end(),
		two.begin(), two.end()) << endl;


	//比较的是两个参数之间的大小
	//如果传入迭代器,那么返回的也是迭代器
	cout << "max" << max(1, 3) << endl;
	cout << "min" << min(1, 3) << endl;
	//用于求整个容器内的最大/小数据
	cout << "max" << *max_element(one.begin(), one.end()) << endl;
	cout << "min" << *min_element(one.begin(), one.end()) << endl;

(4) mismatch

找两个容器第一个不同的地方 如果都相同返回end()
返回的是pair类型 分别表示容器内第一个不相同数据

vector<int> one = { 1,2,3,4,5,66,77 };
vector<int> two = { 1,2,3,4,5,77,66 };
cout << *mismatch(one.begin(), one.end(), two.begin(), two.end()).first << endl;
cout << *mismatch(one.begin(), one.end(), two.begin(), two.end()).second << endl;

五、集合运算

   set_union:差集
   set_intersection:并集
   set_difference:保存第一个中有第二个没有的元素
   set_symmetric_difference:对称差集

(1)set_union

   vector<int> one = { 1,2,3,4,5,6 };
    vector<int> two = { 4,5,6,7,8,9 };
    vector<int> result(one.size() + two.size());
    //1.并集
//结果存到result内
    set_union(one.begin(), one.end(), two.begin(), two.end(), result.begin());
    for_each(result.begin(), result.end(),
        [](int x) {if (x != 0) cout << x << " ";});
    cout << endl;

(2)  set_intersection

  //2交集
  vector<int> one = { 1,2,3,4,5,6 };
  vector<int> two = { 4,5,6,7,8,9 };
//结果直接打印
    set_intersection(one.begin(), one.end(), two.begin(), two.end(),
        ostream_iterator<int>(cout, " "));
    cout << endl;

(3) set_difference

 
//3差集
 vector<int> one = { 1,2,3,4,5,6 };
 vector<int> two = { 4,5,6,7,8,9 };
//直接打印
    set_difference(one.begin(), one.end(), two.begin(), two.end(),
        ostream_iterator<int>(cout, " "));
    cout << endl;

(4)  set_symmetric_difference

 vector<int> one = { 1,2,3,4,5,6 };
 vector<int> two = { 4,5,6,7,8,9 };
 //4差集
//直接打印
    set_symmetric_difference(one.begin(), one.end(), two.begin(), two.end(),
        ostream_iterator<int>(cout, " "));

六、堆算法

堆:一堆元素 以二叉树的方式排序
大顶堆:父节点大于子节点 出堆从大到小
小顶堆:父节点小于子节点 出堆从小到大
 

   make_heap:生成一个堆
   
   pop_heap:出堆:把要出堆的元素放在容器后面,没真正删除,
   要手动调用容器的删除函数
   push_heap:入堆
   
   sort_heap:堆排序

#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>

vector<int> data = { 1,3,19,9,4,7 };
	make_heap(data.begin(), data.end());//默认大顶堆
	while (!data.empty())
	{//把元素放在最后面
		pop_heap(data.begin(), data.end());
		cout << data.back() << " ";
		data.pop_back();//真正删除元素
	}
	cout << endl;

	vector<int> data2 = { 1,3,19,9,4,7 };
	//less的方式是大顶堆 小顶堆是greater
	make_heap(data2.begin(), data2.end(),less<int>());
//堆排序准则必须和生成的准则相同
	sort_heap(data2.begin(), data2.end(), less<int>());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值