STL排列组合算法
-
next_permutation:下一个排序序列的组合
-
prev_permutation:上一个排序序列的组合
-
/* next_permutation:下一个排序序列的组合 prev_permutation:上一个排序序列的组合 {a,b,c}存在a<b<c的关系 下一个{a,c,b} */ #include<iostream> #include<algorithm> #include<functional> #include<vector> #include<array> using namespace std; 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; } cout << endl; //给定数字,排列组合 vector<int> vec = { 1,2,3,4 }; int i = 0; do { cout << "第" << i + 1 << "个组合是:"; for (auto v : vec) { cout << v; } cout << endl; i++; } while (next_permutation(vec.begin(), vec.end())); return 0; }
STL 算术算法
-
accumulate:区间求和
-
partial_sum:相邻元素的和
-
inner_product:序列内积运算
-
adjacent_difference:相邻元素的差
/* + accumulate:区间求和 + partial_sum:相邻元素的和 + inner_product:序列内积运算 + adjacent_difference:相邻元素的差 */ #include<iostream> #include<algorithm> #include<functional> #include<numeric> #include<vector> #include<iterator> using namespace std; int main() { //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 = accumulate(data.begin(), data.end(), 100);//100是起始值 cout << sum << endl; //2.逐步求和 vector<int> result(data.size()); partial_sum(data.begin(), data.end(), result.begin()); for (auto v : result) { cout << v << " "; } cout << endl; //3.求内积运算(矩阵的乘法) vector<int> first = { 1,2,3,4 }; vector<int> second = { 1,2,3,4 }; //for (int i = 0; i < 4; i++) { // first[i] = i + 1; // second[i] = i + 1; //} cout << inner_product(first.begin(), first.end(), second.begin(), 0) << endl; //4.求差值 vector<int> test = { 1,2,3,4,5,6,7,8,9 }; adjacent_difference(test.begin(), test.end(), ostream_iterator<int>(cout, "\t")); //ostream_iterator<int>(cout, "\t")相当于直接打印,可以和上面一样换成一个新容器的begin位置 cout << endl; return 0; }
STL 生成异变算法
-
for_each:迭代访问
-
fill:填充方式初始容器
-
fill_n:指定长度填充容器
-
generate_n:填充前n个位置
-
transform:一元转换和二元转换
/* + for_each:迭代访问 + fill:填充方式初始容器 + fill_n:指定长度填充容器 + generate_n:填充前n个位置 + transform:一元转换和二元转换 */ #include<iostream> #include<algorithm> #include<functional> #include<string> #include<vector> #include<iterator> using namespace std; void print(int x) { cout << x << " "; } int main() { vector<int> testData = { 1,2,3,4,5,6,7,8,9 }; //容器里每一个元素都跑一变最后的表达式 for_each(testData.begin(), testData.end(), [](int x) {cout << x << " "; }); cout << endl; for_each(testData.begin(), testData.end(),print); cout << endl; vector<int> fillData(3); fill(fillData.begin(), fillData.end(), 18); for_each(fillData.begin(), fillData.end(), print); cout << endl; vector<int> fData(4); fill_n(fData.begin(), 2, 100); for_each(fData.begin(), fData.end(), print); cout << endl; //填充前n个位置 通过函数进行赋值 vector<int> gData(4); generate_n(gData.begin(), 2, []() {return 1; }); for_each(gData.begin(), gData.end(), print); cout << endl; generate(gData.begin(),gData.end(), []() {return 1; }); for_each(gData.begin(), gData.end(), print); cout << endl; vector<int> testTrans = { 1,2,3,4,5,6,7,8,9 }; vector<int> result(testTrans.size()); transform(testTrans.begin(), testTrans.end(),result.begin(), [](int x) {return -x; }); for_each(result.begin(), result.end(), print); cout << endl; return 0; }
STL 关系算法
-
equal:两容器元素是否都相同
-
includes:是否是包含关系
-
lexicographical_compare:比较两个序列
-
max:求最大值
-
max_element:返回最大值的iterator
-
min:求最小值
-
min_element:求最小值的iterator
-
mismatch:找到第一个不同的位置
/* + equal:两容器元素是否都相同 + includes:是否是包含关系 + lexicographical_compare:比较两个序列 + max:求最大值 + max_element:返回最大值的iterator + min:求最小值 + min_element:求最小值的iterator + mismatch:找到第一个不同的位置 */ #include<iostream> #include<algorithm> #include<functional> #include<vector> #include<iomanip> using namespace std; void testEqual() { //1.比较是否相等 vector<int> one = { 1,2,3,4,5,6,7 }; vector<int> two = { 1,2,3,4,5,7,6 }; cout << boolalpha << equal(one.begin(), one.end(), two.begin())<<endl; //2.包含 vector<int> thrid = { 1,2,3 }; //包含关系必须是有序的 cout << boolalpha << includes(one.begin(), one.end(), thrid.begin(), thrid.end())<<endl; } void testCompare() { //3.比较大小 第一个小于第二个就返回true vector<int> one = { 1,2,3,4,5,6,7 }; vector<int> two = { 1,2,3,4,5,7,6 }; cout << boolalpha << lexicographical_compare(one.begin(), one.end(), two.begin(), two.end()) << endl; } void testNum() { //max,min最大值最小值传入的是数据,比较传入两个参数的大小,并不是要求传入迭代器,比较区间大小 vector<int> one = { 1,2,3,4,5,6,7 }; vector<int> two = { 1,2,3,4,5,7,6 }; cout << "max:" << *max(one.begin(), one.end()-1) << endl; cout << "max:" << max(2,3) << endl; cout << "min:" << min(1,4) << endl; //迭代器最小最大值用max_element cout << "Max:" << *max_element(one.begin(), one.end()) << endl; cout << "Min:" << *min_element(one.begin(), one.end()) << endl; } void testMismatch() { //4.找出第一个不同的地方,注意返回值是一个数对类型 vector<int> one = { 1,2,3,4,5,6,7 }; vector<int> two = { 1,2,3,4,5,7,6 }; cout << *mismatch(one.begin(), one.end(), two.begin(), two.end()).first << endl; cout << *mismatch(one.begin(), one.end(), two.begin(), two.end()).second << endl; //first第一元素不同位置 //second第二元素不同位置 } int main() { testEqual(); testCompare(); testNum(); testMismatch(); return 0; }
STL 集合算法
-
set_union:差集
-
set_intersection:并集
-
set_difference:保存第一个中有第二个没有的元素
-
set_symmetric_difference:对称差集
/* + set_union:差集 + set_intersection:并集 + set_difference:保存第一个中有第二个没有的元素 + set_symmetric_difference:对称差集 */ #include<iostream> #include<algorithm> #include<functional> #include<iterator> #include<vector> using namespace std; int main() { 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()); set_union(one.begin(), one.end(), two.begin(), two.end(), result.begin()); cout << "并集:" << "\t"; for_each(result.begin(), result.end(), [](int x) {if (x != 0) { cout << x << "\t"; }}); cout << endl; //交集 cout << "交集:" << "\t"; set_intersection(one.begin(), one.end(), two.begin(), two.end(), ostream_iterator<int>(cout,"\t")); cout << endl; //差集 cout << "差集:" << "\t"; set_difference(one.begin(), one.end(), two.begin(), two.end(), ostream_iterator<int>(cout, "\t")); //对称差集 cout << "对称差集:" << "\t"; set_symmetric_difference(one.begin(), one.end(), two.begin(), two.end(), ostream_iterator<int>(cout, "\t")); return 0; }
STL堆算法
-
make_heap:生成一个堆
-
pop_heap:出堆
-
push_heap:入堆
-
sort_heap:堆排序
/* + make_heap:生成一个堆 + pop_heap:出堆:把要出堆的元素放到容器最后面,并没有正在删除,要手动调用容器的删除函数进行删除 + push_heap:入堆 + sort_heap:堆排序 */ //让其他容器成为堆的形式 //堆:一系列没有顺序的元素 // 在二叉树的基础上分为: //大顶堆 //小顶堆 #include<iostream> #include<algorithm> #include<functional> #include<vector> #include<string> using namespace std; int main() { 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() << "\t"; data.pop_back(); //真正的删除元素在这一步 } cout << endl; vector<int> data2 = { 1,3,19,9,4,7 }; make_heap(data2.begin(), data2.end(), less<int>()); //也是大顶堆,和默认方式一样 sort_heap(data2.begin(), data2.end(), less<int>()); //排序准则必须和上面一行堆排序生成准则一致,否则报错 vector<int> data3 = { 1,3,19,9,4,7 }; make_heap(data3.begin(), data3.end(), greater<int>()); sort_heap(data3.begin(), data3.end(), greater<int>()); for (auto v : data3) { cout << v << "\t"; } cout << endl; return 0; }