C++系列二:STL教程-常用算法


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

还有一些我在尝试中迷惑不解的,有点玄幻。


算法列举:

  1. 排序算法:
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);
  1. 合并算法:
merge(first1,last1,first2,last2,result);
inplace_merge (first,middle,last);
  1. 查找算法:
 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);
  1. 筛选分组算法:
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);
  1. 其他:
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; });
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joyyi9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值