前言
时隔两个月没用c++写代码,vector的一些相关函数就忘得七七八八了。、、
在这把vector的一些用法总结一下,大部分来源于: https://www.cnblogs.com/zuixime0515/p/10507187.html.(ps:大佬总结的很到位,有兴趣的同学们可以去关注关注。)
vector简单说明
vector也是一个容器,并且是个顺序容器。顺序容器有可变长数组vector、双向链表list、双端队列deque。
顺序容器的定义,是因为容器元素的位置和他们的值大小无关,也就是说顺序容器不排序。
所有的容器都有以下两个方法:
int size() : 返回容器对象中元素的个数
bool empty(): 判断容器对象是否为空
顺序容器还有以下成员函数:
begin():返回指向容器中第一个元素的迭代器。
end():返回指向容器中最后一个元素后面的位置的迭代器。
rbegin():返回指向容器中最后一个元素的反向迭代器。
rend():返回指向容器中第一个元素前面的位置的反向迭代器。
erase(...):从容器中删除
clear():从容器中删除所有元素。
front():返回容器中第一个元素的引用。
back():返回容器中最后一个元素的引用。
push_back():在容器末尾增加新元素。
pop_back():删除容器末尾的元素。
insert(...):插入一个或多个元素。该函数参数较复杂,此处省略。
迭代器的使用
迭代器是一个变量,迭代器可以指向容器中的元素,和指针类似。
迭代器的定义方式有以下几种:
正向迭代器
容器类名::iterator 迭代器名;
反向迭代器
容器类名::reverse_iterator 迭代器名;
常量正向迭代器
容器类名::const_iterator 迭代器名;
常量反向迭代器
容器类名::const_reverse_iterator 迭代器名;
迭代器的使用示例
vector<int> a;
vector<int>::iterator pr;
for(int i = 0; i < 3; i++)
{
a.push_back(i);
}
cout << a.size()<<endl;
cout << a.back()<<endl;
cout << "使用数组形式遍历vector内容"<< endl;
for(int i = 0; i < a.size(); i++){
cout << a[i] << " " ;
}
cout << "使用正向迭代器形式遍历vector内容"<< endl;
for(pr = a.begin(); pr != a.end(); pr++){
//这里*pr就是迭代器pr指向的元素
cout << *pr << " ";
}
cout << endl;
cout << "使用反向迭代器形式遍历vector内容"<< endl;
vector<int>::reverse_iterator prr;
for(prr = a.rbegin(); prr != a.rend(); prr++){
cout << *prr * 3 << " ";
}
cout << endl;
vector的成员函数以及作用
vector() 无参构造函数,将容器初始化为空
vector(int n) 将容器初始化为有 n 个元素
vector(int n, const T & val) 假定元素的类型是 T,此构造函数将容器初始化为有 n 个元素,每 个元素的值都是 val
vector(iterator first, iterator last) first 和 last 可以是其他容器的迭代器。一般来说,本构造函数初始化的结果就是将 vector 容器的内容变成与其他容器上的区间 [first, last) —致
void clear() 删除所有元素
bool empty() 判断容器是否为空
void pop_back() 删除容器末尾的元素
void push_back( const T & val) 将 val 添加到容器末尾
int size() 返回容器中元素的个数
T & front() 返回容器中第一个元素的引用
T & back() 返回容器中最后一个元素的引用
iterator insert(iterator i, const T & val) 将 val 插入迭代器 i 指向的位置,返回 i
iterator insert( iterator i, iterator first, iterator last) 将其他容器上的区间 [first, last) 中的元素插入迭代器 i 指向的位置
iterator erase(iterator i) 删除迭代器 i 指向的元素,返回值是被删元素后面的元素的迭代器
iterator erase(iterator first, iterator last) 删除容器中的区间 [first, last)
void swap( vector <T> & v) 将容器自身的内容和另一个同类型的容器 v 互换
vector用法示例
#include<iostream>
#include<vector>
int main(){
int a[4] = {1,3 ,2, 5};
vector<int> v(a,a+4); //将数组a的内容写入v
cout << "1) v.size = " << v.end() - v.begin() << endl;
cout << "2) " << "use iterator ";
vector<int>::iterator p ;
for(p = v.begin(); p != v.end();p++)
cout << *p << " ";
cout << endl;
//删除第二个元素
v.erase(v.begin() + 1);
cout << "3) " << "after delete second element ";
for(p = v.begin(); p != v.end();p++)
cout << *p << " ";
cout << endl;
//在第二个元素后加入13
v.insert(v.begin()+1,13);
cout << "4) " << "insert 13 after second element ";
for(p = v.begin(); p != v.end();p++)
cout << *p << " ";
cout << endl;
//使用vector的其他构造函数
vector<int> pa(5,10);
cout << "5) " << "use another struct function ";
for(p = pa.begin(); p != pa.end();p++)
cout << *p << " ";
cout << endl;
//将V插在pa开头
pa.insert(pa.begin(),v.begin(),v.end());
cout << "6) " << "insert all of v into pa ";
for(p = pa.begin(); p != pa.end();p++)
cout << *p << " ";
cout << endl;
//删除第二个到第四个之间的元素
pa.erase(pa.begin() + 1,pa.begin()+3);
cout << "7) " << "after delete elements that locate at 2th and 4th ";
for(p = pa.begin(); p != pa.end();p++)
cout << *p << " ";
cout << endl;
return 0;
}
vector二维数组
普通定义二维数组:
int **p;
p = new int*[10]; //注意,int*[10]表示一个有10个元素的指针数组
for (int i = 0; i < 10; ++i)
{
p[i] = new int[5];
}
vector定义二维数组:
vector<vector<int> > array(m); //这个m一定不能少//vector<int> array[m];
//初始化一个m*n的二维数组
for(int i=0;i<m;i++) {
array[i].resize(n);
}
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector< vector<int> > a(10);//必须定义行数,列可以不定义
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 5; j++)
{
a[i].push_back(1);
}
}
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 5; j++)
{
cout << a[i][j] << " " ;
}
cout << endl;
}
return 0;
}
访问二维vector的元素的三种方式:
如果指定外层和内层向量的大小,就可用operator[]进行读和写;如果只指定外层向量大小,就能用push_back()函数进行写,不能用operator[]进行读和写。
1)指定外层vector大小
可用push_back函数进行初始化:
v.resize(3);
v[1].push_back(9);
2)遍历指定内层vector大小
提前设定好每行vector的大小,就可用operator[]访问,如下:
for(int i=0;i<3;i++)
v[i].resize(3);
3)一次指定内外层vector大小
v.resize(n, vector<int>(m));