C++STL算法

目录

查找算法

排序算法

删除算法


查找算法

  • 基本查找
  1. find:区间查找
  2. find_if:条件查找
  3. find_first_of:查找区间第一次出现的值
  4. adjacent_find:查找区间第一次重复的值
  5. search:子序列查找
  6. search_n:子序列查找出现次数
  • 统计查找
  1. count:区间统计
  2. count_if:条件统计个数
  3. equal:比较
  • 有序查找
  1. binary_search:二分查找
  2. upper_bound:查找最后一个大于查找的值
  3. lower_bound:查找大于等于查找的值
  4. 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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值