排序算法
merge()
-
以下是排序和通用算法:提供元素排序策略
-
merge: 合并两个有序序列,存放到另一个序列。
#include<iostream>using namespace std; #include<algorithm> #include<vector>void test01() {vector<int >v1;vector<int>v2;for (int i = 0; i < 10; i++){v1.push_back(i);v2.push_back(i+1);}vector<int>vTarget;vTarget.resize(v1.size() + v2.size());merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), vTarget.end(), [](int v){cout << v <<" "; }); }
sort()
sort: 以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入 比较函数。
void test02()
{vector<int >v1;v1.push_back(10);v1.push_back(40);v1.push_back(20);v1.push_back(90);v1.push_back(50);sort(v1.begin(), v1.end());for_each(v1.begin(), v1.end(), [](int val){cout << val << " "; });cout << endl;//从大到小sort(v1.begin(), v1.end(), greater<int>());for_each(v1.begin(), v1.end(), [](int val){cout << val << " "; });cout << endl;
}
random_shuffle()
-
random_shuffle: 对指定范围内的元素随机调整次序。
-
srand(time(0)); //设置随机种子
void test03() {vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}//把有序序列变成无序random_shuffle(v.begin(), v.end());for_each(v.begin(), v.end(), [](int val){cout << val << " "; });cout << endl; }
reverse()
翻转
void test04()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}reverse(v.begin(), v.end());for_each(v.begin(), v.end(), [](int val){cout << val << " "; });}
拷贝和替换算法
copy()
void test01()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}vector<int>vTarget;vTarget.resize(v.size());copy(v.begin(), v.end(), vTarget.begin());//for_each(vTarget.begin(), vTarget.end(), [](int val){cout << val << " "; });//流迭代器方式遍历copy(vTarget.begin(), vTarget.end(), ostream_iterator<int>(cout, ""));}
replace()
replace(beg,end,oldValue,newValue): 将指定范围内的所有等于oldValue的元素替 换成 newValue。
replace_if()
replace_if: 将指定范围内所有操作结果为 true 的元素用新值替换。
class MyCompare
{
public:bool operator()(int v){return v > 3;}
};
void test02()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}//把容器等中的3替换成300replace(v.begin(), v.end(), 3, 300);copy(v.begin(), v.end(), ostream_iterator <int>(cout, " "));cout << endl;//把容器中所有大于3的数字都替换成30000replace_if(v.begin(), v.end(), MyCompare(), 30000);copy(v.begin(), v.end(), ostream_iterator <int>(cout, " "));cout << endl;}
swap()
swap: 交换两个容器的元素
void test03()
{vector<int>v1;for (int i = 0; i < 10; i++){v1.push_back(i);}vector<int>v2;v2.push_back(10);v2.push_back(30);v2.push_back(20);v2.push_back(40);cout << "交换前数据:" << endl;copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));cout << endl;copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));cout << endl;cout << "交换后的数据:" << endl;swap(v1, v2);copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));cout << endl;copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));cout << endl;}
算术生成算法
accumulate()
accumulate: 对指定范围内的元素求和,然后结果再加上一个由 val 指定的初始值
#include<iostream>
#include<vector>
using namespace std;
#include<algorithm>
#include<numeric>
#include<iterator>void test01()
{vector<int>v;for (int i = 0; i <= 100; i++){v.push_back(i);}//0~100累计和 5050//第三个参数 起始累加值int sum=accumulate(v.begin(), v.end(), 0);cout << "总和为:" << sum << endl;}
fill()
fill: 将输入值赋给标志范围内的所有元素。
void test02()
{vector<int>v;v.resize(10);fill(v.begin(), v.end(),1000);copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
}
集合算法
set_union()
set_union: 构造一个有序序列,包含两个有序序列的并集。
void test02()
{vector<int>v1;vector<int>v2;for (int i = 0; i < 10; i++){v1.push_back(i);//0 1 2 3 4 5 6 7 8 9v2.push_back(i + 5);// 5 6 7 8 9 10 11 12 13 14 }vector<int>vTarget;vTarget.resize(v1.size() + v2.size());vector<int>::iterator itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());copy(vTarget.begin(), itEnd, ostream_iterator<int>(cout, " "));
}
vset_intersection()
set_intersection: 构造一个有序序列,包含两个有序序列的交集。
void test01()
{vector<int>v1;vector<int>v2;for (int i = 0; i < 10; i++){v1.push_back(i);//0 1 2 3 4 5 6 7 8 9v2.push_back(i + 5);// 5 6 7 8 9 10 11 12 13 14 }vector<int>vTarget;vTarget.resize(min(v1.size(),v2.size()));vector<int>::iterator itEnd= set_intersection(v1.begin(), v1.end(),v2.begin(), v2.end(), vTarget.begin());copy(vTarget.begin(), itEnd, ostream_iterator<int>(cout, " "));
}
set_difference()
set_difference: 构造一个有序序列,该序列保留第一个有序序列中存在而第二个有
void test03()
{vector<int>v1;vector<int>v2;for (int i = 0; i < 10; i++){v1.push_back(i);//0 1 2 3 4 5 6 7 8 9v2.push_back(i + 5);// 5 6 7 8 9 10 11 12 13 14 }vector<int>vTarget;vTarget.resize(max(v1.size(), v2.size()));//v1差v2vector<int>::iterator itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());copy(vTarget.begin(), itEnd, ostream_iterator<int>(cout, " "));cout << endl;//v2差v1itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());copy(vTarget.begin(), itEnd, ostream_iterator<int>(cout, " "));
}