文章目录
1.容器介绍
1.1 介绍
向量是表示数组大小可以改变的序列容器。
就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针的偏移量来访问它们的元素,并且与数组一样高效。但与数组不同的是,它们的大小可以动态变化,其存储由容器自动处理。
vector可以非常高效地访问其元素(就像数组一样),并且可以相对高效地从其末尾添加或删除元素。对于涉及在末尾以外的位置插入或删除元素的操作,它们的性能比其他操作差。
1.2 简单解析
A. 头文件:vector
B. 关键:类似于栈的数据结构,支持随机存取元素,并且支持对容器队尾元素 进行插入和删除操作。
C. 细节注意:vector容器在定义的时候是没有分配空间的,只有在进行了初始化分配空间或者插入值之后才允许进行相关操作。这是非常重要的,假如你只定义了一个vector容器,然后直接去访问某个位置的元素这会直接导致程序运行到此报错无法继续运行,写题目时也会报错(Segmentation Fault)
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v; // 没有为其分配空间
cout << v[0] << endl; // 这一步是不合法的, 必须进行相关初始化才可以
}
2.初始化 / 访问操作(Element constructor / Access)
初始化方式通用的一般:赋默认值 / 赋多个相同值 / 利用其他迭代器 / 数组赋值等
#include<iostream>
#include<vector>
using namespace std;
int main(){
int x[] = {
1, 2, 3};
vector<int> v0 = {
1, 2, 3};
vector<int> v1; // 初始化, 空vector 千万不能直接用.
vector<int> v2(3); // 赋值3个 默认值 0
vector<int> v3(v0.begin(), v0.end()); // 迭代器赋值
vector<int> v4(x, x + 2); // 数组
vector<vector<int>> v5(2, vector<int>(3, 1)); // 多重容器初始化
for(auto it : v1) cout << it << ' '; // 空
cout << '\n';
for(auto it : v2) cout << it << ' ';// 3 3 3
cout << '\n';
for(auto it : v3) cout << it << ' ';// 1 2 3
cout << '\n';
for(auto it : v4) cout << it << ' ';// 1 2
cout << '\n';
/*
1 1 1
1 1 1
1 1 1
*/
for(int i = 0; i < 2; i ++ ){
for(int j = 0; j < 3; j ++ ){
cout << v5[i][j] << ' ';
}
cout << '\n';
}
}
元素访问: vector容器直接对元素进行随机存取,因此可以直接引用下标对其进行直接访问
vector[x] / vector.at(x) —— 返回第 x 个位置上的元素
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {
1, 2, 3, 4, 5};
for(int i = 0; i < 5; i ++ )
cout << v[i] << ' '; // 1 2 3 4 5
cout << '\n';
for(int i = 0; i < 5; i ++ )
cout << v.at(i) << ' '; // 1 2 3 4 5
}
vector.front() —— 容器头部元素
vector.back() —— 容器尾部元素
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {
1, 2, 3, 4, 5};
cout << v.front() << ' ' << v.back(); // 1 5
}
3.迭代器操作(Iterator)
vector.begin() —— 返回头部元素迭代器
vector.end() —— 返回尾部元素下一位置的迭代器
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {
1, 2, 3};
vector<int> :: iterator it = v.begin();
for(it; it != v.end(); it ++ ){
cout << *it << ' '; // 1 2 3
}
}
4.容量操作(Capacity)
vector.size() —— 返回容器中元素的个数,这里是指容器当中实际保存的元素数量,并不一定等于其存储量
并且返回的值是unsigned long long, 千万要注意直接使用其进行计算或者循环判断的时候一定要注意
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {
1, 2, 3};
cout << v.size() << endl; // 3
cout << v.size() - 4 << endl;// 答案不是 -1,使用 v.size()一定注意
}
vector.max_size() —— 返回容器最大存储量
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {
1, 2, 3};
cout << v.max_size(); // 4611686018427387903
}
vector.resize() —— 重新修改容器的大小
调整容器大小,使其包含n个元素。
如果n小于当前容器大小,则内容减少到前n个元素,删除超出的元素(并销毁它们)。
如果n大于当前容器的大小,内容将通过在末尾插入尽可能多的元素来扩展,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则将它们进行值初始化。
如果n也大于当前容器容量,则自动重新分配已分配的存储空间。
注意,这个函数通过插入或删除容器中的元素来改变容器的实际内容
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;
for(int i = 1; i < 10; i ++ ) v.push_back(i);
for(auto it : v) cout << it << ' '; // 1 ~ 9
cout << endl;
v.resize(3);
for(auto it : v) cout << it << ' '; // 1 2 3
cout << endl;
v.resize(5, 100);
for(auto it : v) cout << it << ' '; // 1 2 3 100 100
cout << endl;
v.resize(7); // 默认初始化值 0
for(auto it : v) cout << it << ' '; // 1 2 3 100 100 0 0
cout << endl;
}
5.修改操作(Modify)
vector.assign() —— 利用数组 / 容器 / 初始化等方式为其直接赋值
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;
vector<int> t = {
1, 2, 3, 4, 5, 6};
v.assign(t.begin(), t.begin() + 3); // 容器赋值
for(auto it : v) cout << it << ' '; // 1 2 3
cout << '\n';
v.assign(5, 10); // 初始化 n 个 val 值
for(auto it : v) cout << it << ' '; // 10 10 10 10 10
cout << '\n';
int x[] = {
9, 8, 5, 3};
v.assign(x, x + 4);// 利用数组初始化
for(auto it : v) cout << it << ' '; // 9 8 5 3
}
vector.push_back() —— 队尾插入元素
vector.pop_back() —— 队尾清除元素
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;
for(int i = 1; i < 5; i ++ ) v.push_back(i);
for(auto it : v) cout << it << ' '; // 1 2 3 4
cout << '\n';
v.pop_back();
for(auto it : v) cout << it << ' '; // 1 2 3
}
vector.insery() —— 插入元素进入某位置
vector.erase() —— 清除某位置元素
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {
0, 1, 2, 3, 4, 5};
v.insert(v.begin(), 6); // 在该位置之前插入元素
for(auto it : v) cout << it << ' '; // 6 0 1 2 3 4 5
cout << '\n';
v.erase(v.end() - 1); // 删除该位置元素
for(auto it : v) cout << it << ' '; // 6 0 1 2 3 4 5
}
vector.swap() —— 交换vector容器内的元素
vector.clear() —— 交换vector容器内的所有元素
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {
1, 2, 3, 4, 5};
vector<int> v2;
v.swap(v2);
for(auto it : v) cout << it << ' '; // 空
for(auto it : v2) cout << it << ' '; // 1 2 3 4 5
cout << '\n';
v2.clear(); // 清空该容器
cout << v2.size() << endl; // 0
}