目录
查找算法
- 基本查找
- find:区间查找
- find_if:条件查找
- find_first_of:查找区间第一次出现的值
- adjacent_find:查找区间第一次重复的值
- search:子序列查找
- search_n:子序列查找出现次数
- 统计查找
- count:区间统计
- count_if:条件统计个数
- equal:比较
- 有序查找
- binary_search:二分查找
- upper_bound:查找最后一个大于查找的值
- lower_bound:查找大于等于查找的值
- equal_range:区间比较...有序序列
#include<iostream> #include<vector> #include<algorithm> #include<functional> #include<iterator> using namespace std; int main() { // find:区间查找 vector<int>vec= { 1,2,3,4,5,6,7,8,9 }; auto F = find(vec.begin(), vec.end(), 9);//找自定义类型需要重载运算符 //没找到:结束位置 if (F != vec.end()) { cout << *F << endl; } //find_if:条件查找 auto pre = find_if(vec.begin(), vec.end(), [](int a) {return a > 3; }); cout << *pre << endl; //find_first_of:查找区间第一次出现的值 int array[] = { 44,1,2 }; //vec.begin() vec.end()拿出一个元素跟temp temp+2 比较,满足就返回 auto ffo = find_first_of(vec.begin(), vec.end(), array, array + 2); cout << *ffo << endl; //adjacent_find:查找区间第一次重复的值 int rever[]= { 1,1,2,2,3,4,5 }; auto af = adjacent_find(rever, rever+7); cout << *af << endl; //search:子序列查找 int fans[] = { 1,1,2 }; auto S = search(af, af + 7, fans, fans + 3); cout << *S << endl;//输出满足序列的第一个元素 //search_n:子序列查找出现次数 auto sn = search_n(fans, fans + 3, 2, 1); cout << *sn << endl; sn = search_n(rever, rever + 7, 3, 2, [](int a, int b) {return a > b; }); cout << *sn << endl; //count:区间统计 cout << count(rever, rever + 7, 1) << endl;; //count_if:条件统计个数 cout << count_if(rever, rever + 7, [](int x) {return x > 1; })<<endl; // equal:比较 cout << boolalpha << equal(rever, rever + 7, fans, fans + 3) << endl; //binary_search:二分查找 cout << boolalpha << binary_search(rever, rever + 7, 2) << endl; //upper_bound:查找最后一个大于查找的值 auto upper = upper_bound(rever, rever + 7, 3); cout << *upper << endl; //lower_bound:查找大于等于查找的值 auto lb = lower_bound(rever, rever + 7, 3); cout << *lb << endl; //equal_range:包含上面两种结果 auto pair= equal_range(rever, rever + 7, 3); cout <<*pair.first <<" "<<*pair.second << endl; return 0; }
排序算法
- merge:归并排序,存于新容器
- inplace_merge:归并排序,覆盖原区间
- sort:排序,更改原容器排序
- stable_sort:排序,保存原容器顺序排序
- nth_element:关键字排序
- partition:范围排序
- partial_sort:范围排序
- partial_sort_copy:局部排序,结果另存
- stable_partition:范围排序,保存原容器排序
- random_shuffle:随机排序
- reverse:逆序原容器
- reverse:逆序容器到新容器
- rotate:移动元素到容器末尾
- rotate_copy:移动元素到新容器
#include<iostream> #include<vector> #include<algorithm> #include<functional> #include<iterator> #include<string> using namespace std; template<class _Ty> void print(_Ty data) { for (auto v : data) { cout << v << " "; } cout << endl; } class Mouse { public: string getName() { return name; } int getAge() { return age; } void print() { cout << name << " " << age << endl; } Mouse(string name,int age):name(name),age(age){} protected: string name;; int age; }; void testUserData() { vector<Mouse>Mickey; Mickey.push_back(Mouse("abc", 12)); Mickey.push_back(Mouse("cad", 56)); Mickey.push_back(Mouse("hjk", 23)); sort(Mickey.begin(), Mickey.end(), [](auto a, auto b) {return a.getName() > b.getName(); }); for (auto v : Mickey) { v.print(); } } bool compare(double a,double b) { return (int)a<int(b); } void testStableSort() { vector<double>vec = { 1.33,2.33,1.22,3.22,3.55,4.22 }; //stable_sort:排序,保存原容器顺序排序 stable_sort(vec.begin(), vec.end(), compare); print(vec); //stable_partition:范围排序,保存原容器相对排序 stable_partition(vec.begin(), vec.end(), bind(compare,std::placeholders::_1,2.0)); print(vec); } void testMerge() { vector<int>vec = { 1,2,3,4,5,0,6,7,8,9 }; vector<int>result(vec.size()); //merge:归并排序,存于新容器 merge(vec.begin(), vec.begin() + 5, vec.begin() + 5,vec.end(), result.begin()); print(vec); //inplace_merge:归并排序,覆盖原区间 inplace_merge(vec.begin(), vec.begin() + 5, vec.end()); print(vec); } int main() { testMerge(); testUserData(); testStableSort(); //sort:排序,更改原容器排序 vector<int>vec = { 1,2,3,4,1,2,3,5 }; sort(vec.begin(), vec.end()); sort(vec.begin(), vec.end(),less<int>()); print(vec); sort(vec.begin(), vec.end(), greater<int>()); print(vec); //nth_element:关键字排序 vector<int>test = { 1,2,3,4,5,0,6,7,8,9 }; nth_element(test.begin(), test.begin() + 5, test.end()); print(test); //partition:分类处理,通过子函数描述条件,返回true放左边,返回false放右边 vector<int>score = { 98,97,95,20,56,43 }; partition(score.begin(), score.end(), [](int a) {return a > 60; }); print(score); //partial_sort:范围排序 partial_sort(score.begin(), score.begin() + 3, score.end()); print(score); //partial_sort_copy:局部排序,结果另存 vector<int>result(5); partial_sort_copy(vec.begin(), vec.begin() + 5, result.begin(), result.end()); print(result); //random_shuffle:随机排序 srand((unsigned int)time(nullptr)); random_shuffle(vec.begin(), vec.end()); print(vec); //reverse:逆序原容器 reverse(vec.begin(), vec.end()); print(vec); //reverse:逆序容器到新容器 vector<int>re(vec.size()); reverse_copy(vec.begin(), vec.end(), re.begin()); print(re); //rotate:移动元素到容器末尾 vector<int>rome = { 1,35,5,6,3 }; rotate(rome.begin(), rome.begin() + 2, rome.end()); print(rome); //rotate_copy:移动元素到新容器 vector<int>mResult(rome.size()); rotate_copy(rome.begin(), rome.begin() + 3, rome.end(), mResult.begin()); print(mResult); return 0; }
删除算法
- copy:拷贝函数
- copy_backward:逆序拷贝
- iter_swap:交换
- remove:删除
- remove_copy:删除元素复制到新容器
- remove_if:条件删除
- remove_copy_if:条件删除拷贝到新容器
- replace:替换
- replace_copy:替换结果放新容器
- replace_if:条件替换
- replace_copy_if:条件替换,结果另存
- swap:交换
- swap_ranges:区间交换
- unique:去重
- unique_copy:去重结果另存
#include<iostream> #include<vector> #include<algorithm> #include<functional> #include<iterator> #include<list> using namespace std; template<class _Ty> void print(_Ty data) { for (auto v : data) { cout << v << " "; } cout << endl; } int main() { //正向拷贝 vector<int>vec = { 1,2,3,4,5,6 }; vector<int>renc(vec.size()); copy(vec.begin(), vec.end(), renc.begin()); print(renc); //逆向拷贝,从最后开始赋值 vector<int>rvec(vec.size()); copy_backward(vec.begin(), vec.end(), rvec.end()); print(rvec); //删除-->伪删除 auto iter = remove(vec.begin(), vec.end(), 3); cout << vec.size() << endl; print(vec); //伪删除,结果另存 vector<int>result(vec.size()); remove_copy(vec.begin(), vec.end(), result.begin(), 2); print(result); //条件删除,remove_if vector<int>score = { 98,65,87,32,56 }; remove_if(score.begin(), score.end(), [](int x) {return x < 60; }); print(score); //条件删除,结果另存 vector<int>IU(count_if(score.begin(), score.end(), [](int x) {return x > 60; })); remove_copy_if(score.begin(), score.end(), IU.begin(), [](int x) {return x < 60; }); print(IU); //替换算法(修改)replace vector<int>rep = { 1,2,3,4,5,1,6,1,4,8 }; replace(rep.begin(), rep.end(), 1, 100); print(rep); //替换后结果另存 vector<int>recp(rep.size()); replace_copy(rep.begin(), rep.end(), recp.begin(), 100, 0); print(recp); //条件交换 replace_if(rep.begin(), rep.end(), [](int x) {return x < 6; }, 0); print(rep); //条件替换,结果另存 vector<int>repif(rep.size()); replace_copy_if(rep.begin(), rep.end(), repif.begin(), [](int x) {return x == 0; },1); print(repif); //交换iter_swap vector<int>test = { 1,2,34,5,6,6 }; iter_swap(test.begin(), test.end() - 1); print(test); //swap不需要两个容器长度一样 vector<int>test1 = { 2,2 }; swap(test, test1); print(test1); print(test); //区间交换swap_ranges swap_ranges(test1.begin(), test1.begin() + 1, test.begin()); print(test1); //去重(连续相同的只保留一个) vector<int>uniq = { 1,1,3,3,4,4,5,66,7 }; /*unique(uniq.begin(), uniq.end());*/ print(uniq); //去重另存 vector<int>uniqr(6); unique_copy(uniq.begin(), uniq.end(), uniqr.begin()); print(uniqr); return 0; }