STL之Vector容器

一、初识Vector容器

学习目标1:学会往Vector容器中添加内置数据类型和Vector容器的遍历

示例:

#include "iostream"
#include <vector>
#include <algorithm>
using namespace std;

void print(int val)
{
	cout << val << endl;
}
void test01()
{
	vector<int> v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);

	//通过迭代器访问容器中的数据
	vector<int>::iterator itBegin = v.begin(); 
	vector<int>::iterator itEnd = v.end();

	//遍历方式一
	while (itBegin!=itEnd)
	{
		cout << *itBegin << endl;
		itBegin++;
	}

	cout << "第二种遍历方式" << endl;
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 
	{
		cout << *it << endl;
	}

	cout << "第三种遍历方式:用STL中的算法遍历" << endl;
	for_each(v.begin(), v.end(), print);
}

int main01()
{
	test01();
	system("pause");
	return 0;
}

学习目标2:往Vector容器中添加自定义数据类型与遍历

示例:

#include "iostream"
#include <string>
#include <vector>
using namespace std;


//自定义数据库 类型

class People
{
public:
	//People() {};
	People(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
	void ShowPeoleInfo()
	{
		cout << "姓名:" << this->m_Name  << "年龄:" << this->m_Age << endl;
	}
	string m_Name;
	int m_Age;
};

void testPeople()
{
	//vector<People> arr;
	//People p1("小黄", 21);
	//People p2("小兰", 32);
	//People p3("小红", 41);
	//People p4("小名", 22);
	//People p5("小花", 12);

	//arr.push_back(p1);
	//arr.push_back(p2);
	//arr.push_back(p3);
	//arr.push_back(p4);
	//arr.push_back(p5);

	//cout << "Vector容器的当前容量是:" << arr.capacity() << endl;
	//cout << "Voctor容器的当前数据个数是:" << arr.size() << endl;

	遍历容器中的数据
	//for (vector<People>::iterator it = arr.begin(); it != arr.end(); it++)
	//{

	//	//cout << "姓名:" << it->m_Name << "年龄:" << it->m_Age << endl;
	//	cout << "姓名:" << (*it).m_Name<<" " << "年龄:" << (*it).m_Age << endl;
	//}
	vector<People*> arr;
	People p1("小黄", 21);
	People p2("小兰", 32);
	People p3("小红", 41);
	People p4("小名", 22);
	People p5("小花", 12);

	arr.push_back(&p1);
	arr.push_back(&p2);
	arr.push_back(&p3);
	arr.push_back(&p4);
	arr.push_back(&p5);

	cout << "Vector容器的当前容量是:" << arr.capacity() << endl;
	cout << "Voctor容器的当前数据个数是:" << arr.size() << endl;

	//遍历容器中的数据
	for (vector<People*>::iterator it = arr.begin(); it != arr.end(); it++)
	{

		//cout << "姓名:" << it->m_Name << "年龄:" << it->m_Age << endl;
		cout << "姓名:" << (*it)->m_Name << " " << "年龄:" << (*it)->m_Age << endl;
	}
}
int main()
{

	testPeople();
	system("pause");
	return 0;
}

学习目标3:容器中嵌套容器

示例:

#include "iostream"
#include <vector>
#include <string>

using namespace std;

//容器中嵌套容器
void test02()
{
	//1、***********定义一个大容器***********
	vector<vector<int>> V;

	//2、创建小容器
	vector<int> v1;
	vector<int> v2;
	vector<int> v3;
	vector<int> v4;

	//3、向小容器中添加数据
	for (int i = 0; i < 4; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 1);
		v3.push_back(i + 2);
		v4.push_back(i + 3);
	}

	//4、把小容器放到大容器中
	V.push_back(v1);
	V.push_back(v2);
	V.push_back(v3);
	V.push_back(v4);

	//5、遍历大容器中的所有数据
	for (vector<vector<int>>::iterator it = V.begin(); it != V.end(); it++)
	{
		//(*it) ---是指vector<int>
		//再遍历每一个小容器中的数据
		cout << "遍历每个小容器的数据" << endl;
		for (vector<int>::iterator it1 = (*it).begin(); it1 != (*it).end(); it1++)
		{
			cout << *it1 << endl;
		}
	}
}
int main()
{

	test02();
	system("pause");
	return 0;
}

二、vector容器的构造函数

学习目标:学会灵活使用vector容器的几种构造函数

vector容器与数组不同之处在于:空间可以动态扩展

