这是C++类一些重点难点知识笔记的第 二 篇,同专题的其他文章可以移步:https://www.jianshu.com/nb/39156122
抽象数据类型(abstract data type,ADT)是带有一组操作的一些对象的集合。An abstract data type (ADT) is a set of objects together with a set of operations.
标准模板库(Standard Template Library,SLT)。实现了ADT等数据结构,这些数据结构被称为集合(collection)或者容器(container)
在STL中,使用迭代器(内置类型 iterator)给出数据在表中的位置。通常可以使用对应的模板来声明 iterator:
STLType<dataType>::iterator
获得迭代器
SLT的所有容器都拥有如下的方法可以获得容器中指向的第一个和终止标志的迭代器:
-
iterator begin()
:返回指向容器的第一项的一个适当的迭代器 -
iterator end()
:返回指向容器的终止标志(容器中最后一项的后面的位置)的一个适当的迭代器。(这里比较特殊,是指向的容器的“边界之外”)
两种方法均可以根据所指向的容器类型返回一个恰当的迭代器,所以可以使用 auto
来声明它们,当你不知道应该如何声明的时候:
auto myIterator = STLCollection.begin();
迭代器方法
迭代器很多方法都来自于运算符的重载
-
=
:赋值 -
itr++
和++itr
:推进迭代器itr至下一个位置,前缀和后缀两种形式都允许 -
*itr
:返回存储在迭代器itr指定位置的对象的引用。 -
itx1==itx2
:如果itr1和itr2都指向同一个位置就返回true,否则,返回fa1se -
itr1!=itr2
:如果ix1和itr2都指向不同位置就返回true,否则,返回fase
从而,利用迭代器打印STL容器的方式如下:
for(vector<int>::iterator itr=v.begin(); itr != v.end(); ++itr)
cout<<*itr<<endl;
vector<int>::iterator itr=v.begin();
while(itr!=v.end())
cout<<*itr<<endl;
需要迭代器的表方法
一些表中常用的需要使用迭代器的容器方法:
-
iterator insert(iterator pos, const Object & x)
:添加x到表中迭代器pos所指向的位置之前的位置。对1ist是常量时间操作,对vector则不是。返回值是一个指向插入项位置的迭代器 -
iterator erase(iterator pos)
:删除迭代器所给出位置的对象。对1ist是常量时间操作,对vector不是。返回值是调用之前pos所指向元素的下一个元素的位置。这个操作使pos失效。pos不再有用,因为它所指向的容器变量已经被删除了 -
iterator erase(iterator start, iterator end)
:删除所有的从位置start开始直到位置end(但是不包括end)的所有元素
迭代器的分类
- 正向迭代器:
containerType::iterator itr
; - 常量正向迭代器(不可更改):
containerType::const_iterator itr
; - 反向迭代器:
containerType::reverse_iterator itr
; - 常量反向迭代器:
containerType::const_reverse_iterator itr
;
迭代器的参考:http://www.cplusplus.com/reference/iterator/
转载请注明出处,本文永久更新链接:https://blogs.littlegenius.xin/2019/08/08/【数据结构】一表与迭代器/