C++STL-vector
一.基本概念
1.front()就是容器里第一个元素,back()就是容器最后一个元素,begin()就是指向第一个元素,end()就是指向最后一个元素的后一个元素
2. vector对象创建
1.默认构造函数 | vector<int> v1; |
2.初始化列表 | vector<int> v2_1 = { 9,8,7,6,5 }; vector<int> v2_2({ 9,6,6,8,5 }); |
3.迭代器 | vector<int> v3(v2_1.begin(), v2_1.end()); |
4.全0初始化,初始化8个0 | vector<int> v4(8); |
5. vector<int> 变量名(a, b); 申请a个空间的元素,每个元素的值初始化为 b | vector<int> v5(8, 6);//初始化8个6 |
6. 拷贝构造函数 | vector<int> v6(v2_2); |
3.vector赋值操作
vector<int> v = { 9,8,5,2,1,1 }; | |
1. = 赋值 | vector<int> v1 = v; |
2. assign(迭代器) | vector<int> v2; v2.assign(v1.begin(), v1.end()); |
3. assign初始化列表 | vector<int> v3; v3.assign({ 1,2,3,4,5,6 }); |
4. assign初始化 a 个 b | vector<int> v4; v4.assign(8, 6);//初始化8个6 |
4.vector数据插入
vector<int> v; | |
1.push_back,在容器后面插入操作 | v.push_back(10); |
2.insert,在容器中间任意位置插入 | v.insert(v.begin(), 888);//在最前面插入 |
5.vector数据删除
vector<int> v = { 9,8,5,211 }; | |
1、pop_back,尾删 | v.pop_back(); |
2、erase,中间任意位置删 | v.erase(v.begin()); |
3、clear,全部删除 | v.clear(); |
6.vector扩容
vector<int> v1 = { 9,8,7,6 } | |
1.size(),获取数据个数 | v1.size() |
2.capacity(),获取容量大小,如果capacity小于size时,会按1.5倍扩容 | v1.capacity() |
3.resize(),改变vector的size;如果扩容很大,然后缩小后,capacity不会变,还是原来很大的容量 | v1.resize(18);//将元素个数变成18个,如果多余出的则全部变成0,少于则缩容 v1.resize(20, 6);//扩容成20个元素,如果多余出的则全部变成6 |
4.reserve(),改变vector的capacity | v.reserve(100);//直接将capacity扩容到100 |
6.vector随机访问元素
区别:at函数会产生异常处理,[ ]不会产生异常处理 | vector<int> v = { 9,8,7,6,5 }; |
1.像数组访问一样“[ ]”访问元素 | v[2] |
2.用at函数访问 | v.at(2) |
7.vector内存交换
swap() | vector<int> v1 = { 1,2,3,4,5 }; vector<int> v2 = { 9,8,7,6,5 }; |
1. 内存交换 | v1.swap(v2);//v1和v2值交换 |
2.缩容,如果resize很大后,再resize小,但capacity还是很大,通过swap函数后,capacity变得很小了. | v1.resize(1000000); vector<int>(v1).swap(v1); |
3.内存清理,即使clear掉元素,但capacity还是很大,通过swap一个空数后,capacity就会被清理 | v2.resize(1000000); vector<int>({}).swap(v2); |
8.vector高效删除
//这种方法是我们常用删除方法,但当我们元素很大时候,时间复杂度会很高,所有耗时也比较长
void remove1(vector<int>& v, int index) {v.erase(v.begin() + index);
}//这种高效删除,直接交换一下,然后删除,时间复杂度很小
void remove2(vector<int>& v, int index) {swap(v[index], v.back());v.pop_back();
}
9.vector数据排序
vector<int> v = { 9,8,7,1,2,3,4 }; | |
1.sort(),从小到大排序 | sort(v.begin(), v.end()); |
如果想逆序排,可以添加这样一个函数,当A>B时返回true,所以逆序排 | bool cmp(int a, int b) { return a > b; } sort(v.begin(), v.end(), cmp); |