一、迭代器
iterator(普通的正向迭代器,可读可写)和const_iterator(常量的正向迭代器,可读不可写) reverse_iterator和const_reverse_iterator
vector<int> vec;
vector<int>::const_iterator it1 = vec.begin();
vector<int>::iterator it1 = vec.begin();
vector<int>::const_reverse_iterator r_beg = vec.rbegin();
vector<int>::reverse_iterator r_beg = vec.rbegin();
vector<int>::const_reverse_iterator r_end = vec.rend();
vector<int>::reverse_iterator r_end = vec.rend();
二、函数对象
函数对象类似C的函数指针,但是相比之下没有函数调用开销,C的函数指针有函数调用开销 greater和less
#include<iostream>
using namespace std;
template<typename T>
bool my_greater(const T& a, const T& b)
{
return a > b;
}
template<typename T>
bool my_less(const T& a, const T& b)
{
return a < b;
}
template<typename T, typename Compare>
bool compare(const T& a, const T& b, Compare comp)
{
return comp(a, b);
}
int main()
{
cout << compare(10, 20, my_greater<int>);
return 0;
}
把有operator() 运算符重载函数的对象,称作函数对象,也叫仿函数。可以确定调用函数, 完全可以内联,省去函数调用开销
因为函数对象是用类生成的,所以可以添加相关的成员变量,用来记录函数对象使用时更多的信息。
C++函数对象的版本实现
#include<iostream>
using namespace std;
template<typename T>
class my_greater
{
public:
bool operator()(const T& a, const T& b)
{
return a > b;
}
};
template<typename T>
class my_less {
public:
bool operator()(const T& a, const T& b)
{
return a < b;
}
};
template<typename T, typename Compare>
bool compare(const T& a, const T& b, Compare comp)
{
return comp(a, b);
}
int main()
{
cout << compare(10,20, my_greater<int>());
return 0;
}
使用函数对象改变priority_queue的排序方式
int main()
{
priority_queue<int> q1;
priority_queue<int, vector<int>, greater<int>> q2;
set <int> s1;
set<int, greater<int>> s2;
return 0;
}
|