stack
1 | 栈的定义在头文件<stack>中,stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。 |
定义stack 对象的示例代码如下:
stack<int> s1;
stack<string> s2;
stack的基本操作有:对于stack<int> s
1
2
3
4
5
6
7
8
9入 栈: s.push(x);
出 栈: s.pop(); //出栈只是删除栈顶元素,并不返回该元素
访问栈顶元素: s.top();
判断栈空: s.empty();//栈空时,返回true
栈中的元素个数:s.size();
1 |
|
queue
1 | queue 模板类的定义在<queue>头文件中。 |
定义queue 对象的示例代码如下:queue<int> q1;
queue<double> q2;
queue 的基本操作有:1
2
3
4
5
6 入 队:q.push(x); // 将x 接到队列的末端。
出 队:q.pop(); //弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素:q.front(); //即最早被压入队列的元素。
访问队尾元素:q.back(); //即最后被压入队列的元素。
判断队列空 q.empty(); //当队列空时,返回true。
队列中的元素个数:q.size();
1 |
|
vector
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
- 顺序序列
- 动态数组
- 能够感知内存分配器的(Allocator-aware)
1 | 1.push_back 在数组的最后添加一个数据 |
pop_back()&push_back(elem)实例在容器最后移除和插入数据
1 |
|
clear()清除容器中所有数据
1 |
|
排序
1 |
|
直接数组访问&迭代器访问
1 |
|
二维数组两种定义方法
1 |
|
1 |
|
deque
deque是一种优化了的对序列两端元素进行添加和删除操作的基本序列容器。
deque的特点:
1、支持随机访问,即支持[]以及at(),但是性能没有vector好。
2、可以在内部进行插入和删除操作,但性能不及list。
deque和vector的不同之处:
1、两端都能够快速插入和删除元素。vector只能在尾端进行。
2、deque的元素存取和迭代器操作会稍微慢一些。因为deque的内部结构会多一个间接过程。
3、迭代器是特殊的智能指针,而不是一般指针。它需要在不同的区块之间跳转。
4、deque可以包含更多的元素,其max_size可能更大。因为不止使用一块内存。
5、不支持对容量和内存分配时机的控制。
注意:在除了首尾两端的其他地方插入和删除元素,都将会导致指向deque元素的任何pointers、references、iterators失效。不过,deque的内存重分配优于vector。因为其内部结构显示不需要复制所有元素。
- 6、deque的内存区块不再被使用时,会被释放。deque的内存大小是可缩减的。不过,是不是这么做以及怎么做由实作版本定义。
deque的各项操作只有一下两点和vector不同:
deque不提供容量操作:capacity()和reverse()。
deque直接提供函数完成首尾元素的插入和删除。
其他均与vector相同。
1 |
|
list
Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.
1 | assign() 给list赋值 |
1 |
|
1 |
|
map
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。
对于迭代器来说,可以修改实值,而不能修改key。
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
快速插入Key -Value 记录。
快速删除记录
根据Key 修改value记录。
遍历所有记录。
数据的插入
1 | //数据的插入--第一种:用insert函数插入pair数据 |
1 | //第二种:用insert函数插入value_type数据,下面举例说明 |
1 | //第三种:用数组方式插入数据,下面举例说明 |
以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的 插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对 应的值
map的大小
Int nSize = mapStudent.size();
数据的遍历
- 前向迭代器
- 反相迭代器
1 | //第二种,利用反向迭代器 |
- 数组的形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32//第三种:用数组方式,程序说明如下
using namespace std;
int main()
{
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1, "student_one"));
mapStudent.insert(pair<int, string>(2, "student_two"));
mapStudent.insert(pair<int, string>(3, "student_three"));
int nSize = mapStudent.size();
//此处应注意,应该是 for(int nindex = 1; nindex <= nSize; nindex++)
//而不是 for(int nindex = 0; nindex < nSize; nindex++)
for(int nindex = 1; nindex <= nSize; nindex++)
cout<<mapStudent[nindex]<<endl;
}
查找并获取map中的元素(包括判定这个关键字是否在map中出现)
第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,
分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.
1 |
|
通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first和 iterator->second分别代表关键字和存储的数据。
第三种:lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)
例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的就是3
Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字,
1 |
|
从map中删除元素
移除某个map中某个条目用erase()
该成员方法的定义如下:
iterator erase(iterator it);//通过一个条目对象删除
iterator erase(iterator first,iterator last)//删除一个范围
size_type erase(const Key&key);//通过关键字删除
clear()就相当于enumMap.erase(enumMap.begin(),enumMap.end());
1 |
|
map中的swap用法
map中的swap不是一个容器中的元素交换,而是两个容器所有元素的交换。
1 | map的基本操作函数: |
set
关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。
常用的方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15begin() ,返回set容器的第一个元素
end() ,返回set容器的最后一个元素
clear() ,删除set容器中的所有的元素
empty() ,判断set容器是否为空
max_size() ,返回set容器可能包含的元素最大个数
size() ,返回当前set容器中的元素个数
rbegin ,返回的值和end()相同
rend() ,返回的值和rbegin()相同
1 |
|
插入3之后虽然插入了一个1,但是我们发现set中最后一个值仍然是3,这就是set 。还要注意begin() 和 end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空.
count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
1 |
|
equal_range() ,返回一对定位器,分别表示第一个大于或等于给定关键值的元素和 第一个大于给定关键值的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于end()的值。
1 |
|
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
1 |
|
set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。
find() ,返回给定值值得定位器,如果没找到则返回end()。
1 |
|
1 | insert(key_value); 将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。 |
1 |
|
lower_bound(key_value) ,返回第一个大于等于key_value的定位器
upper_bound(key_value),返回最后一个大于等于key_value的定位器
1 |
|