码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 顺序容器学习

时间:2015-03-18 19:49:46      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素”

而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序。

c++中的顺序容器一共有这么几种:

vector 可变大小数组
deque 双端队列
list 双向链表
forward_list 单向链表
array 固定数组大小
string 与vector相似的容器,但专门用于保存字符

这些容器可以让我们方便地放元素,取元素,but,她们在:添加、删除、非顺序访问,这些方面的性能都是不同滴(根据需要适当选择)

列了一大堆,就是为了有个印象,不知道她们是干啥的,后面慢慢学...

先不要逐个的去学,我们先来看一下共性的东西,下面是所有容器类型都提供的操作

类型别名  
iterator 迭代器
const_iterator 只读迭代器
size_type unsigned int,保证可以存下此种容器的最大可能长度
difference_type int, 足够保存两个迭代器之间的距离,是有符号的
value_type 元素类型
reference 元素的左值类型,即value_type&
const_reference 即const value_type &
构造函数  
C c 默认构造函数,构造空容器
C c1(c2) 构造了c1,内容是拷贝c2的
C c(b, e) 构造c,将迭代器b和e指定的范围内的元素拷贝到c
C c{a, b, c...} 列表初始化c
赋值与swap  
c1 = c2

将c1中的元素替换为c2中的元素

c1 = {a,b,c...} 将c1中的元素替换为列表中的元素(array不适用)
a.swap(b) 交换a,b的元素
大小  
c.size()

c中元素的数目(forward_list不适用)

c.max_size() c可保存的最大元素数目
c.empty() c是否为空,空true,不空false
添加/删除元素  
c.insert(args) 将args中的元素拷贝进c
c.emplace(inits) 使用inits构造c中的一个元素
c.erase(args) 删除args指定的元素
c.clear() 删除c中的所有元素,返回void
关系运算符  
==, != 是否相等,是否不等
<, <=, >. >= 关系运算符
获取迭代器  
c.begin(), c.end() 获取首元素,尾元素之后位置,的迭代器
c.cbegin(), c.cend() 返回const_iterator
反向容器的额外成员  
reverse_iterator 反着寻址的迭代器
const_reverse_interator 只读的逆序迭代器
c.rbegin(), c.rend() 尾元素,首元素之前的迭代器
c.crbegin(), c.crend() 返回const_reverse_iterator

好多...我都敲晕乎了

先有蛋才有鸡,首先我们来看“构造函数",一共分这么几种:

(1) 默认初始化; (2) 拷贝初始化; (3) 列表初始化; (4) 迭代器初始化; (5) 顺序容器特有初始化

用vector做个栗子,代码如下:

技术分享
 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     vector<int> vec1; //默认初始化
 9     vector<int> vec2{1,2,3,4};  //列表初始化
10     vector<int> vec3{5,6,7,8};
11     vec3 = vec2;
12     vector<int> vec4(vec3); //拷贝初始化
13     vector<int> vec5(vec4.begin()+1, vec4.end()-1); //迭代器初始化
14     vector<int> vec6(10,2);  //顺序容器特有初始化
15     return 0;
16 }
seq_container_definition

执行结果gdb看一下:

技术分享

好,然后我们来看一下迭代器,以及begin()和end()

迭代器和指针差不多,反正就是让我们来遍历着访问元素的,begin()取到第一个元素,end()取到?尾元素的后一个位置(one past the last element)

下面贴个snippet来看她的使用:

技术分享
 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     string s("time for lunch");
 9     string::iterator iter = s.begin();
10     while(iter != s.end()){
11         *iter = toupper(*iter);
12         iter++;
13     }   
14     cout << s << endl;
15     return 0;
16 }
seq_container_iterator

注意一点就是:如果你往容器对象里添加或者删除了元素,也即改变了对象容量,那么对象上原有的迭代器就会失效

 

c++ 顺序容器学习

标签:

原文地址:http://www.cnblogs.com/Jshujiao/p/4347780.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!