STL—vector
一、什么是vector
vector就是边长数组,相比较与数组我们需要提前规定它的容量,它可以根据运算自动改变数组的长度,我们在平时写题的时候可能会遇到爆内存的情况,这就是我们数组长度开太长的结果,在这个时候我们就可以用vector去存储
我们在使用vector的时候,需要添加头文件#include <vector>
二、vector的操作
1.vector的定义
vector<typename> name;
- 1
typename
可以是任意的数据类型,当然也可以是STL中的其他容器,例如vector
,set
,queue
。name
的话就是你给这个vector数组起的名字,比如我们可以起名叫a,当然也可以是其他的名字,下面是几个vector的例子
vector<int> a;
vector<double> b;
vector<char> c;
vector<vector<int>> v; //这里如果报错的话,写成如下样子:
vector<vector<int> > v;
//报错原因是C++11以前的编译器会把这个翻译成移位操作
- 1
- 2
- 3
- 4
- 5
- 6
2.vector内元素的访问
(1)通过下标访问
和数组的访问一致,对于
vector<int> a;
- 1
来讲,我们可以直接通过v[0]
,v[1]
进行访问,注意这里的下标是从0 ~ v.size() - 1
,v,size()
是v内的元素数量,后面我们会进行讲述.
(2)通过迭代器访问
迭代器我们可以理解成一个类似于指针的东西
定义一个迭代器:
vector<typename>::iterator it;
- 1
这样it
就是vector<typename>::iterator
类型的变量,typename
就是定义vector
时候的类型,当然it
也可以写成t
或者其他的样子,这里写成it
是习惯,有了it
这个迭代器,我们就可以通过*it
来访问vector
中的元素,下面我们距离来说明:
v.push_back(i);
的意思是把i放入v这个vector
中,下面我们会有详细的讲解
v.begin()
是v的首元素地址
v.end()
是取v的尾元素地址的下一个地址
在这里的begin()
和end()
是迭代器的开始和结束标志,美国人的思维习惯左闭右开[ )
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 10; i ++ ) v.push_back(i);
vector<int>::iterator it = v.begin();
for (int i = 0; i < 10; i ++ ) cout << *(it + i) << ' ';
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
输出结果为0 1 2 3 4 5 6 7 8 9
所以v[i]
和*(v.begin() + i)
是等价的
利用迭代器的自增和字减去遍历元素
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 10; i ++ ) v.push_back(i);
//注意迭代器的遍历不能写成 it < v.end();结束循环条件只能是 it != v.end();
for (vector<int>::iterator it = v.begin(); it != v.end(); it ++ )
cout << *it << ' ';
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
当然我们可以通过auto
缩写
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 10; i ++ ) v.push_back(i);
//注意迭代器的遍历不能写成 it < v.end();结束循环条件只能是 it != v.end();
for (auto it = v.begin(); it != v.end(); it ++ )
cout << *it << ' ';
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
输出结果为0 1 2 3 4 5 6 7 8 9
3.vector中的函数
(1)push_back()
v.push_back(x)
就是在v的末尾添加一个元素x,时间复杂度为O(1)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 10; i ++ ) v.push_back(i);
for (vector<int>::iterator it = v.begin(); it != v.end(); it ++ ) c
out << *it << ' ';
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
输出结果为0 1 2 3 4 5 6 7 8 9
(2)pop_back()
v.pop_back();
就是删除v的尾元素,注意是尾元素,不是任意元素,时间复杂度是O(1)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 1; i <= 3; i ++ ) v.push_back(i);
v.pop_back();
for (vector<int>::iterator it = v.begin(); it != v.end(); it ++ )
cout << *it << ' ';
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
输出结果为1 2
(3)size();
v.size();
是用来获取v中的元素,size()
返回的是unsigned
类型,不过一般来说用%d
不会出问题,这一点对于所有的STL容器来讲都是一样的
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 1; i <= 3; i ++ ) v.push_back(i);
v.pop_back();
printf("%d", v.size());
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
输出结果为2
(4)clear()
v.clear();
用来清空vector中的所有元素,时间复杂度是O(N),N是vector中的元素数量
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 1; i <= 10; i ++ ) v.push_back(i);
v.clear();
printf("%d", v.size());
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
输出结果为0
(5)insert()
v.insert(it, x);
用来想vector任意迭代器it
处插入一个元素x
,时间复杂度是O(N)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 1; i <= 5; i ++ ) v.push_back(i);
for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
cout << endl;
v.insert(v.begin() + 2, -1); //将-1插入v[2]的位置
for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
输出结果为
1 2 3 4 5
1 2 -1 3 4 5
(6)erase()
删除单个元素
v.erase(it);
表示删除迭代器it处的元素
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 3; i <= 7; i ++ ) v.push_back(i);
for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
cout << endl;
//比如我们想要删除值为6这个元素,值为6这个元素对应坐标为v[3]
v.erase(v.begin() + 3);
for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
输出结果为
3 4 5 6 7
3 4 5 7
删除一个区间内的元素
v.erase(first, last)
即删除[first, lase)
中的所有元素
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
for (int i = 3; i <= 7; i ++ ) v.push_back(i);
for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
cout << endl;
v.erase(v.begin() + 1, v.begin() + 4);
//删除v[1], v[2], v[3]
for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
输出结果为
3 4 5 6 7
3 7
文章来源: chen-ac.blog.csdn.net,作者:辰chen,版权归原作者所有,如需转载,请联系作者。
原文链接:chen-ac.blog.csdn.net/article/details/116381073
- 点赞
- 收藏
- 关注作者
评论(0)