zoukankan      html  css  js  c++  java
  • C++ STL——常用算法


    注:原创不易,转载请务必注明原作者和出处,感谢支持!

    注:内容来自某培训课程,不一定完全正确!

    一 常用查找算法

    /*
    	find算法 查找元素
        @param beg 容器开始迭代器
        @param end 容器结束迭代器
        @param val 查找的元素
        @return 返回查找元素的位置
    */
    find(iterator beg, iterator end, val);
    
    /*
    	adjacent_find算法 查找相邻重复元素
        @param beg 容器开始迭代器
        @param end 容器结束迭代器
        @param _callback回调函数或者谓词(返回bool类型的函数对象)
        @return 返回相邻元素的第一个位置的迭代器
    */
    adjacent_find(iterator beg, iterator end, _callback);
    
    /*
    	binary_search算法 二分查找算法
        注意:在无序序列中不可用
        @param beg 容器开始迭代器
        @param end 容器结束迭代器
        @param val 查找的元素
        @return 找到返回true,否则返回false
    */
    bool binary_search(iterator beg, iterator end, val);
    
    /*
    	find_if算法 条件查找
        @param beg 容器开始迭代器
        @param end 容器结束迭代器
        @param _callback 回调函数或者谓词
        @return 找到返回true,否则返回false
    */
    find_if(iterator beg, iterator end, _callback);
    
    /*
    	count算法 统计元素出现的次数
        @param beg 容器开始迭代器
        @param end 容器结束迭代器
        @param val 待统计元素
        @return int返回元素的个数
    */
    count(iterator beg, iterator end, val);
    
    /*
    	count_if算法 统计元素出现的次数
        @param beg 容器开始迭代器
        @param end 容器结束迭代器
        @param _callback回调函数或者谓词
        @return int返回元素的个数
    */
    count_if(iterator beg, iterator end, _callback);
    

    常用查找算法的应用案例。

    // 基础数据类型的查找
    void Test1()
    {
    	vector<int> v1;
    	for (int i = 0; i < 10; ++i)
    	{
    		v1.push_back(i);
    	}
    
    	vector<int>::iterator ret = find(v1.begin(), v1.end(), 5);
    	if (ret != v1.end()) {
    		cout << "找到了!" << endl;
    	}
    	else {
    		cout << "没有找到!" << endl;
    	}
    }
    
    // 对象类型的查找,需要给对象重载==号运算符
    class Person
    {
    public:
    	Person(int age, int id) : age(age), id(id) {}
    	// 必须给对象重载==号运算符,否则无法使用find()
    	bool operator==(const Person &p) { return this->id == p.id && this->age == p.age; }
    
    public:
    	int age;
    	int id;
    };
    
    void Test2()
    {
    	vector<Person> v;
    	Person p1(10, 20), p2(30, 40), p3(50, 60);
    	v.push_back(p1);
    	v.push_back(p2);
    	v.push_back(p3);
    
    	vector<Person>::iterator ret = find(v.begin(), v.end(), p2);
    	if (ret != v.end()) {
    		cout << "找到了p2!" << endl;
    	}
    	else {
    		cout << "没找到p2!" << endl;
    	}
    
    }
    
    // binary_search()二分查找
    void Test3()
    {
    	vector<int> v;
    	for (int i = 0; i < 10; ++i)
    	{
    		v.push_back(i);
    	}
    
    	bool ret = binary_search(v.begin(), v.end(), 5);
    	if (ret) {
    		cout << "找到了5!" << endl;
    	}
    	else {
    		cout << "没找到5!" << endl;
    	}
    }
    
    // find_if()
    // count(),count_if()和find(),find_if()是类似的
    
    bool MySearch(int val)
    {
    	// 找到第一个大于5的值
    	return val > 5;
    }
    void Test4()
    {
    	vector<int> v;
    	for (int i = 0; i < 10; ++i)
    	{
    		v.push_back(i);
    	}
    
    	// find_if会根据我们的条件(函数),返回第一个满足条件的元素的迭代器
    	vector<int>::iterator ret = find_if(v.begin(), v.end(), MySearch);
    	if (ret != v.end()) {
    		cout << "ret = " << *ret << endl;
    	}
    	else {
    		cout << "没找到!" << endl;
    	}
    }
    

    二 常用遍历算法

    /*
    	for_each遍历算法 遍历容器元素
        @param beg 开始迭代器
        @param end 结束迭代器
        @param _callback 函数回调或者函数对象
        @return 函数对象
    */
    for_each(iterator beg, iterator end, _callback);
    
    /*
    	transform算法 将指定区间元素搬运到另一容器中
        注意:transform不会给目标容器分配内存,所以需要我们提前分配好内存
        @param beg1 源容器开始迭代器
        @param end1 源容器结束迭代器
        @param beg2 目标容器开始迭代器
        @param _callback 函数回调或者函数对象
        @return 返回目标容器迭代器
    */
    transform(iterator beg1, iterator end1, iterator beg2, _callback);
    

    遍历算法应用案例。

    // transform
    struct MyPlus
    {
    	int operator()(int val)
    	{
    		return val;
    	}
    };
    
    void MyPrint(int val)
    {
    	cout << val << " ";
    }
    
    void Test1()
    {
    	vector<int> v1, v2;
    	for (int i = 0; i < 10; ++i)
    	{
    		v1.push_back(i);
    	}
    	v2.resize(50);
    
    	transform(v1.begin(), v1.end(), v2.begin(), MyPlus());
    	for_each(v2.begin(), v2.end(), MyPrint);
    }
    
  • 相关阅读:
    Linux编程之epoll
    Linux IO模式及 select、poll、epoll详解
    与程序员相关的CPU缓存知识
    JDK源码阅读-FileOutputStream
    JDK源码阅读-FileInputStream
    JDK源码阅读-ByteBuffer
    Java如何保证文件落盘?
    Linux/UNIX编程如何保证文件落盘
    JDK源码阅读-RandomAccessFile
    JDK源码阅读-FileDescriptor
  • 原文地址:https://www.cnblogs.com/laizhenghong2012/p/11785884.html
Copyright © 2011-2022 走看看