STL vector容器

12 篇文章 0 订阅
9 篇文章 0 订阅
本文详细介绍了STL中的vector容器,包括其构造函数、赋值操作、容量和大小、插入与删除、数据存取、容器交换以及预留空间等功能。重点讲解了vector如何动态扩展内存以及如何有效利用reserve()函数减少扩展次数。通过实例代码展示了vector的基本用法,是学习C++ STL不可或缺的一部分。
摘要由CSDN通过智能技术生成

STL中的容器:

vector容器的常用接口及用法:


vectorSTL最常用的容器,和数组结构非常类似,也被称作单端数组

vector 容器和普通数组的区别:不同之处在于,数组是静态空间(一旦给定了初始长度,无法修改),而 vector 容器可以动态扩展

动态扩展:并不是在原有空间的后面续接新空间,而是找到在内存中一块更大的空间,先将原数据拷贝到新空间,后释放原空间;

图片转自于黑马程序员,是在学习的过程中截图下来的


各种函数接口具体如何使用,下面的代码块中会有详细的使用方法


vector 容器构造函数:

1.vector<T> v; 默认(无参)构造函数;

2.vector(const vector & v); 拷贝构造函数

3.vector(begin(),end()); 把区间 [begin(),end()) 的数据拷贝给当前的 vector 容器;

4.vector(n,elem); 将n个 elem 拷贝给当前的 vector 容器;

#include <iostream>
#include <vector>  //使用STL中的容器,得包含它的头文件 
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printVector(vector<int> & v)  //输出打印vector容器内部的值 
{
	for(vector<int>::iterator it = v.begin();it!=v.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test_1()  //vector容器构造函数 
{
	int i = 0;
	vector<int> v1;  //默认(无参)构造函数,创建了一个int类型的vector容器
	
	for(i=0;i<10;i++) 
	{
		v1.push_back(i+1);  //尾插法把数据插入到v1中 
	}
	
	printVector(v1);
	
	vector<int> v2(v1);  //拷贝构造函数,把v1中的数据拷贝到vector容器v2中 
	printVector(v2);
	
	vector<int> v3(v2.begin(),v2.end());  //通过区间([v2.begin(),v2.end()))的方式创建vector容器
	printVector(v3);
	
	vector<int> v4(10,1);  //把10个1传入新创建的vector容器v4中
	printVector(v4); 
} 

int main()
{
	test_1();
	
	system("pause");
	return 0;
} 

vector 容器赋值操作:

1.vector& operator=(const vector & v); 通过重载赋值运算符的方式把 vector 容器 v 的数据赋值到当前的容器 vector

2.vector& assign(begin,end); 把区间 [begin,end) 的数据赋值给当前的容器 vector

3.vector& assign(n,elem); 把n个elem赋值给当前的容器 vector

#include <iostream>
#include <vector>  //使用STL中的容器,得包含它的头文件 
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printVector(vector<int> & v)  //输出打印vector容器内部的值 
{
	for(vector<int>::iterator it = v.begin();it!=v.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test_1()  //vector容器赋值 
{
	int i = 0;
	vector<int> v1;  //先创建一个容器vector 
	
	for(i=0;i<10;i++) 
	{
		v1.push_back(i+1);  //尾插法把数据插入到v1中 
	}
	printVector(v1);
	
	vector<int> v2;
	v2 = v1;  //通过重载赋值运算符的方式把vector容器v的数据赋值到当前的容器vector v2
	printVector(v2);
	
	vector<int> v3;
	v3.assign(v1.begin(),v1.end());  //把区间[begin,end)的数据赋值给当前的容器vector v3
	printVector(v3);
	
	vector<int> v4;
	v4.assign(10,1);  //把10个1赋值给当前的容器vector v4 
	printVector(v4);
} 

int main()
{
	test_1();
	
	system("pause");
	return 0;
} 

vector 容器的容量和大小(元素个数):

1.empty(); 判断 vector 容器是否为空,如果 vector 容器为空,则返回 true,否则返回 false

2.capacity(); 用于查看容器的容量;

3.size() 用于查看容器的大小(元素个数);(容量 >= 元素个数)

4.resize(int num); 重新指定容器的大小为 num,若容器扩大了,则以默认值(0)来填充,若容器变小了,则删除多出来的部分;

5.resize(int num,int elem);

重新指定容器的大小为 num,若容器扩大了,则以 elem 来填充多出来的部分,若容器变小了,则删除多出来的部分;

#include <iostream>
#include <vector>  //使用STL中的容器,得包含它的头文件 
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printVector(vector<int> & v)  //输出打印vector容器内部的值 
{
	for(vector<int>::iterator it = v.begin();it!=v.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test_1()  //vector容器容量和大小 
{
	int i = 0;
	vector<int> v1;  //先创建一个容器vector 
	
	for(i=0;i<10;i++) 
	{
		v1.push_back(i+1);  //尾插法把数据插入到v1中 
	}
	printVector(v1);
	
	if(v1.empty())  //判断容器是否为空,若容器为空,则返回true,否则返回false 
	{
		cout << "当前容器为空" << endl;
	}
	else
	{
		cout << "当前容器不为空" << endl;
		cout << "当前容器的容量为:" << v1.capacity() << endl;  //用于查看容器的容量
		cout << "当前容器的大小为:" << v1.size() << endl;  //用于查看容器的大小 
	}
	
	cout << "——————————————————————————————————————"  << endl;
	
	v1.resize(20);  //重新指定容器的大小为20,容器扩大,以默认值(0)来填充
    printVector(v1);
	cout << "当前容器的容量为:" << v1.capacity() << endl;  //用于查看容器的容量
	cout << "当前容器的大小为:" << v1.size() << endl;  //用于查看容器的大小
	
	cout << "——————————————————————————————————————"  << endl;
	
	v1.resize(25,10);  //重新指定容器的大小为25,容器扩大,以10来填充多出来的部分
	printVector(v1);
	cout << "当前容器的容量为:" << v1.capacity() << endl;  //用于查看容器的容量
	cout << "当前容器的大小为:" << v1.size() << endl;  //用于查看容器的大小
	
	cout << "——————————————————————————————————————"  << endl;
	v1.resize(5);  //重新指定容器的大小为5,容器缩小,删除多出来的部分
	printVector(v1);
	cout << "当前容器的容量为:" << v1.capacity() << endl;  //用于查看容器的容量
	cout << "当前容器的大小为:" << v1.size() << endl;  //用于查看容器的大小
} 

int main()
{
	test_1();
	
	system("pause");
	return 0;
} 

vector 容器插入和删除:

1.push_back(ele);vector 容器尾部插入 ele 元素;

2.pop_back(); 删除掉 vector 容器中的最后一个元素;

3.insert(const_iterator pos,ele); 通过迭代器给 vector 容器指定位置插入元素 ele

4.insert(const_iterator pos,int count,ele); 通过迭代器给 vector 容器指定位置插入 countele 元素;

5.erase(const_iterator pos); 通过迭代器把 vector 容器中指定位置的元素删除;

6.erase(const_iterator start,const_iterator end); 通过迭代器把 vector 容器中 startend 的之间元素删除;

7.clear(); 删除 vector 容器中的所有元素;

#include <iostream>
#include <vector>  //使用STL中的容器,得包含它的头文件 
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printVector(vector<int> & v)  //输出打印vector容器内部的值 
{
	for(vector<int>::iterator it = v.begin();it!=v.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test_1()  //vector容器插入和删除 
{
	int i = 0;
	vector<int> v1;  //先创建一个容器vector 
	
	//通过尾插法向vector容器中插入数据 
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	printVector(v1);
	
	v1.pop_back();  //通过尾删法删除掉vector容器中的最后一个数据
	printVector(v1);
	
	v1.insert(v1.begin(),100);  //通过迭代器给vector容器头部插入100 
	printVector(v1);
	
	v1.insert(v1.begin(),2,1000);  //通过迭代器给vector容器指定位置插入2个1000
	printVector(v1);
	
	v1.erase(v1.begin());  //通过迭代器把vector容器中头部的元素删除
	printVector(v1);
	
	v1.erase(v1.begin(),v1.end());  //通过迭代器把vector容器中begin到end的之间元素删除
	printVector(v1);
	
	v1.clear();  //清空当前vector容器的所有元素
	printVector(v1); 
} 

int main()
{
	test_1();
	
	system("pause");
	return 0;
} 

vector 容器数据存取:

1.operator[]; 通过重载 [] 的方式,获取 vector 容器的每一个元素;

2.at(int idx); 通过成员函数 at() 获取 vector 容器的每一个元素;

3.front(); 返回容器中的第一个元素;

4.back(); 返回容器中的最后一个元素;

#include <iostream>
#include <vector>  //使用STL中的容器,得包含它的头文件 
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void test_1()  //vector容器数据存取
{
	int i = 0;
	vector<int> v1;
	
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	
	for(i=0;i<5;i++)  
	{
		cout << v1[i] << " ";  //通过重载[]的方式,获取vector容器的每一个元素 
	}
	cout << endl;
	
	for(i=0;i<5;i++)
	{
		cout << v1.at(i) << " ";  //通过成员函数at(),获取vector容器的每一个元素 
	}
	cout << endl;
	
	cout << "第一个元素为:" << v1.front() << endl;  //返回容器中的第一个元素
	cout << "最后一个元素为:" << v1.back() << endl;   //返回容器中的最后一个元素
} 

int main()
{
	test_1();
	
	system("pause");
	return 0;
}

vector 容器互换:实现两个容器的交换;

1.swap(vec); 将容器 vec 与本身的 vector 容器进行交换;

#include <iostream>
#include <vector>  //使用STL中的容器,得包含它的头文件 
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void printVector(vector<int> & v)  //输出打印vector容器内部的值 
{
	for(vector<int>::iterator it = v.begin();it!=v.end();it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

void test_1()  //交换vector容器 
{
	int i = 0;
	vector<int> v1;
	for(i=0;i<10;i++)
	{
		v1.push_back(i+1);
	}
	
	vector<int> v2;
	for(i=10;i>0;i--)
	{
		v2.push_back(i);
	}
	
	cout << "交换前:" << endl;
	printVector(v1); 
	printVector(v2);
	
	v1.swap(v2);  //交换容器v1和容器v2 
	cout << "交换后:" << endl;
	printVector(v1); 
	printVector(v2);
}

//容器互换的实际用途:巧用swap()收缩内存 
void test_2()
{
	int i = 0;
	vector<int> v1;
	
	for(i=0;i<100000;i++)  //这里开辟了一个很大的vector容器 
	{
		v1.push_back(i+1);
	}
	
	cout << "v1的容量为:" << v1.capacity() << endl;  //此时v1的容量很大,因为v1的大小(元素个数)很大,且容量>=大小 
	cout << "v1的大小为:" << v1.size() << endl;
	
	v1.resize(5);
	cout << "v1的容量为:" << v1.capacity() << endl;  //此时v1的容量仍然很大,只是重置了v1的大小,但v1的容量并没有改变,导致大部分空间被浪费 
	cout << "v1的大小为:" << v1.size() << endl;
	
	
	//这一行要分两部分来理解,前面的部分是 vector<int> (v1),这里相当于创建了一个匿名对象,通过拷贝构造的方式进行初始化
	//后面的部分是 .swap(v1),将匿名对象与原来的v1交换,因此v1的容量就变小了,而匿名对象执行完这行后就由系统释放掉,所以成功实 现了收缩内存 
	vector<int> (v1).swap(v1); 
	cout << "v1的容量为:" << v1.capacity() << endl;  //此时v1的容量仍然很大,只是重置了v1的大小,但v1的容量并没有改变,导致大部分空间被浪费 
	cout << "v1的大小为:" << v1.size() << endl;
}

int main()
{
	//test_1();
	test_2();
	
	system("pause");
	return 0;
} 

vector 容器预留空间:减少 vector 容器在动态扩展时的次数;

1.reserve(int len); vector 容器预留 len 个元素长度,预留位置不进行初始化,且不可访问;

#include <iostream>
#include <vector>  //使用STL中的容器,得包含它的头文件 
#include <algorithm>  //使用STL提供的算法,得包含它的头文件

using namespace std;

void test_1()  //vector容器预留空间 
{
	int i = 0;
	int *p = NULL;
	int num = 0;  //用于统计动态扩展的次数 
	vector<int> v1;
	
	v1.reserve(100000);  //先给v1预留100000的空间 
	
	for(i=0;i<100000;i++)
	{
		v1.push_back(i+1);
		if(p!=&v1[0])  //若发生动态扩展,每一次都会找一个新的更大的内存空间来存放vector容器,因此地址改变一次,就说明进行了一次动态扩展 
		{
			p = &v1[0];
			num++;
		}
	}
	
	cout << "动态扩展的次数为:" << num << endl; 
}



int main()
{
	test_1();
	
	system("pause");
	return 0;
} 

以上就是STL中vector容器的一些常用接口和用法啦O(∩_∩)O。笔记中有错误的地方,欢迎指出,欢迎大家讨论!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值