1 顺序容器概述
顺序容器:为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应;
有序和无序关联容器:根据关键字的值来存储元素;
新版本容器比旧版本快的多;
通常,使用vector;
2 容器库概述(介绍所有容器都支持的操作)
每个容器都定义在一个头文件中,文件名和类型名相同;及vector定义在vector中;所以#include <vector>
容器均定义为模板类;
vector<vector<int>> v1;
表中所示为所有容器都支持的操作:
2.1 容器类型成员
string line;
auto len = line.size(); //len的类型是string::size_type ; line.size() 就是string::size_type ;
vector<int>::iterator it; //it能读写ector<int>的元素;vector<int>::iterator就是 int;vector<char>::iterator就是char;
string::const_iterator it4; //只能读字符,不能写字符
2.2 迭代器
迭代器范围:用一对迭代器表示:begin、end;也叫:first、last;注意:这种范围是左闭区间[begin,end);
使用左闭范围蕴含的编程假定:
迭代器的简介
(1):迭代器类似于指针类型,它也提供了对对象的间接访问。
(2):指针是c语言中就有的东西,迭代器是c++中才有的,指针用起来灵活高效,迭代器功能更丰富些。
(3):迭代器提供一个对容器对象或者string对象的访问的方法,并且定义了容器范围。
标准容器迭代器的运算符
迭代器的运算
2.3容器构造函数、定义初始化
vector<int> v1;
vector<int> v1(v2);
vector<int> v1=v2;
vector<int> v1{1,2,3,4,5};
vector<int> v1={1,2,3,4,5};
vector<int> v1(v2.begin(),v2.end());
只有顺序容器的构造函数才接受大小参数;
vector<int> v1(100);
vector<int> v1(100,9); //初始化100个9;
2.3.1 标准库array具有固定大小
2.4 赋值和swap(交换)
使用assign (仅顺序容器)
list<string> slist1(1);
slist1.assign(10,"hiya!); //十个元素都是hiya!
2.5 容器大小操作
每个容器都有三个和大小相关的操作:size(返回容器中元素的数目)、empty、max_size(返回一个大于等于该类型容器所能容纳的最大元素数的值);
2.6 容器关系运算符
3 顺序容器操作(顺序容器特有的操作)
3.1 添加元素
push_back:被
insert:被 vector、deque、list、string支持;
push_front:不支持vector;
3.2 访问元素
auto *c.begin(), val2 = c.front(); //获取第一个元素
auto *(c.end() - 1),val3 = c.back; //获取最后一个元素
3.3 删除元素
3.4 容器大小
4 vector如何增长
为了避免vector每天加一个容器就增加一次大小,vector在一次增加容量时,会分配比新的空间需求更大的内存空间;容器预留一部分空间作为备用,防止频繁给vector分配空间。
5 string 的额外操作
5.1 构造string的其它方法
5.2 改变string的其他方法
5.3 string搜索操作
失败返回npos
指定搜索位置,循环搜索;
5.4 compare比较函数
比较结果和字符串比较很类似;s是等于、大于、小于参数指定的字符串,s.compare返回0、正数、负数;
5.5 数值转换
int i = 42;
string s = to_string(i);
double d = stod(s);
cout << i << " " << s << " " << d;