C++沉思录读书笔记(18章)- 确定一个泛型算法能支持的数据结构的方法

泛型算法要求对所操作的数据结构的细节信息,要有最小的限定。理想情况是对数据结构的细节信息没有任何限定,但这是不可能的


如何确定一个泛型算法的应用范围呢?分析如下:

上一回我们得到了一个泛型算法

template <class T>
T* find(S s, S b, const T& x)
{
	while (s!=b && *s!=x)
		++s;
	return s;
}
        这个算法的通用性以及足够好了,来看看它对数据结构的要求,这个算法需要对通过S去读具体数据结构的元素,并且S能够往后 “推移”,如果某个数据结构能够定义出满足条件的辅助类S,则我们可以对这个数据结构应用这个算法

        STL根据数据结构能够支持的有效操作,将这些数据结构进行了分类,数据结构的分类通过对这个数据结构定义的迭代器所能支持的操作进行;对每个算法,它会指出算法所需要的数据结构类别,我们经常在C++的书籍中能看到类似“某个特定的算法要求数据结构支持XX迭代器”的话

        一个算法支持某种迭代器,它就能应用在支持这种迭代器的 数据结构上,在find算法中,S就是一个迭代器,只要一个数据结构能构造出一个类似迭代器的辅助类S,我们就能对这个数据结构应 用find算法


有关迭代器的概念
C++中有五种迭代器:
  1.输入迭代器:支持读,不能写;只支持自增操作
  2.输出迭代器:支持写,不能读;只支持自增操作
  3.前向迭代器:支持读和写;只支持自增操作
  4.双向迭代器:支持读和写;支持自增和自减操作

  5.随机访问迭代器:读和写;支持完整的迭代器算术运算

        输入迭代器和输出迭代器不能彼此代替,而其他的迭代器都是它之前的迭代器的升级版,如前向迭代器可以像输入和输出迭代器那样工作,随机访问迭代器则可以像任何其他的迭代器一样工作

        出于各种迭代器之间的这种关系,很容易会误解各种迭代器是通过继承来关联的,但事实不是这样的,迭代器不属于类型的范畴,它是类型应该满足的需求的集合,而继承只能针对类型。如果用继承来关联各种迭代器,那迭代器应该是类,而不能是内建类型,这样我们就不能把指针当做迭代器使用了,显然实际情况不是这样的

        对于迭代器之间的这种类似继承的关系,应该称之为“概念继承”,它是构建C++库的概念框架的一部分


总结:数据结构要使用某个泛型算法,就必须满足这个算法的需求,具体在C++中,泛型算法总是需要数据结构支持它要求的迭代器类 型,C++也提供一整套的迭代器,通过这套结构我们很容器判断出算法可以工作在何种数据结构上

你可能感兴趣的:(数据结构,C++,算法,工作,读书,Class)