注:原创不易,转载请务必注明原作者和出处,感谢支持!
注:内容来自某培训课程,不一定完全正确!
一 常用查找算法
/* 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); }