26. 迭代器iterator函数对象
Posted 为了财务自由!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了26. 迭代器iterator函数对象相关的知识,希望对你有一定的参考价值。
#include <iostream>
#include <vector>
using namespace std;
/*
容器的迭代器
const_iterator:常量的正向迭代器 只能读,而不能写了
iterator:普通的正向迭代器
reverse_iterator:普通的反向迭代器
const_reverse_iterator:常量的反向迭代器
*/
#if 0
int main()
vector<int> vec;
for (int i = 0; i < 20; ++i)
vec.push_back(rand() % 100);
// vector<int>::iterator
// auto it1 = vec.begin();
// const_iterator <= iterator
/*
class const_iterator
public:
const T& operator*()return *_ptr;
class iterator : public const_iterator
T& operator*()return *_ptr;
*/
vector<int>::const_iterator it1 = vec.begin();
for (; it1 != vec.end(); ++it1)
cout << *it1 << " ";
cout << endl;
// rbegin():返回的是最后一个元素的反向迭代器表示
// rend:返回的是首元素前驱位置的迭代器的表示
// vector<int>::reverse_iterator
vector<int>::const_reverse_iterator rit = vec.rbegin();
for (; rit != vec.rend(); ++rit)
cout << *rit << " ";
cout << endl;
/*for (int v : vec)
cout << v << " ";
*/
cout << endl;
return 0;
#endif
函数对象
//c
int sum(int a,int b)
return a+b;
int ret = sum(10,20);
//cpp
class Sum
public:
int operator()(int a,int b)
return a+b;
;
Sum sum;
int ret = sum(10,20);
把有operator()小括号运算符重载函数的对象,称作函数对象或者仿函数!
template<typename T>
bool myless(T a,T b)
return a<b;
template<typename T>
bool mygreater(T a,T b)
return a>b;
//compare是C++库函数模板
template<typename T,typename Compare>
bool compare(T a,T b,Compare comp)
//通过函数指针调用函数是没有办法内联的,
//效率很低,因为有函数调用开销(开辟栈帧等)
return comp(a,b);
int main()
cout << compare(10,20,mygreater<int>) << endl;
cout << compare('b','y',myless<int>) << endl;
改进:
- 此时传入的是对象,而不是函数地址了!在编译过程就知道执行哪一个函数了,可以直接内联,省略函数开销!效率高!
- less、greater是个类,可以为他添加成员变量(函数对象用类生成,所以可以添加相关的成员变量来记录函数对象使用时更多的使用信息!)
怎么使用函数对象?:
优先级队列默认是个大根堆,现在是小根堆!从小到大排序!
set底层是红黑树!
现在是从大到小的序列!默认的是小到大的序列!
以上是关于26. 迭代器iterator函数对象的主要内容,如果未能解决你的问题,请参考以下文章
python-迭代器(next(),iter()函数)和生成器(yield函数)
python-迭代器(next(),iter()函数)和生成器(yield函数)