C++泛型算法
来源:互联网 发布:赤峰办公软件速成班 编辑:程序博客网 时间:2024/05/22 13:49
泛型算法=模板+迭代器
问题:
首先我们利用随机数,然后对这些随机数从小到大排序。
vector 还是使用我们自定义的vector,参加《vector第四步修炼之道》博文。
测试函数:
#include<iostream>#include<time.h>//#include "vectorAllocate.h"//#include "vectorAllocateIterator.h"#include "vectorjGenericity.h"using namespace std;int main(){ /***********vectorjGenericity的使用*************/ myAllocator<int> alloc; vector<int, myAllocator<int>> vec1(10, alloc); srand(time(NULL)); for (int i = 0; i < 20; i++) { vec1.push_back(rand()%100); } showContainer<vector<int, myAllocator<int>>>(vec1); return 0;}
然后写从小到大排序函数,算法使用冒泡排序
//默认从小到大,把[first,last]区间的所有元素从小到大排序template<typename Iterator>void mySort(Iterator it1, Iterator it2){ Iterator::value_type tmp; int size = it2 - it1; for (int i = 0; i < size; ++i) { for (int j = 0;j < size - i - 1;++j) { if (it1[j]>it1[j + 1]) { tmp = it1[j]; it1[j] = it1[j + 1]; it1[j + 1] = tmp; } } }};
调用函数
mySort(vec1.begin(),vec1.end());
如果此时我需要从大到小呢?是不是需要重新定义一个函数?好麻烦~
优化1
如果我分别定义从大到小的函数和从小到大的函数,然后在排序函数中使用函数指针呢?
//函数定义template <typename T> bool mygreater(T a, T b){ return a > b;}template <typename T>bool myless(T a, T b){ return a < b;};
mySort函数实现
//默认从小到大,把[first,last]区间的所有元素从小到大排序template<typename Iterator,typename Compare>void mySort(Iterator it1, Iterator it2, Compare func) { Iterator::value_type tmp; int size = it2 - it1; for (int i = 0; i < size; ++i) { for (int j = 0;j < size - i - 1;++j) { if (func(it1[j],it1[j + 1])) { tmp = it1[j]; it1[j] = it1[j + 1]; it1[j + 1] = tmp; } } } }
测试函数
mySort(vec1.begin(), vec1.end(), mygreater<int>); mySort(vec1.begin(), vec1.end(), myless<int>);
优化2
如果定义成函数模板,那可以转化成模板类吗?当然可以。
(func(it1[j],it1[j + 1])) ==》func.operator(it1[j],it1[j + 1])
模板类定义如下:
//模板类定义template <typename T>class mygreater {public: bool operator()(T a, T b) { return a > b; }};template <typename T>class myless{public: bool operator()(T a, T b) { return a < b; }};
mySort函数实现
template<typename Iterator,typename Compare>void mySort(Iterator it1, Iterator it2, Compare func) { Iterator::value_type tmp; int size = it2 - it1; for (int i = 0; i < size; ++i) { for (int j = 0;j < size - i - 1;++j) { if (func.operator()(it1[j], it1[j+1])) { tmp = it1[j]; it1[j] = it1[j + 1]; it1[j + 1] = tmp; } } } }
测试函数:
mySort(vec1.begin(), vec1.end(), mygreater<int>()); mySort(vec1.begin(), vec1.end(), myless<int>());
STL 库中如何使用还需要看源码来分析,有时间了就琢磨下。
阅读全文
0 0
- 《C++primer》 泛型算法
- C++:泛型算法基础
- C++primer__泛型算法-泛型算法结构
- C++primer U11 读书笔记 泛型算法
- 学习C++——泛型算法
- c++Primer,十一,泛型算法
- C++primer(十一)泛型算法
- C++primer学习:泛型算法(1)
- c++primer学习:泛型算法(2)
- C++primer学习:泛型算法(3)
- C++primer--泛型算法初识
- C++primer阅读笔记---------泛型算法
- [C/C++] 第11章 泛型算法 Primer
- C++----范型算法
- 数据结构与算法(C#):Collections和泛型
- C/C++泛型编程(1)线性查找算法
- C/C++泛型编程(2)链表查找算法
- 堆排序算法及其c语言泛型编程
- Problem F: Matrix Problem (III) : Array Practice Time Limit: 1 Sec Memory Limit: 4 MB Submit: 8787
- Linux 调试器之处理变量!
- [LIS] HDU 1087
- 倒计时
- Linux版本的 免费的人脸识别技术。
- C++泛型算法
- 风投与IT
- Java| Java中字节Byte和位Bit的关系
- cocos2d-x lua发牌动画
- 客户关系管理系统4
- Kaldi HCLG 深入理解
- Java Character 类
- Problem E: Matrix Problem (II) : Array Practice Time Limit: 1 Sec Memory Limit: 4 MB Submit: 8980
- 解决Windows 程序界面闪烁问题的一些经验