26. 迭代器iterator、函数对象


#include 
#include 
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::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::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;
}

改进:
26. 迭代器iterator、函数对象_第1张图片

  1. 此时传入的是对象,而不是函数地址了!在编译过程就知道执行哪一个函数了,可以直接内联,省略函数开销!效率高!
  2. less、greater是个类,可以为他添加成员变量(函数对象用类生成,所以可以添加相关的成员变量来记录函数对象使用时更多的使用信息!)

怎么使用函数对象?:
26. 迭代器iterator、函数对象_第2张图片
优先级队列默认是个大根堆,现在是小根堆!从小到大排序!

26. 迭代器iterator、函数对象_第3张图片
26. 迭代器iterator、函数对象_第4张图片
set底层是红黑树!
现在是从大到小的序列!默认的是小到大的序列!

你可能感兴趣的:(C++进阶剖析,c++,开发语言,后端)