STL——迭代器Traits

Traits应用在很多地方,不仅仅有迭代器;
还有:

  • type traits
  • iterator traits
  • char traits
  • allocator traits
  • pointer traits
  • array traits

之前有提到过Traits,但是却十分的抽象,现在我们具体看一下Traits在迭代器中的例子:

一、首先先把整体布局给抛出来,有个大致的框架:

STL——迭代器Traits_第1张图片
Iterator Traits的框架

二、Iterator Traits类是什么?

我们先不看代码,只需要知道这是一个类,它的名字叫iterator_traits:


class iterator_traits

三、算法和迭代器之间的关系:

算法:为了处理容器内的元素,STL会提供一些标准算法,包括查找、排序、拷贝、重新排序、修改、数值运算等基本而普遍的算法;

算法并非容器类的成员函数,而是一种搭配迭代器使用的全局函数。这么做有一个重要优势:所有算法只需要实现一份,就可以对所有容器运作,不必为每一种容器量身定制。算法可以操作不同类型之容器内的元素,也可以与用户自定义的容器搭配。当然容器中也会有单独为这个容器设计的算法(例如set中有find,也有全局函数std::find_if);这么做的原因是在容器中,如果使用为容器设计的算法会使得效率更高;

下面是迭代器和算法之间的一个例子:

#include 
#include 
#include 
using namespace std;

int main()
{
    // create vector with elements from 1 to 6 in arbitrary order
    vector coll;
    coll.push_back(2);
    coll.push_back(5);
    coll.push_back(4);
    coll.push_back(1);
    coll.push_back(6);
    coll.push_back(3);

    // find and print minimum and maximum elements
    vector::const_iterator minpos = min_element(coll.begin(),
                                                     coll.end());
    cout << "min: "  << *minpos << endl;
    vector::const_iterator maxpos = max_element(coll.begin(),
                                                     coll.end());
    cout << "max: "  << *maxpos << endl;

    // sort all elements
    sort (coll.begin(), coll.end());

    // find the first element with value 3
    vector::iterator pos3;
    pos3 = find (coll.begin(), coll.end(),  // range
                 3);                        // value

    // reverse the order of the found element with value 3 and all following elements
    reverse (pos3, coll.end());

    // print all elements
    vector::const_iterator pos;
    for (pos=coll.begin(); pos!=coll.end(); ++pos) {
        cout << *pos << ' ';
    }
    cout << endl;
}

其中:

vector::const_iterator minpos = min_element(coll.begin(),coll.end());

minpos就是一个迭代器(看做泛化的指针);通过算法min_element传回一个fan'hua的指针;最后直接用解操作符*来取得并输出这个值:

cout << "min: "  << *minpos << endl;

四、算法类的具体代码:

这是算法Rotate的部分关键代码

之前也说过了,算法迭代器密不可分,这张图也可见算法需要从迭代器中获得一些必要的信息;这些重要的信息包括三个(实际有5个):
* iterator_category:泛化指针的标签(分类、类别)
* value_type:泛化指针所指内容的类型;
* difference_type:是指两个iterator之间的距离应该用什么type来替代;(这个还不太理解)

五、会遇到什么问题?

STL——迭代器Traits_第2张图片
既然算法接收的是泛化的指针,那么普通指针怎么办呢?普通指针并不具备那些重要信息啊。这时候就要设计一个Traits类,将问题隔离;再看第一张图:
STL——迭代器Traits_第3张图片
Iterator Traits
这样一来可以把泛化指针或普通指针都传入Traits,然后Traits统一返回重要信息给算法;

你可能感兴趣的:(STL——迭代器Traits)