动态扩展:动态扩展并不是在原来的内存空间上扩展,而是寻找(开辟)更大的内存空间,把原来的数据拷贝到新空间,最后把原来的空间释放掉。

vector容器支持随机访问的迭代器。

vector函数原型:

      vector<T> v;                         //采用模板实现类实现,默认构造函数

      vector(v.begin(),v.end())      //将v[begin(),end())区间的元素拷贝给本身

      vector(n,elem)                    //构造函数将n个elem拷贝给本身

     vector(const vector &vec)   //拷贝构造函数

示例:

#include "iostream"
#include <vector>

#include <string>
using namespace std;
void printVector(vector<int> &v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it<<" ";
	}
	cout << endl;
}

void test04()
{
	vector<int> v1;           //1、默认构造参数
	for (int i = 1; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);             //1 2 3 4 5 6 7 8 9

	//2、通过区间的方式进行构造
	vector<int> v2(v1.begin(), v1.end());
	printVector(v2);            //1 2 3 4 5 6 7 8 9

	//3、n个elem来构造
	vector<int> v3(10, 100);
	printVector(v3);           //100 100 100 100 100 100 100 100 100 100

	//4、拷贝构造
	vector<int> v4(v3);
	printVector(v4);         //100 100 100 100 100 100 100 100 100 100
}
int main()
{

	test04();
	system("pause");
	return 0;
}

三、vector容器的赋值操作

学习目标:学会利用几种原型函数给vector容器进行赋值

函数原型:

      vector& operator=(const vector &vec)              //重载等号赋值操作

      assign(begin,end)                                             //将[begin,end)区间的数据拷贝赋值给本身

      assign(n,elem)                                                 //将n个elem拷贝赋值给本身

示例: 


#include "iostream"
#include <vector>

using namespace std;


void PrintVector(vector<int> &v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test05()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	PrintVector(v);

	//1、等号进行赋值操作
	cout << "赋值操作 operator=" << endl;
	vector<int> v2;
	v2 = v;
	PrintVector(v2);

	//2、assign
	vector<int> v3;
	v3.assign(v.begin(), v.end());
	PrintVector(v3);

	//3、 assign  n个elem进行赋值
	vector<int> v4;
	v4.assign(10, 100);
	PrintVector(v4);
}
int main()
{

	test05();
	system("pause");
	return 0;
}

总结:vector赋值最简单的方式是用等号进行赋值

四、vector容器的容量与大小操作

学习目标:能灵活对vector容器的容量与大小进行操作

函数原型:

      empty();                            //判断容器是否为空

      capacity();                         //获取容器的容量

      size();                                //获取容器中的元素个数

      resize(int num);                 //重新指定容器的长度为num,若容器变长,则以默认值填充新位置

                                                //若容器变短,则末尾超出容器长度的元素被删除

      resize(int num,elem)         //重新指定容器的长度为num,若容器变长,则以elem填充新位置

                                                //若容器变短,则末尾超出容器长度的元素被删除

示例:

#include "iostream"
#include <vector>

using namespace std;

void PrintVector06(vector<int> &v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test06()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	PrintVector06(v);         //0 1 2 3 4 5 6 7 8 9

	if (v.empty())   //为真代表容器为空
	{
		cout << "v容器为空!!!!" << endl;
	}
	else {
		cout << "v容器不不不为空!!!!" << endl;
		cout <<"v容器的容量是:"<< v.capacity() << endl;
		cout << "v容器的大小是:" << v.size() << endl;
	}

	//重新指定v容器的大小
	v.resize(15);
	PrintVector06(v);         //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0

	//
	v.resize(20,100);
	PrintVector06(v);         //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 100 100 100 100 100

	v.resize(2);
	PrintVector06(v);          //0 1
}
int main()
{

	test06();
	system("pause");
	return 0;
}

五、vector容器的插入和删除操作

学习目标:能够进行vector容器的插入、删除操作

函数原型:

      push_back(elem);

      pop_back();                                                       //删除最后一个元素

      insert(const_iterator pos,elem);                      //迭代器指向位置pos插入元素elem

      insert(const_iterator pos,int count,elem);       //迭代器指向位置pos插入count个元素elem

      erase(const_iterator pos);                             //删除迭代器指向的元素

      erase(const_iterator start,const_iterator end);//删除迭代器从start到end之间的元素

      clear();                                                               //删除容器中所有元素

 示例:

#include "iostream"
#include <vector>
using namespace std;

void PrintVector07(vector<int> &v)
{
	if (v.empty())
	{
		cout << "容器为空!" << endl;
	}
	else 
	{
		cout << "容器的容量为:"<<v.capacity() << endl;
		for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		{
			cout << *it << " ";
		}
	}
	
	cout << endl;
}


