c/c++容器操作
C++中的容器大致可以分为两个大类:顺序容器和关联容器。顺序容器中包含有顺序容器适配器。
顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素。主要有vector、list、deque(双端队列)。顺序容器适配器:stack、queue和priority_queue。
关联容器:支持通过键来高效地查找和读取元素。主要有:pair、set、map、multiset和multimap。
注意:容器类是自动申请和释放内存,不需要进行new和delete操作。
一、顺序容器
1、顺序容器定义
为了定义一个容器类型的对象,必须先包含相关的头文件:
1 定义vector: #include <vector> 2 定义list: #include <list> 3 定义deque: #include <deque>
4. 定义queue: #include <queue>
5. 定义stack: #include <stack> //注意:stack和queue都是基于deque实现的,但是stack和queue比较常用
定义示例
1 vector<int>vec;//定义vector,常用 2 list<int>lis; 3 deque<int>deq;
4 stack<int>sta;//定义栈,常用
5 queue<int>que;//定义栈,常用
2、顺序容器初始化
函数模板 | 意义 |
C<T> c;
|
创建一个名为c的空容器。C是容器类型名,如vector,T是元素类型,如int或 string适用于所有容器。 |
C c(c2); |
创建容器c2的副本c;c和c2必须具有相同的容器类型,并存放相同类型的元素。适用于所有容器。 |
C c(b,e); |
创建c,其元素是迭代器b和e标示的范围内元素的副本。 适用于所有容器。 |
C c(n,t); |
用n个值为t的元素创建容器c,其中值t必须是容器类型C的元素类型的值,或者是可转换为该类型的值。 只适用于顺序容器 |
C c(n); |
创建有 n 个值初始化元素的容器 c。 只适用于顺序容器 |
3.vrctor容器的操作
1 //vector的定义 2 vector 创建一个空的vector。 3 vector c1(c2) 复制一个vector 4 vector c(n) 创建一个vector,含有n个数据,数据均已缺省构造产生 5 vector c(n, elem) 创建一个含有n个elem拷贝的vector 6 vector c(beg,end) 创建一个含有n个elem拷贝的vector 7 8 //vector的操作 9 c.assign(beg,end) 将[beg; end)区间中的数据赋值给c。 10 c.assign(n,elem) 将n个elem的拷贝赋值给c。 11 c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 12 c.back() 传回最后一个数据,不检查这个数据是否存在。 13 c.begin() 传回迭代器中的第一个数据地址。 14 c.capacity() 返回容器中数据个数。 15 c.clear() 移除容器中所有数据。 16 c.empty() 判断容器是否为空。 17 c.end() 指向迭代器中末端元素的下一个,指向一个不存在元素。 18 c.erase(pos) 删除pos位置的数据,传回下一个数据的位置。 19 c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。 20 c.front() 传回第一个数据。 21 get_allocator 使用构造函数返回一个拷贝。 22 c.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置。 23 c.insert(pos,n,elem) 在pos位置插入n个elem数据。无返回值。 24 c.insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据。无返回值。 25 c.max_size() 返回容器中最大数据的数量。 26 c.pop_back() 删除最后一个数据。 27 c.push_back(elem) 在尾部加入一个数据。 28 c.rbegin() 传回一个逆向队列的第一个数据。 29 c.rend() 传回一个逆向队列的最后一个数据的下一个位置。 30 c.resize(num) 重新指定队列的长度。 31 c.reserve() 保留适当的容量。 32 c.size() 返回容器中实际数据的个数。 33 c1.swap(c2) 34 swap(c1,c2) 将c1和c2元素互换。同上操作。 35 operator[] 返回容器中指定位置的一个引用。
4.list的操作
1 //list的定义 2 list<int>ilist; 3 4 //list的操作 5 assign() 给list赋值 6 back() 返回最后一个元素 7 begin() 返回指向第一个元素的迭代器 8 clear() 删除所有元素 9 empty() 如果list是空的则返回true 10 end() 返回末尾的迭代器 11 erase() 删除一个元素 12 front() 返回第一个元素 13 get_allocator() 返回list的配置器 14 insert() 插入一个元素到list中 15 max_size() 返回list能容纳的最大元素数量 16 merge() 合并两个list 17 pop_back() 删除最后一个元素 18 pop_front() 删除第一个元素 19 push_back() 在list的末尾添加一个元素 20 push_front() 在list的头部添加一个元素 21 rbegin() 返回指向第一个元素的逆向迭代器 22 remove() 从list删除元素 23 remove_if() 按指定条件删除元素 24 rend() 指向list末尾的逆向迭代器 25 resize() 改变list的大小 26 reverse() 把list的元素倒转 27 size() 返回list中的元素个数 28 sort() 给list排序 29 splice() 合并两个list 30 swap() 交换两个list 31 unique() 删除list中重复的元素
//deque因为笔者没用过所以不说明了
5.stack和queue的操作
1 //栈的定义 2 格式:stack<数据类型>名称; 3 stack<int>sta; 4 5 //栈的操作 6 sta.empty() 如果栈为空,则返回true,否则返回stack 7 sta.size() 返回栈中元素的个数 8 sta.pop() 删除栈顶元素的值,但不返回其值 9 sta.top() 返回栈顶元素的值,但不删除该元素 10 sta.push(item) 在栈顶压入新元素 11 12 //队列的定义 13 格式:queue<数据类型>名称; 14 queue<int>que; 15 16 //队列的操作 17 q.empty() 如果队列为空,则返回true,否则返回false 18 q.size() 返回队列中元素的个数 19 q.pop() 删除队首元素,但不返回其值 20 q.front() 返回队首元素的值,但不删除该元素,该操作只适用于队列 21 q.back() 返回队尾元素的值,但不删除该元素,该操作只适用于队列 22 q.top() 返回具有最高优先级的元素值,但不删除该元素,该操作只适用于优先级队列 23 q.push(item) 对于queue,在队尾压入一个新元素,对于priority_quue,在基于优先级的适当位置插入新元素
//关联容器笔者也没用过,也不会不阐述了 不过本人认为,容器的操作基本类似只要注意细节的处理就好了