向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
vector模板类是最简单的序列类型,除非其他类型的特殊优点能更好地满足需求,否则应默认使用vector。
一,特点
- 自动内存管理
- 随机访问元素
- 在尾部插入或删除元素,固定时间–O(1)
- 在头部插入和删除元素,线性时间—O(n)
- 可反转容器(rbegin(),rend())
二,基本函数实现
1.构造函数
vector():创建一个空vector
vector(int nSize):创建一个vector,元素个数为nSize,元素的值默认初始化为0
vector(int nSize,const T& t):创建一个vector,元素个数为nSize,且值均为t
vector(const vector&):复制构造函数
vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
2.增加函数
void push_back(const T& x):向量尾部增加一个元素X
iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
3.删除函数
iterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素
4.遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
5.判断函数
bool empty() const:判断向量是否为空,若为空,则向量中无元素
6.大小函数
int size() const:返回向量中元素的个数
int capacity() const:返回当前向量所能容纳的最大元素值
int max_size() const:返回最大可允许的vector元素数量值
7.其他函数
void swap(vector&):交换两个同类型向量的数据
void assign(int n,const T& x):设置向量中第n个元素的值为x
void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
Any elements held in the container before the call are destroyed and replaced by newly constructed elements (no assignments of elements take place).(原位置的所有元素会被新元素替代并被销毁,先销毁,在替代。不进行元素的赋值)
This causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.(如果新的vector的size大于当前容器的size,编译器会重新自动分配内存)
T accumulate( InputIt first, InputIt last, T init );
计算给定值 init 与给定范围 [first, last) 中元素的和。
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = std::accumulate(v.begin(), v.end(), 0);
8.获取容器中最大或最小元素
max_element(first,last);
min_element(first,last);
Returns an iterator pointing to the element with the largest value in the range [first,last).
返回一个迭代器,指向容器中最大或者最小的元素
总结
1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据
19.A.assign(B.begin(),B.end()),用B取代A ,允许B为其他容器如set
重载等于运算符==,a==b,检查a与b 的内容是否相等,即它们是否拥有相同数量的元素且a中每个元素与b的同位置元素比较相等。
二维vector:
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N = 5, M = 6;
vector<vector<int>> ret;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
ret.push_back({ i, j });
}
}
//vector<vector<int> > obj(N, vector<int>(M)); //定义二维动态数组5行6列
for (int i = 0; i < ret.size(); i++)//输出二维动态数组
{
for (int j = 0; j < ret[i].size(); j++)
{
cout << ret[i][j] << " ";
}
cout << "\n";
}
return 0;
}
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N=5, M=6;
vector<vector<int> > obj(N); //定义二维动态数组大小5行
for(int i =0; i< obj.size(); i++)//动态二维数组为5行6列,值全为0
{
obj[i].resize(M);
}
for(int i=0; i< obj.size(); i++)//输出二维动态数组
{
for(int j=0;j<obj[i].size();j++)
{
cout<<obj[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}