STL常用算法(遍历、查找、排序、拷贝和替换、算术生成、集合)

概述:

  • 算法主要是由头文件<algorithm>  <functional>  <numeric>组成
  • <algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历、复制、修改等等
  • <functional> 体积很小,只包括几个在序列上面进行简单数学运算的函数模板
  • <numeric>定义了一些模板类,用以生命函数对象

常用算法:

  • 常用遍历算法
    • for_each     //遍历容器
      • for_each(begin,end,_func)
    • transform   //搬运容器到另一个容器中
      • transform(begin,end,newbegin,_func)(搬运前要先开辟空间)
    • class Transform
      {
      public:
      	int operator()(int val)
      	{
      		return val;
      	}
      };
      
      class ForEach
      {
      public:
      	void operator()(int val)
      	{
      		cout << val << "  ";
      	}
      };
      
      void test()
      {
      	vector<int> v;
      	for (int i = 0; i < 10; i++)
      	{
      		v.push_back(i);
      	}
      
      	vector<int> v1;
      	v1.resize(v.size());
      
      	transform(v.begin(), v.end(), v1.begin(), Transform());
      
      	for_each(v1.begin(), v1.end(), ForEach());
      }
      

  • 常用查找算法
    • find                           //查找指定元素,返回迭代器
      • find(begin,end,value)
      • 
        //查找内置数据类型
        void test01()
        {
        	vector<int> v;
        	for (int i = 0; i < 10; i++)
        	{
        		v.push_back(i);
        	}
        
        	vector<int>::iterator pos = find(v.begin(), v.end(), 22);
        	if (pos != v.end())
        	{
        		cout << *pos << endl;
        	}
        	else
        	{
        		cout << "未找到该元素" << endl;
        	}
        }
        
        class Person
        {
        public:
        	Person(string name, int age)
        	{
        		this->name = name;
        		this->age = age;
        	}
        
        	//重载==  让底层find知道如何对比Person数据类型
        	bool operator==(const Person& p)
        	{
        		if (p.name == this->name && p.age == this->age)
        		{
        			return true;
        		}
        		return false;
        	}
        
        	string name;
        	int age;
        };
        
        //查找自定义数据类型
        void test02()
        {
        	vector<Person> v;
        
        	Person p1("刘备", 88);
        	Person p2("关羽", 66);
        	Person p3("张飞", 22);
        
        	v.push_back(p1);
        	v.push_back(p2);
        	v.push_back(p3);
        
        	Person p("张飞", 22);
        
        	vector<Person>::iterator pos = find(v.begin(), v.end(), p);
        	if (pos != v.end())
        	{
        		cout << "姓名:" << pos->name << "  年龄:" << pos->age << endl;
        	}
        	else
        	{
        		cout << "未找到" << endl;
        	}
        }
        

    • find_if        //按条件查找
      • find_if(begin,end,_Pred)
      • class GreaterFive
        {
        public:
        	bool operator()(int val)
        	{
        		return val > 5;
        	}
        };
        
        vector<int>::iterator pos = find_if(v.begin(), v.end(), GreaterFive());
        
        
        class AgeGreater20
        {
        public:
        	bool operator()(const Person& p)
        	{
        		if (p.age > 20)
        		{
        			return true;
        		}
        		return false;
        	}
        };
        
        vector<Person>::iterator pos = find_if(v.begin(), v.end(), AgeGreater20());
    • adjacent_find       //查找相邻重复元素
      • adjacent_find (begin,end)   //返回相邻元素的第一个位置的迭代器
      • vector<int>::iterator pos = adjacent_find(v.begin(), v.end());

    • binary_search        //二分查找,在无序序列中不可用
      • bool  binary_search(begin,end,value)
      • sort(v.begin(), v.end());
        
        	if (binary_search(v.begin(), v.end(), 7))
        	{
        		cout << "找到了" << endl;
        	}
        	else
        	{
        		cout << "未找到" << endl;
        	}

    • count      //统计元素出现的次数
      • count(begin,end,value)
      • class Person
        {
        public:
        	Person(string name, int age)
        	{
        		this->name = name;
        		this->age = age;
        	}
        
        	bool operator==(const Person& p)
        	{
        		if (this->name == p.name)
        		{
        			return true;
        		}
        		return false;
        	}
        
        	string name;
        	int age;
        };
        
        cout << count(v.begin(), v.end(), p);

    • count_if
      • count_if(begin,end,_pred)
      • class Count
        {
        public:
        	bool operator()(int val)
        	{
        		return val > 4;
        	}
        };
        
        cout << count_if(v.begin(), v.end(), Count()) << endl;
        
        
        class Count0
        {
        public:
        	bool operator()(const Person& p)
        	{
        		return p.age >= 18;
        	}
        };
        
        cout << count_if(v.begin(), v.end(), Count0()) << endl;

  • 常用排序算法
    • sort   //对元素内容器进行排序
      • sort(begin,end,_Pred)
      • class Sort
        {
        public:
        	bool operator()(const Person& p1, const Person& p2)
        	{
        		return p1.age > p2.age;
        	}
        };
        
        sort(v.begin(), v.end(),Sort());
        

    • random_shuffle      //洗牌,指定范围内元素随机调整次序
      • random_shuffle(begin,end)    (内定数据类型与自定义数据类型都这样)
      • 需要加随机种子 srand((unsigned int)time(NULL));
    • merge    //容器元素合并,并存储到另一个容器,两个容器必须是有序的,且顺序一致
      • merge(begin1,end1,begin2,end2,iterator dest)
      • v3.resize(v1.size() + v2.size());
        
        merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());

    • reverse        //反转指定范围的元素
      • reverse(begin,end)
  • 常用拷贝和替换算法
    • copy         //将容器指定范围内的元素拷贝到另一容器
      • copy(begin,end,dest_iterator)
      • 	v3.resize(v1.size());
        
        	copy(v1.begin(), v1.end(), v3.begin());

    • replace         //将容器指定范围内的元素修改为新元素
      • replace(begin,end,oldvalue,newvalue)
      • replace(v3.begin(), v3.end(), 5, 10000);
        
        //把区间内的5改为10000

    • replace_if        //将容器指定范围内满足条件的元素修改为新元素
      • replace_if(begin,end,_pred,newvalue)
      • class Greater3
        {
        public:
        	bool operator()(int val)
        	{
        		return val > 3;
        	}
        };
        
        replace_if(v3.begin(), v3.end(), Greater3(), 888);
        
        
        

    • swap        //互换两个容器的元素
      • swap(container c1,container c2)
      • swap(v3, v1);

  • 常用算术生成算法    #include <numeric>
    • accumulate    //计算容器元素累计总和
      • accumulate(begin,end,value(累加起始值))
      • int sum = accumulate(v3.begin(), v3.end(), 0)

    • fill      //在区间内填充value
      • fill(begin,end,value)
      • fill(v3.begin(), v3.end(), 999);

  • 常用集合算法
    • set_intersection    
      • set_intersection(begin1,end1,begin2,end2,dest)       //两个容器必须是有序序列
      • 	v3.resize(min(v1.size(),v2.size()));
        
        	vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
        
        	//遍历时用itEnd
        	for_each(v3.begin(), itEnd, ForEach());

    • set_union
      • set_union(begin1,end1,begin2,end2,dest)       //两个容器必须是有序序列
      • 	v3.resize(v1.size() + v2.size());
        
        	vector<int>::iterator itEnd1 = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
        
        	for_each(v3.begin(), itEnd1, ForEach());

    • set_difference
      • set_difierence(begin1,end1,begin2,end2,dest)       //两个容器必须是有序序列
      • 分两类:1和2的差集(1中有,2中没有)  ,   2和1的差集(2中有,1中没有)  ,
      • 	v3.resize(max(v1.size(),v2.size()));
        
        	vector<int>::iterator itEnd2 = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
        
        	for_each(v3.begin(), itEnd2, ForEach());

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11STL常用排序算法有以下几种: 1. sort sort是STL中最常用排序算法,它可以对容器中的元素进行排序。sort的时间复杂度为O(NlogN),使用快速排序算法实现。sort的基本使用方法如下: ```c++ sort(begin, end); // 对区间[begin, end)内的元素排序 ``` 其中,`begin`和`end`分别是容器中要排序的元素的起始和结束迭代器。 此外,sort还可以接受一个可调用对象作为参数,来实现自定义的排序方法。例如,可以按照元素的某个属性进行排序: ```c++ sort(v.begin(), v.end(), [](const auto& a, const auto& b) { return a.property < b.property; }); // 按照元素的property属性进行排序 ``` 2. stable_sort stable_sort与sort的用法类似,也可以对容器中的元素进行排序,但它保证了相等元素的相对顺序不会发生改变。stable_sort的时间复杂度为O(NlogN),使用归并排序算法实现。stable_sort的基本使用方法如下: ```c++ stable_sort(begin, end); // 对区间[begin, end)内的元素排序 ``` 3. partial_sort partial_sort可以对容器中的元素进行部分排序,即只将前k个最小(或最大)的元素放在容器的前k个位置上。partial_sort的时间复杂度为O(Nlogk),使用堆排序算法实现。partial_sort的基本使用方法如下: ```c++ partial_sort(begin, middle, end); // 将区间[begin, end)内的前middle-begin个元素排序,其他元素保持原有顺序 ``` 其中,`middle`是一个迭代器,指向容器中排序后前middle-begin个元素的末尾位置。 4. nth_element nth_element可以找出容器中第k小(或第k大)的元素。nth_element的时间复杂度为O(N),使用快速选择算法实现。nth_element的基本使用方法如下: ```c++ nth_element(begin, nth, end); // 将区间[begin, end)内的元素排序,使得第nth个元素是第nth小的元素 ``` 其中,`nth`是一个迭代器,指向容器中第nth小的元素。 以上就是C++11STL常用排序算法,可以根据实际需求选择适合的算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值