一、什么是vector容器
array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。
vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:
#include <vector>
using namespace std;
二、基本函数实现
- 构造函数
- vector():创建一个空vector
- vector(int nSize):创建一个vector,元素个数为nSize
- vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
- vector(const vector&):复制构造函数
- vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
- 增加函数
- 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)间的数据
- 删除函数
- iterator erase(iterator it):删除向量中迭代器指向元素
- iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
- void pop_back():删除向量中最后一个元素
- void clear():清空向量中所有元素
- 遍历函数
- reference at(int pos):返回pos位置元素的引用
- reference front():返回首元素的引用
- reference back():返回尾元素的引用
- iterator begin():返回向量头指针,指向第一个元素
- iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
- reverse_iterator rbegin():反向迭代器,指向最后一个元素
- reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
- 判断函数
- bool empty() const:判断向量是否为空,若为空,则向量中无元素
- 大小函数
- int size() const:返回向量中元素的个数
- int capacity() const:返回当前向量所能容纳的最大元素值
- int max_size() const:返回最大可允许的vector元素数量值
- 其他函数
- void swap(vector&):交换两个同类型向量的数据
- void assign(int n,const T& x):设置向量中第n个元素的值为x
- void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
三、示例
1. 初始化示例
#include<iostream>
#include<vector>
using namespace std;
class A
{
//空类
};
int main()
{
//int型vector
vector<int> vecInt;
//float型vector
vector<float> vecFloat;
//自定义类型,保存类A的vector
vector<A> vecA;
//自定义类型,保存指向类A的指针的vector
vector<A*> vecPointA;
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
class A
{
//空类
};
int main()
{
//int型vector,包含3个元素
vector<int> vecIntA(3);
//int型vector,包含3个元素且每个元素都是9
vector<int> vecIntB(3, 9);
//复制vecIntB到vecIntC
vector<int> vecIntC(vecIntB);
int iArray[] = { 2,4,6 };
//创建vecIntD
vector<int> vecIntD(iArray, iArray + 3);
//打印vectorA,此处也可以用下面注释内的代码来输出vector中的数据
/*for(int i=0;i<vecIntA.size();i++)
{
cout<<vecIntA[i]<<" ";
}*/
cout << "vecIntA:" << endl;
for (vector<int>::iterator it = vecIntA.begin(); it != vecIntA.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//打印vecIntB
cout << "vecIntB:" << endl;
for (vector<int>::iterator it = vecIntB.begin(); it != vecIntB.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//打印vecIntC
cout << "vecIntC:" << endl;
for (vector<int>::iterator it = vecIntC.begin(); it != vecIntC.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//打印vecIntD
cout << "vecIntD:" << endl;
for (vector<int>::iterator it = vecIntD.begin(); it != vecIntD.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
上面的代码用了4种方法建立vector并对其初始化
运行结果:
2. 增加和获得容器中的元素
#include<iostream>
#include<vector>
using namespace std;
class A
{
//空类
};
int main()
{
//创建一个空int型vector
vector<int> vecIntA;
//向量尾部增加元素 1 2 3
vecIntA.push_back(1);
vecIntA.push_back(2);
vecIntA.push_back(3);
int nSize = vecIntA.size();
cout << "vecIntA:" << endl;
//遍历输出vecIntA 方法一
for (int i = 0; i < nSize ; i++)
cout << vecIntA[i] << " " ;
cout << endl;
//遍历输出vecIntA 方法二
for (int i = 0; i < nSize ; i++)
cout << vecIntA.at(i) << " " ;
cout << endl;
//遍历输出vecIntA 方法三
for (vector<int>::iterator it = vecIntA.begin(); it != vecIntA.end(); it++)
cout << *it << " " ;
cout << endl;
}
上述代码对一个整形向量类进行操作,先定义一个整形元素向量类,然后插入3个值,并用3种不同的方法输出,程序运行结果如下:
#include<iostream>
#include<vector>
using namespace std;
class A
{
private:
int n;
public:
inline A(int _n)
{
n = _n;
}
inline void print()
{
cout << n << " " ;
}
};
int main()
{
//创建一个空类A型vector
vector<A> vecClassA;
A a1(1);
A a2(2);
A a3(3);
//向量尾部增加元素 1 2 3
vecClassA.push_back(a1);
vecClassA.push_back(a2);
vecClassA.push_back(a3);
int nSize = vecClassA.size();
cout << "vecClassA:" << endl;
//遍历输出vecClassA 方法一
for (int i = 0; i < nSize; i++)
vecClassA[i].print();
cout << endl;
//遍历输出vecClassA 方法二
for (int i = 0; i < nSize; i++)
vecClassA.at(i).print();
cout << endl;
//遍历输出vecClassA 方法三
for (vector<A>::iterator it = vecClassA.begin(); it != vecClassA.end(); it++)
(*it).print();
cout << endl;
return 0;
}
上述代码通过定义元素为类的向量,通过插入3个初始化的类,并通过3种方法输出,运行结果如下:
#include<iostream>
#include<vector>
using namespace std;
class A
{
private:
int n;
public:
inline A(int _n)
{
n = _n;
}
inline void print()
{
cout << n << " " ;
}
};
int main()
{
//创建一个空类A型vector
vector<A*> vecClassA;
A* a1 = new A(1);
A* a2 = new A(2);
A* a3 = new A(3);
//向量尾部增加元素 1 2 3
vecClassA.push_back(a1);
vecClassA.push_back(a2);
vecClassA.push_back(a3);
int nSize = vecClassA.size();
cout << "vecClassA:" << endl;
//遍历输出vecClassA 方法一
for (int i = 0; i < nSize; i++)
(*vecClassA[i]).print();
cout << endl;
//遍历输出vecClassA 方法二
for (int i = 0; i < nSize; i++)
(*vecClassA.at(i)).print();
cout << endl;
//遍历输出vecClassA 方法三
for (vector<A*>::iterator it = vecClassA.begin(); it != vecClassA.end(); it++)
(**it).print();
cout << endl;
delete a1;
delete a2;
delete a3;
return 0;
}
上述代码通过定义元素为类指针的向量,通过插入3个初始化的类指针,并通过3种方法输出指针指向的类,运行结果如下:
3. 修改元素示例
修改元素的方法主要有三种:1.通过数组修改,2.通过引用修改,3.通过迭代器修改
#include<iostream>
#include<vector>
using namespace std;
class A
{
private:
int n;
public:
inline A(int _n)
{
n = _n;
}
inline void print()
{
cout << n << " " ;
}
};
int main()
{
//创建一个空类int型vector
vector<int> vecIntA;
//向量尾部增加元素 1 2 3
vecIntA.push_back(1);
vecIntA.push_back(2);
vecIntA.push_back(3);
//通过数组修改
vecIntA[1] = 8;
cout << "vecIntA" << endl;
//打印vecIntA
cout << "通过数组修改,第二个元素为8" << endl;
for (vector<int>::iterator it = vecIntA.begin(); it < vecIntA.end(); it++)
cout << *it << '\t';
cout << endl;
//通过引用修改
int& m = vecIntA.at(1);
m = 18;
//打印vecIntA
cout << "通过数组修改,第二个元素为18" << endl;
for (vector<int>::iterator it = vecIntA.begin(); it < vecIntA.end(); it++)
cout << *it <<'\t' ;
cout << endl;
//通过迭代器修改
vector<int>::iterator it = vecIntA.begin() + 1;
*it = 28;
//打印vecIntA
cout << "通过数组修改,第二个元素为28" << endl;
for (vector<int>::iterator it = vecIntA.begin(); it < vecIntA.end(); it++)
cout << *it << '\t' ;
cout << endl;
return 0;
}
运行结果:
4. 删除向量示例
删除向量主要通过erase和pop_back,示例代码如下:
#include<iostream>
#include<vector>
using namespace std;
class A
{
private:
int n;
public:
inline A(int _n)
{
n = _n;
}
inline void print()
{
cout << n << " " ;
}
};
int main()
{
//创建一个空类int型vector
vector<int> vecIntA;
//循环插入
for (int i = 1; i < 10; i++)
{
vecIntA.push_back(i);
}
//删除向量中第5个元素
vecIntA.erase(vecIntA.begin() + 4);
cout << "删除第5个元素后的向量vectIntA" << endl;
for (vector<int>::iterator it = vecIntA.begin(); it != vecIntA.end() ; it++)
cout << *it << '\t' ;
cout << endl;
//删除向量中第2-5个元素
cout << "删除第2-5个元素后的vecIntA:" << endl;
vecIntA.erase(vecIntA.begin() + 1, vecIntA.begin() + 5);
for (vector<int>::iterator it = vecIntA.begin(); it != vecIntA.end(); it++)
cout << *it << '\t';
cout << endl;
//删除向量中第最后一个元素
vecIntA.pop_back();
cout << "删除最后一个元素后的vecIntA:" << endl;
for (vector<int>::iterator it = vecIntA.begin(); it != vecIntA.end(); it++)
cout << *it << '\t';
cout << endl;
//清空向量中所有的元素
vecIntA.clear();
cout << "清空向量中所有的元素" << endl;
for (vector<int>::iterator it = vecIntA.begin(); it != vecIntA.end(); it++)
cout << *it << '\t';
cout << endl;
return 0;
}
5. 综合示例
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Student
{
private:
string m_strNO;
string m_strName;
string m_strSex;
string m_strDate;
public:
Student(string strNO,string strName,string strSex,string strDate)
{
m_strNO = strNO;
m_strName = strName;
m_strSex = strSex;
m_strDate = strDate;
}
void Display()
{
cout << m_strNO << "\t";
cout << m_strName << "\t";
cout << m_strSex << "\t";
cout << m_strDate << "\t";
}
string& get()
{
return m_strNO;
}
};
class StudCollect
{
vector<Student> m_vStud;
public:
void Add(Student & s)
{
m_vStud.push_back(s);
}
Student* Find(string strNO)
{
Student* s1 = NULL;
bool bFind = false;
for (int i = 0; i < m_vStud.size(); i++)
{
Student& s2 = m_vStud.at(i);
if ( s2.get() == strNO)
{
s1 = &m_vStud.at(i);
bFind = true;
break;
}
}
return s1;
}
};
int main()
{
Student s1("1001", "zhangsan", "boy", "1988-10-10");
Student s2("1002", "lisi", "boy", "1988-8-25");
Student s3("1003", "wangwu", "boy", "1989-2-14");
StudCollect s;
s.Add(s1);
s.Add(s2);
s.Add(s3);
Student* ps = s.Find("1002");
if (ps)
ps ->Display();
return 0;
}
运行结果:
参考博客:https://blog.csdn.net/qq_31858735/article/details/82623110