一、向量(续)
1.大小和容量
大小:容器中元素的个数。
容量:容器中可容纳元素的个数。
size_type size (void) const; // 获取大小
void resize (size_type num,
value_type const& val = value_type ()); // 改变大小
往小改,被裁减掉的元素将被析构。
往大改,新增出来的元素将被构造,第二个参数表示初始值。
void clear (void); // 清空,相当于resize (0)
bool empty (void) const; // 判空
size_type capacity (void) const; // 获取容量(以元素为单位)
void reserve (size_type size); // 预留容量
向量中不适合存放过多的大对象。
class Student {
...
private:
char name[256];
char info[1024];
};
class Student {
public:
Student (...) : name (new char[256]),
info (new char[1024]) { ... }
~Student (void) {
delete[] name;
delete[] info;
}
private:
char* name;
char* info;
};
class Student {
...
private:
string name;
string info;
};
1)向量的大小可增可减,引起大小变化的函数包括:
push_back/pop_back/insert/erase/resize/clear。
2)向量的容量只增不减,直接改变容量的函数只有一个:
reserve。
3)向量大小的增加会导致其容量的增加,但向量容量的变化不会
影响其大小。
4)通过resize函数增加向量的大小,新增部分会初始化,但是通
过reserve函数增加向量的容量,新增部分不会初始化。
5)访问向量容量范围以内大小范围以外的元素,并不会引发段错
误,但其值未定义。
6)所有关于大小和容量的变化都发生在向量的尾部。
2.查找和排序
#include <algorithm>
iterator find (iterator begin, iterator end,
value_type const& val);
begin - 查找范围的起始迭代器
end - 查找范围的终止迭代器(指向最后一个参与查找的元素的
下一个位置)
val - 查找目标
成功返回容器中第一个与val相匹配的元素的迭代器,失败返回
第二个参数end。
线性查找:O(N)
void sort (iterator begin, iterator end);
在[begin, end)之间做快速排序(O(NlogN))。
用“<”比大小。
void sort (iterator begin, iterator end, less cmp);
用比较器比大小。
bool cmp (value_type const& a, value_type const& b) {
if (a < b)
return true;
else
return false;
}
class Cmp {
public:
bool operator() (value_type const& a,
value_type const& b) const {
if (a < b)
return true;
else
return false;
}
};
3.类对象的向量
1)元素类型类往往需要提供缺省构造函数和支持深拷贝语义的拷
贝构造函数以及拷贝赋值运算符函数。
2)如果需要通过find在容器中查找,元素类型需要提供对
“==”运算符的支持。
3)如果需要通过两参数版本sort对容器做排序,元素类型需要提
供对“<”运算符的支持。
4.任何时候对向量的结构性改变,都有可能使之前初始化的迭代
器失效。通过对迭代器的再次初始化总可以得到正确的结果。
二、双端队列(deque)
增加了两个成员函数:push_front/pop_front
去掉了两个成员函数:capacity/reserve
双端队列的首尾两端都有适度的开放性,因此在靠近首尾两端做插入和删除,其时间复杂度是对称的。
双端队列在总体时间复杂度和空间复杂度方面比向量略差。
四、列表(list)
1.常用成员函数
front/push_front/pop_front
back/push_back/pop_back
insert/erase
size/resize/clear/empty
begin/end/rbegin/rend
2.特殊成员函数
1)删除所有匹配元素
void remove (value_type const& val);
2)将连续重复出现的元素唯一化
void unique (void);
3)将一个列表的一部分或全部剪切到另一个列表中
void splice (iterator pos, list& lst);
将参数列表lst的全部内容剪切到调用列表的pos之前。
void splice (iterator pos, list& lst, iterator del);
将参数列表lst的del元素剪切到调用列表的pos之前。
void splice (iterator pos, list& lst, iterator begin,
iterator end);
将参数列表lst的从begin到end之间的元素剪切到调用列表的
pos之前。
4)将两个有序链表合并为一个有序链表
void merge (list& lst); // <
合并之前调用列表和参数列表必须已经有序,合并以后参数列表
中的所有元素都被剪切到调用列表中,保证调用列表依然有序。
void merge (list& lst, less cmp); // 比较器
5)排序
void sort (void); // <
void sort (less cmp); // 比较器
五、堆栈(stack)
void push (value_type const& val); // 压入
-> push_back
void pop (void); // 弹出
-> pop_back
value_type& top (void); // 栈顶
-> back
size_type size (void) const; // 大小
-> size
bool empty (void) const; // 判空
->empty
底层容器:vector/deque(缺省)/list
stack<int, vector<int> > si;
stack<string, list<string> > ls;
stack<string> ls; // stack<string, deque<string> > ls;
六、队列(queue)
void push (value_type const& val); // 压入
-> push_back
void pop (void); // 弹出
-> pop_front
value_type& front (void); // 队首
-> front
value_type const& front (void) const; // 队首
-> front
value_type& back (void); // 队尾
-> back
value_type const& back (void) const; // 队尾
-> back
size_type size (void) const; // 大小
-> size
bool empty (void) const; // 判空
->empty
底层容器:deque(缺省)/list
七、优先队列(priority_queue)
void push (value_type const& val); // 压入
void pop (void); // 弹出
value_type& top (void); // 队首
何为优?
1.缺省:以大者为优,大小关系由元素类型的“<”运算决定。
2.定制:由比较器决定优先级。
底层容器:vector/deque(缺省)
八、映射(map)
1.映射是一个key-value对的序列,其中每个key都是唯一的。
2.映射中所有的key-value对,按key的升序排列,以平衡有序
二叉树的形式存储。
3.通过key获得与之唯一对应的value很快:O(logN)。
4.基于key类型的"<"运算符或者比较器决定key的大小。
map<string, int> si;
key value
map<string, int, less> si;
比较器
5.映射支持以key为下标的“[]”运算符。如果key不存在,新建
一个节点返回其value的引用。如果key已存在,直接返回对应
的value的引用。
map<string, int> si;
si["张飞"] = 80; // 新建"张飞-80"
si["张飞"] = 50; // 修改
6.映射以pair作为基本存储单位。
pair<key, value> p;
p.first -> key
p.second -> value
7.常用成员函数
1)插入元素
pair<iterator, bool> insert (pair<key_type,
value_type> const& pair);
2)删除元素
void erase (iterator pos); // 删一个
void erase (iterator begin, iterator end); // 删一组
size_type erase (key_type const& key); // 根据key删
3)查找匹配
iterator find (key_type const& key);
如果查找成功返回指向匹配pair的迭代器,如果失败返回容器
的终止迭代器。该函数不需要key的类型支持"=="运算,key
的类型只要支持"<"运算或提供了比较器即可。
九、集合(set)
没有value的映射。
十、多重映射(multimap)
key不唯一,一个key可以同时对应多个value。
iterator lower_bound (key_type const& key); // 匹配下限
iterator upper_bound (key_type const& key); // 匹配上限
pair<iterator, iterator> equal_range (
key_type const& key); // 匹配范围
多重映射不支持"[]"运算符。
十一、多重集合(multiset)
没有value的多重映射。