vector特点:可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢,使用时需包含头文件vector,打开std 命名空间
vector的迭代器:随机存取迭代器
vetor的存储方式:将元素保存在连续的内存空间中,由于元素是连续存储的,所以可以用元素的下标来计算其地址
vector的增长方式:当有新元素加入时,vector会判断空余空间是否足够容纳新元素的加入,如果不够那么vector会分配新的更大的连续内存空间来保存已有元素的新元素,并释放旧内存。
vector的常用定义方式:
template<classT,class Allocator = allocator<T>>
class vector;
//一般使用只指定第一参数即可,第二参数含默认值
vector<T>myvec1;
vector<T>myvec2={a1,a2,a3}; //a1,a2,a3 类型的T
vector<int>myvec3(10,1); //初始化10个int值每个都为1,若不写第二参数创建元素为默认值
vector<T>myvec4(myvec3.begin(),myvec3.end()); //接受两个迭代器
vector<T>myvec5(myvec4) //这里需注意myvec5和myvec4的模板参数类型T需要相同
myvec1.~vector<T>(); //析构函数
vector的capacity和size: 理解capacity和size的区别非常重要。容器的size是指已经保存的元素的数量,而capacity是指在不分配新的内存空间的前提下它总共可以保存多少元素。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>myvec1(3,1); //初始化3个元素值为1
//放入4个元素
myvec1.push_back(2);
myvec1.push_back(3);
myvec1.push_back(4);
myvec1.push_back(5);
cout <<"当前容器的size:" <<myvec1.size() << endl; //7
cout << "当前容器的capacity:" << myvec1.capacity() << endl; //9
return 0;
}
vector的容量之所以很重要有一下两个原因
1:一旦内存重新配置,和vector相关的references、pointers、iterators都会失效。
2:内存重新配置很耗时间。
所以我们可以用reserve()函数来保留适当的容量
myvec1.reserve(20);
cout << "当前容器的size:" << myvec1.size() << endl; //7
cout << "当前容器的capacity:" << myvec1.capacity() << endl; //20
常用关于容器容量的函数 | 功能 |
---|---|
myvec.size() | 返回当前的元素数量 |
myvec.empty() | 判断大小是否为零 |
myvec.capacity() | 返回当前容器容量 |
myvec.reserve() | 设置容器容量 |
vector的赋值操作 | 功能 |
---|---|
myvec1=myvec2 | 将myvec2的全部元素赋值给myvec1 |
myvec1.assign(n,elem) | 将n个elem赋值给myvec1(会覆盖原有元素) |
myvec1.assign(iterator1,iterator2) | 将迭代器[iterator1,iterator2)指向的内容赋值给myvec1 (会覆盖原有元素) |
myvec1.swap(myvec2) | 将myvec1和myvec2的元素互换(并交换两者的size和capacity) |
swap(myvec1,myvec2) | 全局函数,功能同上,性能不如上版本(因为该版本是泛化) |
元素存取操作 | 效果 |
---|---|
myvec.at(idx) | 返回索引idx所表示的元素。如果idx越界则抛出out_of_range |
myvec[idx] | 同上,但越界不抛出异常,会引发未定义行为 |
myvec.front() | 返回第一个元素。但不检查该元素是否存在 |
myvec.back() | 返回最后一个元素。但不检查该元素是否存在 |
所以在调用下标索引时,你必须心里有数,确实有效,调用front()和back()时,应调用empty()判断容器是否为空。
vector的迭代器函数 | 效果 |
---|---|
myvec.begin() | 返回一个随机存取迭代器,指向第一个元素 |
myvec.end() | 返回一个随机存取迭代器,指向最后一个元素的下一位置 |
myvec.rbegin() | 返回一个逆向迭代器,指向逆向迭代的第一个元素 |
myvec.rend() | 返回一个逆向迭代器,指向逆向迭代的最后元素的下一位置 |
vector的安插、移除操作 | 功能 |
---|---|
myvec.insert(iterator,elem) | 在iterator指的位置前插入elem,并返回指向elem的迭代器 |
myvec.insert(iterator,n,elem) | 在iterator指的位置前插入n个elem,并返回指向(iterator-n)位置的迭代器 |
myvec.insert(iterator1,iterator2,iterator3) | 在iterator1指向的位置前插入[itreator2,iterator3),返回位置(iterator1-n),n为插入的元素个数 |
myvec.push_back(elem) | 在尾部添加一个elem副本 |
myvec.pop_back() | 移除最后一个元素 |
myvec.erase(iterator) | 将iterator指向位置的元素删除并返回指向下一元素的迭代器 |
myvec.erase(iterator1,iterator2) | 移除[iterator1,iterator2)范围的所有元素,返回iterator2指向的位置 |
myvec.resize(num) | 将元素数量改为num,如果num<size(),移除多出的元素,num>size()调用构造函数添加(添加元素为默认值) |
myvec.resize(num,elem) | 效果同上,默认值改为elem |
myvec.clear() | 移除所有元素,将容器清空 |
以上为自己阅读书籍和翻阅资料的一些整理和自己的理解,由于自身水平有限,若有错误,欢迎大家指出。