vector详解
1. vector技术原理
vector容器是一个线性结构,用三个指针存放向量的起始字节位置、当前最后一个向量的末尾字节和整个容器所占的内存空间的末尾字节,如下图所示,3个指针变量分别为 M_start、M_finish和M_end_storage
2. vector应用基础
2.1创建vevtor对象
vector < int>v; //创建整型的vector对象v
vector<double> v(10); //创建了一个具有十个元素的vector对象v,每个元素的默认值为0.0
vector<double> v(10,9.3); //创建了一个具有十个元素的vector对象v,每个元素的初始值为9.3
vector<char> v1(5,‘k’);
vector<char> v2(v1);//通过拷贝一个vector对象的各个元素值,此时v2对象的5个元素也具有字符值‘k’
int array[] = {11,13,19,23,27};
vector<int> v(array,aray+5);//通过拷贝迭代器区间[array,array+5)的元素值,放入已创建的对象v中
2.2初始化赋值
vector 提供的push_back函数来对vector进行初始化,在容器的尾端插入新元素
vector<int> v;
v.push_back(3);
v.push_back(10);
2.3元素的遍历访问
vector的元素可采用数组或迭代器的方式进行遍历访问。废话不多说,直接上代码
数组方式访问:
#include <vector>
#include <iostream>
int main()
{
using namespace std;
vector<int> v;
v.push_back(20);
v.push_back(26);
v.push_back(39);
for(int i=0;i<v.size();i++)
{
cout << "v[" << i << "]=" << v[i] << endl;
}
return 0;
}
迭代器方式的访问就是使用vector容器提供的iterator类型,定义一个迭代器变量,然后对迭代器进行++操作,从而通过迭代器的*操作将元素读取出来。
#include <vector>
#include <iostream>
int main()
{
using namespace std;
vector<int> v;
v.push_back(20);
v.push_back(26);
v.push_back(39);
vector<int>::iterator i,iend;
iend = v.end();
int j;
for(i=v.begin(),j=0;i!=iend;i++,j++)
{
cout << "v[" << j << "]=" << *i << endl;
}
return 0;
}
2.4元素的插入
不同于在vector容器尾部添加元素的push_back函数,insert函数可以在任意位置插入元素。上代码
#include <vector>
#include <iostream>
int main()
{
using namespace std;
vector<int> v;
v.push_back(6);
v.push_back(7);
v.push_back(8);
v.push_back(20);
v.insert(v.begin() +3,9); //在元素10的前面插入9
v.insert(v.begin(),5); //在首元素之前插入元素5
v.insert(v.end(),11);
for(int i=0;i<v.size();i++)
{
cout <<"v[" << i << "]=" << v[i] << endl;
}
return 0;
}
2.5元素的删除
#include <QCoreApplication>
#include <iostream>
#include <vector>
class MyAnimal{
public:
char *name;
int age;
MyAnimal(char *name,int age)
{
this->name = name;
this->age = age;
}
~MyAnimal(){}
};
int main(int argc, char *argv[])
{
using namespace std;
QCoreApplication a(argc, argv);
MyAnimal *pDog = new MyAnimal("dog",1);
MyAnimal *pMonkey = new MyAnimal("monkey",2);
MyAnimal *pChicken = new MyAnimal("chicken",3);
MyAnimal *pSnake = new MyAnimal("snake",4);
vector<MyAnimal*> v;
v.push_back(pDog);
v.push_back(pMonkey);
v.push_back(pChicken);
v.push_back(pSnake);
delete pMonkey; //删除pMonkey所指的对象
v.erase(v.begin()+1); //删除第二个元素,即pMonkey
vector<MyAnimal*>::iterator i,iend;
iend=v.end();
for(i=v.begin();i!=iend;i++)
{
cout << (*i)->name<<' ' << (*i)->age << endl;
}
v.clear();
cout <<"clear()"<<endl;
return a.exec();
}
运行结果:
2.6元素的反向遍历
利用vector提供的反向迭代器reverse_iterator,以及相应的rbegin()和rend()函数,可反向遍历vector容器的元素。
#include <QCoreApplication>
#include <iostream>
#include <vector>
int main(int argc, char *argv[])
{
using namespace std;
QCoreApplication a(argc, argv);
vector<int> v;
v.push_back(1);
v.push_back(3);
v.push_back(5);
v.push_back(7);
vector<int>::reverse_iterator ri,riend;
riend = v.rend();
for(ri = v.rbegin();ri!=riend;ri++)
{
cout << *ri << endl;
}
return a.exec();
}
运行结果:
2.7vector的交换
vector利用swap算法,实现交换两个vector容器元素的swap成员函数。
#include <QCoreApplication>
#include <iostream>
#include <vector>
using namespace std;
void print(vector<int>& v) //vector元素打印
{
for(int i=0;i<v.size();i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
vector<int> v1;
v1.push_back(11);
v1.push_back(12);
v1.push_back(13);
cout << "v1=";
print(v1);
vector<int> v2;
v2.push_back(90);
v2.push_back(92);
cout << "v2=";
print(v2);
swap(v1,v2); //v1和v2交换
cout << "v1与v2交换后" << endl;
cout << "vi=";
print(v1);
cout << "v2=";
print(v2);
return a.exec();
}
运行结果:
2.8其他常用函数
bool empty() //判断容器是否为空,空为true,否则返回false
size_type size()//当前容器的实际元素个数
size_type max_size()//系统所允许的容器的最大元素个数
size_type capasity()//当前可容纳的元素个数
reference front()//容器的首元素(引用),要求vector不为空
reference back()//返回容器的末元素(引用),要求vector不为空
void pop_back()//用于删除容器的末尾元素
上代码
#include <QCoreApplication>
#include <iostream>
#include <vector>
using namespace std;
void print(vector<int>& v)
{
cout << "-------------------" << endl;
cout << "empty = " << v.empty() << endl;
cout << "size = " << v.size() << endl;
cout << "max_size = " << v.max_size() << endl;
cout << "capacity = " << v.capacity() << endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
vector<int> v1;
print(v1);
//添加五个元素
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
print(v1);
//再添加四个元素
v1.push_back(6);
v1.push_back(7);
v1.push_back(8);
v1.push_back(9);
print(v1);
//手动设置vector的大小
v1.reserve(30);
print(v1);
return a.exec();
}
运行结果: