STL
通用方法:
int size() const;返回容器内的元素个数。
void clear();删除容器 所有的元素。
bool empty();如果容器没有兀素,返回true, 否则返回false
迭代器:
iterator begin();
const_iterator begin() const;-------const_iterator 的operator*返回常量引用
iterator end();
const_iterator end() const;
常见操作:
itr++、++itr、*itr、 itr1 == itr2、 itr1 != itr2
1)表
ADT:
printList makeEmpty find insert remove findKth
1)实现
1)简单数组方式---printList/find(线性)--findKth(常数)--insert/remove(最坏N)
2)简单链表方式---printList/find(线性)--findKth(i)(O(i))--insert/remove(常数)--双向链表
2)表ADT两个流行实现----STL的vector和list
1)vector--数组
优点--常量时间索引
缺点--插入和删除代价高
2)list--双向链表
优点--插入删除代价小
缺点--不易索引
1)同:在常量时间内在表的末尾添加或删除项、访问表的前端项
void push_back(const Object & x);在表的未尾添加x
void pop_back();删除表的未尾的对象
const Object & back() const;返回表的末尾的对象(也提供返回引用的修改函数)
const Object & front() const;返回表的前端的对象(也提供返回引用的修改函数)
2)list:双向链表允许在表的前端进行高效改变
void push_front(const Object & x);在list 的前端添加x
void pop_front();在list 的前端删除对象
3)vector:高效索引,观察和改变vector的内部容量
Object & operator[] (int idx);返回vector 中idx索引位置的对象,不包含边界检测(也提供返回常量引用的访问函数)
Object & at (int idx);返回vector中idx索引位置的对象,包含边界检测(也提供返回常量引用的访问函数)
int capacity() const;返回vector的内部容量
void reserve(int new Capacity);设定vector的新容量,容量的改变是通过为基本数组分配一个新的内存块,然后复制旧内存块的内容到新块中,再释放旧块的内存来实现的
void resize():改变vector大小
4)vector/list --需要迭代器
iterator insert(iterator pos, const Object & x);添加x到表中迭代器pos 所指向的位置之前的位置
iterator erase(iterator pos);删除迭代器所给出位置的对象--list(常量)--vector不是
iterator erase(iterator strat, iterator end);删除所有的从位置start开始直到位置end (但是不包括end) 的所有元素
2)List实现需要四个类
1)List类本身--包含连接到表两端的链接、表的大小以及系列的方法。
2)Node类--该类看起来像是私有的嵌套类。一个结点包含数据和用来指向其前和其后的结点的指针,以及适当的构造函数。
3)const_iterator类--存储指向当前结点的指针,并提供基本迭代器操作的实现,和所有的重载操作符,例如=、==、!=和++。
4)iterator类
3)Node类---该类包括所存储的项、指向Node之前及之后的指针和一个构造函数。所有的数据成员都是公有的。
struct Node
{
Object data;
Node *prev;
Node *next
Node(const Object & d = Object(), Node *p = NULL, Node *n = NULL): data(d), prev(p),next(n){}
//构造函数后面加:是初始化成员列表,且初始化的顺序依赖于类中定义的顺序而不是在初始化列表中出现的顺序
}