所谓容器,就是一个装东西的盒子,在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
注意一点就是:如果你往容器对象里添加或者删除了元素,也即改变了对象容量,那么对象上原有的迭代器就会失效
时间: 2024-10-29 00:18:57