C++ 日常笔记(2)

来源:互联网 发布:居民社保退休工资算法 编辑:程序博客网 时间:2024/06/05 22:46
  1. Reverse Iterator
    在STL的各类容器中,cbegin(),cend(),crbegin(),crend()等接口返回的都是Reverse Iterator,对于Reverse Iterator的自增操作就是令其指向其前一个元素,而自减操作则令其指向后一个元素。
    有些容器的成员函数只接受iterator类型的参数,不接受reverse_iterator,为完成些形式的操作,必须先通过std::reverse_iterator::base函数将reverse_iterator转换成iterator。
比如:std::vector<int> vec;for (int n = 0;n<10;n++) vec.push_back(n);std::vector<int>::reverse_iterator r_it = vec.rbegin(); std::vector<int>::iterator it(r_it.base()); 
![反向迭代器](http://upload.cppreference.com/mwiki/images/3/39/range-rbegin-rend.svg)

2. std::map

std::map 原型声明:template<    class Key,    class T,    class Compare = std::less<Key>,    class Allocator = std::allocator<std::pair<const Key, T> >> class map;

其中,class Compare是用于比较key是否相同,需要实现运算符’()’的重载,用于比较两个元素的大小。

std::less::operator()bool std::less::operator()( const T& lhs, const T& rhs ) const;constexpr bool std::less::operator()( const T& lhs, const T& rhs ) const;constexpr bool operator()(const T &lhs, const T &rhs) const {    return lhs < rhs;}

而关于如何通过Compare类对key进行判断,有这样一段话:

Everywhere the standard library uses the Compare concept, uniqueness is determined by using the equivalence relation. In imprecise terms, two objects a and b are considered equivalent (not unique) if neither compares less than the other: !comp(a, b) && !comp(b, a).

3.constexpr

const 和 constexpr 变量之间的主要区别在于:const 变量的初始化可以延迟到运行时,而 constexpr 变量必须在编译时进行初始化。所有 constexpr 变量均为常量,因此必须使用常量表达式初始化。

比如:constexpr int GetFive() { return 5; }int some_value[GetFive() + 5]; //合法

constexpr 函数是在使用需要它的代码时,可以在编译时计算其返回值的函数。当其参数为 constexpr 值并且在编译时使用代码需要返回值时(例如,初始化一个 constexpr 变量或提供一个非类型模板参数),它会生成编译时常量。使用非constexpr 参数调用时,或编译时不需要其值时,它将与正则函数一样,在运行时生成一个值。

在函数上使用constexpr将对函数功能施加严格的限制。首先,函数必须返回非void类型。其次,函数体必须具有”return /expr”的形式。第三,expr在参数替换后必须是常量表达式。该常量表达式只能调用其他定义为constexpr的函数,只能使用其他常量表达式数据变量。第四,常量表达式中一切形式的递归均被禁止。最后,这种带constexpr的函数在编译单元中必须先定义后调用。

如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针本身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。与const不同,在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指对象无关。

资料来源:
http://en.cppreference.com/w/
http://blog.csdn.net/yhl_leo/article/details/50864210