array
- array 容器存储的所有元素一定会位于连续且相邻的内存中
- array 容器替换普通数组的好处是,array 模板类中已经封装好了大量实用的方法,在提高开发效率的同时,代码的运行效率也会大幅提高。
- at() 函数可以有效防止越界操纵数组的情况
- fill() 函数可以实现数组的快速初始化
- swap() 函数可以轻松实现两个相同数组(类型相同,大小相同)中元素的互换。
- 当两个 array 容器满足大小相同并且保存元素的类型相同时,两个 array 容器可以直接直接做赋值操作。也支持比较运算符,
- array 容器的大小必须保证能够容纳复制进来的数据。
- 如果是存储字符串的话,还要保证在存储整个字符串的同时,在其最后放置一个
\0
作为字符串的结束符。strcpy() 在拷贝字符串的同时,会自动在最后添加\0
。 - 容器的迭代器和指针是不能混用的
vector
-
和 array 容器非常类似,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组。
-
尾部插入或删除元素,时间复杂度为
O(1)
。头部或者中部插入或删除元素,时间复杂度为线性阶O(n)
。 -
vector 底层只是一段连续的线性内存空间。
- 使用 3 个迭代器(可以理解成指针)来表示的:
- _Myfirst 指向的是 vector 容器对象的起始字节位置;
- _Mylast 指向当前最后一个元素的末尾字节;
- _myend 指向整个 vector 容器所占用内存空间的末尾字节。
-
vector扩大容量的本质:
- 完全弃用现有的内存空间,重新申请更大的内存空间;
- 将旧内存空间中的数据,按原有顺序移动到新的内存空间中;
- 最后将旧的内存空间释放。
1、创建:
std::vector<double> values; 空vector
values.reserve(20);
// 如果size大于或等于 20 个元素,则跳过
// 迭代器可能会失效,增加容器的容量,容器的元素可能已经被复制或移到了新的内存地址。
std::vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19}; //初始化
std::vector<double> values(20); // 设置大小
std::vector<double> values(20, 1.0); // 设置大小和默认值
std::vector<char>value1(5, 'c');
std::vector<char>value2(value1); // 用vector初始化
int array[] = {1,2,3};
std::vector<int>values(array, array+2); //values 将保存{1,2}
std::vector<int>value1{1,2,3,4,5}; //value2保存{1,2,3}
std::vector<int>value2(std::begin(value1),std::begin(value1)+3);
2、成员函数
迭代器:begin() 、end()
大小: size()元素个数、capacity()当前容量、max_size()最大容量、resize()
empty() 、operator[ ]下标访问修改元素、at()带边界检查、front()、back()
push_back() 、pop_back() 、insert()指定未知插入一个或多个元素、
erase()删除一段、clear()清空、swap()交换两个容量元素、
data()第一个元素指针、
C++11补充begin()、end()函数用于操作普通数组,不影响vector内的begin、end。
begin()返回第一个元素指针
end()最后一个元素后一个指针。
reserve和resize
reserve(size_type size); // 预留至少能容纳size个元素的空间
resize(size_type size,TYPE val); //改变大小为size,且对新创建的元素赋值val
resize会删除不够放的数据,reserve不会