void test07()
{
	vector<int> v;
	//尾插法
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
	PrintVector07(v);               //10 20 30 40 50

	//尾删法
	v.pop_back();
	PrintVector07(v);              //10 20 30 40

	//插入法   第一个参数是迭代器
	v.insert(v.begin(), 1000);
	PrintVector07(v);             //1000 10 20 30 40

	v.insert(v.begin(), 2,1000);
	PrintVector07(v);             //1000 1000 1000 10 20 30 40

	//删除
	v.erase(v.begin());
	PrintVector07(v);             //1000 1000 10 20 30 40

	//v.erase(v.begin(), v.end());
	v.clear();
	PrintVector07(v);             //输出为空

}
int main()
{

	test07();
	system("pause");
	return 0;
}

总结:尾插、尾删、插入、删除、清空

六、vector数据的存取

学习目标:对vector容器中的数据进行存取操作

函数原型:

      at(int index);                           //返回索引index所指的数据

      operator[];                              //返回索引index所指的数据

      front();                                   //返回容器中第一个数据元素

      back();                                  //返回容器中最后一个数据元素

示例:

#include "iostream"
#include <vector>


using namespace std;

void PrintVector08(vector<int> &v)
{
	if (v.empty())
	{
		cout << "容器为空!" << endl;
	}
	else
	{
		cout << "容器的容量为:" << v.capacity() << endl;
		for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		{
			cout << *it << " ";
		}
	}

	cout << endl;
}

void test08()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}

	//1、用[] 来访问容器中的元素
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;

	//2、利用at方式来访问元素
	for (int i = 0; i < v.size(); i++)
	{
		cout << v.at(i) << " ";
	}
	cout << endl;

	//3、获取容器中的第一个元素
	cout << "v容器中的第一个元素:" << v.front() << endl;

	//4、获取最后一个元素
	cout << "v容器的最后一个元素:" << v.back() << endl;
}



int main()
{

	test08();
	system("pause");
	return 0;
}

七、vector容器互换

学习目标:实现两容器内的元素互换

函数原型:

      swap(vec);          //将vec与本身的元素互换

示例:

#include "iostream"
#include <vector>

using namespace std;

void PrintVector09(vector<int> &v)
{
	if (v.empty())
	{
		cout << "容器为空!" << endl;
	}
	else
	{
		cout << "容器的容量为:" << v.capacity() << endl;
		for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		{
			cout << *it << " ";
		}
	}

	cout << endl;
}
void test09()
{
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	cout << "交换前:"<<endl;
	PrintVector09(v1);
	vector<int> v2;
	for (int i =10; i >0; i--)
	{
		v2.push_back(i);
	}
	PrintVector09(v2);

	cout << "交换后:" << endl;
	v1.swap(v2);
	PrintVector09(v1);
	PrintVector09(v2);
}

//实际用途  巧用swap可以收缩内存空间
void test009()
{
	vector<int> v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}
	cout << "v的容量为:" << v.capacity() << endl;     //138255
	cout << "v的大小为:" << v.size() << endl;         //100000

	v.resize(3);   //重新指定大小
	cout << "v的容量为:" << v.capacity() << endl;     //138255
	cout << "v的大小为:" << v.size() << endl;         //3

	//巧用swap收缩内存
	vector<int>(v).swap(v);                  //vector<int>(v)匿名对象
	cout << "v的容量为:" << v.capacity() << endl;     //3
	cout << "v的大小为:" << v.size() << endl;         //3

}
int main09()
{

	//test09();
	test009();
	system("pause");
	return 0;
}

 总结:巧用swap收缩内存        vector<int>(v).swap(v)

八、vector预留空间

预留空间的作用:减少vector在动态扩展容量时的扩展次数

函数原型:

        reserve(int len);   //容器预留len个元素长度,预留位置不初始化,元素不可以访问

 示例:

#include "iostream"
#include <vector>
using namespace std;


void test10()
{
	std::vector<int> v;
	v.reserve(100000);
	int num = 0;
	int *p = NULL;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			num++;
		}
	}
	cout << "num=" << num << endl;           //未加v.reserve(100000);   30   进行了30次动态扩展
	cout << "num=" << num << endl;           //加v.reserve(100000);   1   进行了1次动态扩展
}
int main10()
{
	test10();
	system("pause");
	return 0;
}

总结:如果一开始就知道数据量比较大,可以利用reserve预留空间

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值