list
容器
list
容器知识
list
是一种序列式容器,其完成的功能实际上和数据结构中的双向链表很相似,具备链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。list
的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。
常用序列式容器
vector
:和数组类似,拥有一段连续的内存空间,能非常好的支持随机存取,即[]
操作符,但由于是连续的内存空间,在中间的插入和删除会导致内存块的拷贝。
list
:双向链表,内存空间不连续的,通过指针访问数据。
deque
:支持[]
操作符,也支持随机存取。(不常用,也不常见)
三者比较:
- 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用
vector
- 如果你需要大量的插入和删除,而不关心随即存取,则应使用
list
- 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用
deque
。
list
常用函数
begin()
和end()
:通过调用list容器的成员函数begin()
得到一个指向容器起始位置的iterator
,可以调用list
容器的end()
函数来得到list
末端下一位置,相当于:int a[n]
中的第n+1
个位置a[n]
,实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用。push_back()
和push_front()
:使用list
的成员函数push_back
和push_front
插入一个元素到list
中。其中push_back()
从list
的末端插入,而push_front()
实现的从list的头部插入。empty()
:利用empty()
判断list
是否为空。resize()
:将list
长度改为只容纳n
个元素,超出的元素将被删除。clear()
:清空list
中所有元素。front()
和back()
:通过front()
可以获得list
容器中的头部元素,通过back()
可以获得list
容器的最后一个元素。但是有一点要注意,就是list中元素是空的时候,这时候调用front()
和back()
会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()
函数判断list
是否为空。pop_back()
和pop_front()
:通过pop_back()
删除最后一个元素,通过pop_front()
删除第一个元素。序列必须不为空,如果当list
为空的时候调用pop_back()
和pop_front()
会使程序崩掉。assign()
:具体和vector
中的操作类似,也是有两种情况,第一种是:l1.assign(n,val)
将l1
中元素变为n
个T(val)
。第二种是:l1.assign(l2.begin(),l2.end())
将l2
中的从l2.begin()
到l2.end()
之间的数值赋值给l1
。swap()
:交换两个链表(两个重载),一个是l1.swap(l2)
; 另外一个是swap(l1,l2)
,都可能完成连个链表的交换。reverse()
:完成list
的逆置。merge()
:合并两个链表并使之默认升序(也可改),l1.merge(l2,greater<int>())
; 调用结束后l2
变为空,l1
中元素包含原来l1
和l2
中的元素,并且排好序,升序。其实默认是升序,greater<int>()
可以省略,另外greater<int>()
是可以变的,也可以不按升序排列。insert()
:在指定位置插入一个或多个元素(三个重载):l1.insert(l1.begin(),100);
在l1
的开始位置插入100
。l1.insert(l1.begin(),2,200);
在l1
的开始位置插入2
个100
。l1.insert(l1.begin(),l2.begin(),l2.end());
在l1
的开始位置插入l2
的从开始到结束的所有位置的元素。
erase()
:删除一个元素或一个区域的元素(两个重载):l1.erase(l1.begin());
将l1
的第一个元素删除。l1.erase(l1.begin(),l1.end());
将l1
的从begin()
到end()
之间的元素删除。
map
容器
map映射容器的元素数据是由一个键值和一个映射数据组成的,键值与映照数据之间具有一一映照的关系。map容器的数据结构也采用红黑树来实现的,插入元素的键值不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。
begin() 返回指向 map 头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果 map 为空则返回 true
end() 返回指向 map 末尾的迭代器
erase() 删除一个元素
find() 查找一个元素
insert() 插入元素
key_comp() 返回比较元素 key 的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向 map 尾部的逆向迭代器
rend() 返回一个指向 map 头部的逆向迭代器
size() 返回 map 中元素的个数
swap() 交换两个 map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素 value 的函数
vector容器
1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据