目录
一、排列组合
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>());