vector的入门概念
- STL:标准模板库(一些容器的集合)
- 容器:用来管理一类对象的集合。可以说数组也是一个容器。
- 常见的容器:向量、栈、队列、优先队列、链表、集合、映射
- 迭代器:用来遍历对象集合的元素,或者说迭代器是用来遍历容器中元素的工具。需要注意的是并不是所有的容器都支持迭代器,例如需要遵循先进后出原则的栈就不支持迭代器。
概念:vector
是一个顺序的容器,能够存放各种类型的对象。可以将其理解为一个能存放任意类型的动态数组(可变长的数组)。
vector
的初始化:
- vector():创建一个空向量
- vector(n):创建一个长度为n的向量
- vector(n,t):创建一个长度为n,元素为t的向量
vector
的定义:vector<int> v
;
vector中的函数
函数 | 功能 |
---|---|
insert(pos,x) | 插入元素x到vector的指定位置 |
push_back(x) | 添加一个元素x到vector的后面 |
erase(pos) | 删除指定位置的元素 |
erase(pos1,pos2) | 删除向量中[pos1,pos2]区间中的元素 |
pop_back() | 弹出或删除vector的最后一个元素 |
clear() | 清除vector中所有的元素,size()变为0 |
front() | 取vector的第一个元素 |
back() | 取vector的最后一个元素 |
begin() | 返回vector的头指针,指向第一个元素 |
end() | 返回vector的尾指针,指向最后一个元素的下一个位置 |
运算符[i] | 取vector下标为i的元素 |
size() | 返回vector中实际元素的个数 |
empty() | 判断vector是否为空 |
vector与数组
- 对于数组,其大小是固定的。
vector
的大小是可变的,开始vector
为空,随着不断插入元素,vector
自动申请空间,容量变大。一般每次申请空间的大小是现有元素的两倍。 - 要熟练使用
sort()
、reverse()
等函数对vector
进行排序、逆序等操作 - 当数组为空时,可以使用下标遍历数组。若数组定义为全局变量,则数组元素默认全为0。而当
vector
为空时,不能使用下标来访问。
测试代码
#include <iostream>
#include <algorithm>
#include <vector>
//reverse需要用到头文件algorithm
using namespace std;
void print(vector<int> v)//遍历容器函数
{
for (int i = 0;i < v.size();i++) cout << v[i] << " ";
cout << endl;
}
int main()
{
vector<int> v;
cout << v.size() << endl;//0
v.push_back(2); v.push_back(3); v.push_back(1); v.push_back(4);
cout << v.size() << endl;//4
print(v);//2 3 1 4
cout << v[0] << " " << v[1] << " " << v[2] << " " << v[3] << endl;//2 3 1 4
cout << v.front() << " " << v.back() << endl;//2 4
reverse(v.begin(),v.end());//逆序输出
for (int i = 0;i < v.size();i++) cout << v[i] << " ";//4 1 3 2
cout << endl;
v.pop_back();//删除最后一个元素
print(v);//4 1 3
vector<int> v2(4);//定义一个长度为4的空容器
print(v2);//0 0 0 0
vector<int> v3(4,10);//定义一个长度为4,元素全为10的容器
print(v3);//10 10 10 10
v3.insert(v3.begin(),3);//在v3的开头插入1个3
print(v3);//3,10 10 10 10
v3.insert(v3.begin(),2,3);//在v3的开头插入2个3
print(v3);//3,3,3,10 10 10 10
v3.erase(v3.begin());//删除v3的第一个元素
print(v3);//3 3 10 10 10 10
return 0;
}
以上代码的输出结果:
0
4
2 3 1 4
2 3 1 4
2 4
4 1 3 2
4 1 3
0 0 0 0
10 10 10 10
3 10 10 10 10
3 3 3 10 10 10 10
3 3 10 10 10 10
复制、swap、sort、reverse
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
void print(vector<int> v)//打印函数
{
for (int i = 0;i < v.size();i++) cout << v[i] << " ";
cout << endl;
}
int main()
{
int a1[5] = {0,1,2,3,4};
int a2[5] = {5,6,7,8,9};
int a3[5] = {2,4,1,5,3};
vector<int> v1(a1,a1 + 5);//将数组a1复制到容器v1中
vector<int> v2(a2,a2 + 5);//将数组a2复制到容器v2中
vector<int> v3(a3,a3 + 5);//将数组a3复制到容器v3中
print(v1);//0 1 2 3 4
print(v2);//5 6 7 8 9
swap(v1,v2);//交换两个容器的数据
print(v1);//5 6 7 8 9
print(v2);//0 1 2 3 4
print(v3);//2 4 1 5 3
reverse(v3.begin(),v3.end());//倒着输出v3,不排序
print(v3);//3 5 1 4 2
sort(v3.begin(),v3.end());//对v3排序
print(v3);//1 2 3 4 5
return 0;
}
二维vector
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
int main()
{
vector<vector<int>> v(15);//vector里面开vector -> 二维vector
for (int i = 0;i < 10;i++)//10列
for (int j = 0;j < 10;j++)//10行
v[i].push_back(1);
for (int i = 0;i < 10;i++)
{
for (int j = 0;j < 10;j++)
{
cout << v[i][j] << " ";
}
cout << endl;
}
return 0;
}
输出:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
迭代器
迭代器类似于指针,是用来指向、修改、遍历容器元素的变量。其使用方法也类似指针。下面是使用指针遍历字符数组的写法:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
int main()
{
char s[] = "hello world";
char *p;//字符类型的指针
for (p = s;*p != '\0';p++) cout << *p;//hello world
return 0;
}
类似指针,使用下面的写法遍历容器:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int a[5] = {1,2,3,4,5};
vector<int> v(a,a + 5);
vector<int>::iterator it;//迭代器
for (it = v.begin();it != v.end();it++)
{
cout << *it << " ";//1 2 3 4 5
}
return 0;
}