C++(day 13)vector容器

一、什么是vector容器

array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。

vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:

#include <vector>
using namespace std;

二、基本函数实现

  1. 构造函数
  • 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中
  1. 增加函数
  • 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)间的数据
  1. 删除函数
  • iterator erase(iterator it):删除向量中迭代器指向元素
  • iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
  • void pop_back():删除向量中最后一个元素
  • void clear():清空向量中所有元素
  1. 遍历函数
  • reference at(int pos):返回pos位置元素的引用
  • reference front():返回首元素的引用
  • reference back():返回尾元素的引用
  • iterator begin():返回向量头指针,指向第一个元素
  • iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
  • reverse_iterator rbegin():反向迭代器,指向最后一个元素
  • reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
  1. 判断函数
  • bool empty() const:判断向量是否为空,若为空,则向量中无元素
  1. 大小函数
  • int size() const:返回向量中元素的个数
  • int capacity() const:返回当前向量所能容纳的最大元素值
  • int max_size() const:返回最大可允许的vector元素数量值
  1. 其他函数
  • 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值