C++系列二:STL教程-常用算法
前言
还有一些我在尝试中迷惑不解的,有点玄幻。
算法列举:
- 排序算法:
sort(first, last);
stable_sort(first, last);
partial_sort(first, middle, last);
partial_sort_copy(first, last, result_first, result_last);
nth_element (first, nth, last);
is_sorted (first, last);
is_sorted_until (first, last);
- 合并算法:
merge(first1,last1,first2,last2,result);
inplace_merge (first,middle,last);
- 查找算法:
find (first, last, val);
find_if (first, last, pred);
find_if_not (first, last, pred);
find_end (first1, last1, first2, last2);
find_first_of(first1, last1, first2, last2);
adjacent_find(first, last);
search(first1, last1, first2, last2);
search_n(first, last, count, val);
lower_bound (first, last,val);
upper_bound (first, last,val);
pair<ForwardIterator,ForwardIterator> equal_range (first, last, val);
binary_search(first, last,val);
- 筛选分组算法:
partition (first,last,pred);
stable_partition (first,last,pred);
pair<OutputIterator1,OutputIterator2> partition_copy (
first, last, result_true, result_false, pred);
partition_point(first,last,pred);
- 其他:
all_of (first,last,pred);
any_of (first,last,pred);
none_of(first,last,pred);
equal (First1, Last1, First2);
mismatch(First1, Last1, First2);
lexicographical_compare(first1, last1, first2, last2);
next_permutation(first, last);
prev_permutation(first, last)
is_permutation(First1, Last1, First2);
copy_n(first,n,result);
copy_if(first1,last,result,pred);
copy_backward(first1,last,result);
reverse_copy(first1,last,result);
unique(it_1,it_2,MyFunc);
rotate(first,middle,last);
rotate_copy(first,middle,last,last);
move();
swap_ranges(First1, Last1, First2);
remove(first1,last1,value);
remove_copy(first,last,result,value);
remove_if(first,last,result,value);
remove_copy_if(first,last,result,pred);
fill(first, last,val);
fill_n(first,n,value);
generate(first,last,gen);
generate_n(first,last,gen);
transform(first1,last1,first1,result,binary_op)
replace(_First,_Last,_OldVal,_NewVal);
replace_if(_First,_Last,_Pred,_Val);
replace_copy(_First,_Last,_Result,_OldVal,_NewVal);
replace_copy_if_if(_First,_Last,_Result,_Pred,_Val);
算法例子
vector<int> vec{ 3, 2, 5, 4, 1, 6, 9, 7 };
vector<int> vecCopy(5);
vector<int> vecFirst{1,3,5,7};
vector<int> vecSecond{ 2,4,6,8 };
vector<int> vecMerge(8);
vector<int> vecInplace{ 5,10,15,20,25,7,17,27,37,47,57 };
for (int i: vecInplace) {cout << i;}
//1. 排序
// Compare: less<int>()、 greater<int>()、[](int a,int b) {return a<b;} 升序
// 默认升序
//sort() 排序
sort(vec.begin(), vec.end());
sort(vec.begin(), vec.end(),less<int>())
//stable_sort() 还可以保证不改变相等元素的相对位置。
//partial_sort() 从指定区域中提取出部分数据 对它们进行排序
partial_sort(vec.begin(), vec.begin() + 4, vec.end());// 最小的 4 个元素移动到开头位置并排好序
partial_sort(vec.begin(), vec.begin() + 4, vec.end(), [](int a, int b) {return a > b; });//????不太懂
//partial_sort_copy() 不对原有数据变动,将部分元素拷贝到另外的数组或容器中,然后再对这部分元素进行排序。
partial_sort_copy(vec.begin(),vec.end(),vec1.begin(),vecCopy.begin()+5);
//nth_element() 该函数可以从某个序列中找到第 n 小的元素 K,并将 K 移动到序列中第 n 的位置处。
//整个序列经过 nth_element() 函数处理后,所有位于 K 之前的元素都比 K 小,所有位于 K 之后的元素都比 K 大。
nth_element(vec.begin(), vec.begin() + 2, vec.end()); //? ? ? ? 不太懂
//is_sorted()判断其是否已经排序好
bool flag = is_sorted(vec.begin(), vec.end());
//is_sorted_until() 不仅能检测出某个序列是否有序,还会返回一个正向迭代器,该迭代器指向的是当前序列中第一个破坏有序状态的元素。
vector<int>::iterator demo = is_sorted_until(vec.begin(),vec.end()); cout << *demo;
//2.合并
//merge()将两个有序集合合并为一个有序序列
merge(vecFirst.begin(),vecFirst.end(),vecSecond.begin(),vecSecond.end(), vecMerge.begin());
//inplace_merge() 当 2 个有序序列存储在同一个数组或容器中时,如果想将它们合并为 1 个有序序列 (我觉得有病,直接一个排序不就得了,真是折腾。)
inplace_merge(vecInplace.begin(), vecInplace.begin() + 5, vecInplace.begin() + 11);
//3.查找
//find() 用于在指定范围内查找和目标元素值相等的第一个元素。
cout << *find(vec.begin(),vec.end(),5);
//find_if()、find_if_not() 符合规则;不符合规则
cout << *find_if(vec.begin(), vec.end(), [](int i) {return ((i % 2) == 0); });//????不太懂
//有点费力,下次再来。
//一元转换和二元转换 用于转换元素
//vector<int> vec1{ 3, 2, 5, 4, 1, 6, 9, 7 };
//vector<int> vec2{ 3, 2, 5, 4, 1, 6, 9, 7 };
//vector<int> vecTransform(8, 0);
//transform(vec1.begin(), vec1.begin()+5, vec2.begin(), [](int i) {return i + 1; });
//transform(vec1.begin(), vec1.end(), vec2.begin(), vecTransform.begin(), [](int a, int b) {return a + b; });
//for (int i : vecTransform) { cout<<i; }
//replace() 替换
//vector<int> vecRep1{ 3, 2, 5, 4, 1, 6, 9, 7 };
//vector<int> vecRep2(8);
//replace(vecRep1.begin(),vecRep1.end(),1,100);
//replace_copy(vecRep1.begin(), vecRep1.end(),vecRep2.begin(),1,100);
//replace_if(vecRep1.begin(), vecRep1.end(), [](int i) {return i > 3; },100 );
//replace_copy_if(vecRep1.begin(), vecRep1.end(), vecRep2.begin(), [](int i) {return i > 3; }, 100);
//for (int i: vecRep2) { cout << i; }
// generate()、fill() 赋值
//vector<int> vecG(5);
//int flag = 1;
//generate(vecG.begin(), vecG.end(), [&flag]() {return flag++; });
//generate_n(vecG.begin(),3, [&flag]() {return flag++; });
//fill(vecG.begin(), vecG.end(), 1);
//fill_n(vecG.begin(),3, 1);
//for (int i :vecG) { cout << i; };
// remove() 素覆盖它来实现移除的????大疑问
//vector<int> vecRe{1, 2, 3, 4,5};
//vector<int> vecRe2(5);
//remove(vecRe.begin(),vecRe.end(),3); //12455
//remove_copy(vecRe.begin(),vecRe.end(), vecRe2.begin(),3); //12450
//remove_if(vecRe.begin(), vecRe.end(), [](int i) {return i = 4; });
//remove_copy_if(vecRe.begin(), vecRe.end(), vecRe2.begin(), [](int i) {return i = 4; });
//for (auto i : vecRe){cout << i;}
//for_each()循环
vector<int> vecFor{1, 2, 3, 4, 5};
for_each(vecFor.begin(), vecFor.end(), [](int i) {cout << i; });