Concept与Modeling:
Concept即非class也非function或者template,是抽象的,Modeling就是对应抽象的具体.
1. concept想象成一组type requirement,如果type T是concept T的一个model,必须满足C的所有条件
2. concept是所有type的集合,如果T是concept C的model,表示T隶属于C所表示的type集合
3. concept想象成一组合法程序,如果类似Input Iterator这样的concept作用在于find以及其他许多算法会应用到,则这个concept包含Iterator和那些算法。
理解:concept定义了不同的行为(包括了算法,条件等等),modeling必须具有这些行为。简单点就是抽象(概念)与具体(实例)的关系。
Iterator(迭代器,泛型指针)
Iterator需要定义一个concept,那指针就是这个concept的modeling,理解差不多是正确的,因为Iterator依赖指针其中的一小部分性质。
其他不同的泛型算法可能依赖不同的子集,也就是说有很多方法将指针抽象化(一般化),每个不同的方法便有不同的一个concept。所以Iterator不单单只有一个concept,有五个:Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, Random Access Iterator.
// stl的copy算法
template <class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InpputIterator last, OutputIterator result)
{
for(; first!=last; ++result, ++first)
*result = *first;
return *result;
}
上面可以看出了Input Iterator, Output Iterator一个只读性,一个只写性的特性。同时注意Input Iterator和Output Iterator只定义了需要运算符operator++,也就是对于--和+2等非一定有效
对于很多算法如查找,拷贝只靠input output迭代器就可以实现。但是无法写出[查找并替换]的算法,同时很多算法只靠这两个迭代器,导致复杂度剧增。引入Forward 包含了Input 和output的特性,也就是说是Forward的model必然是input 和output的model。
template<class ForwardIterator, class T>
void replace(ForwardIterator first, ForwardIterator last,
const T& old_value, const T& new_value)
{
for(;first != last; ++ first)
if(*first == old_value)
*first = new_value;
}