C++vector容器的使用

目录

一、C++中什么是vector容器

二、vector的特点

三、使用场景

四、对vector容器的简单使用

1、vector构造函数

2、vector赋值操作

3、vector容量与元素个数

4、vector的插入和删除

5、vector数据的存取

6、vector容器互换

7、预留空间

一、C++中什么是vector容器

在C++中,vector是一个非常常用的标准模板库(STL)容器,它提供了动态数组的功能。vector能够存储具有相同类型的元素序列,并且这些元素的数量可以动态地增加或减少。与静态数组相比,vector的主要优势在于其大小不是固定的,它可以随着元素的添加或删除自动调整其存储空间。

二、vector的特点

  • 动态数组vector可以看作是一个可以动态改变大小的数组。
  • 随机访问:由于vector在内存中连续存储元素,因此它支持通过索引直接访问任意位置的元素,这种访问方式与静态数组相似,但更加灵活。
  • 自动内存管理vector会自动管理其内存,包括内存的分配和释放。当vector需要增加更多空间来存储新元素时,它会自动申请一块更大的内存,并将旧的数据复制到新的内存块中,然后释放旧的内存块。这个过程对用户是透明的。
  • 容器操作vector提供了丰富的成员函数来支持各种操作,如元素的添加、删除、访问、遍历等。

三、使用场景

C++中的vector容器是一种非常灵活且强大的数据结构,它提供了动态数组的功能,能够在运行时自动管理其大小。vector的使用场景非常广泛,以下是一些典型的例子:

  • 存储动态大小的序列

    当你需要存储一个大小可能变化的元素序列时,vector是一个很好的选择。与静态数组不同,vector可以随着元素的添加或删除而自动调整其大小。

  • 需要随机访问元素的场景

    由于vector在内存中连续存储元素,因此它支持通过索引直接访问任意位置的元素,这使得它在需要频繁访问序列中元素时非常高效。

  • 作为其他数据结构的底层实现

    在某些情况下,你可以使用vector作为更复杂数据结构的底层实现,比如栈(stack)、队列(queue)或者更高级的自定义数据结构。通过封装vector并限制对其的访问方式,你可以创建出具有特定行为的数据结构。

  • 算法和数据结构课程中的练习

    在学习算法和数据结构时,vector经常被用作练习和实现各种算法(如排序、搜索)和数据结构(如链表、树、图)的底层容器。

  • 图形和游戏开发

    在图形和游戏开发中,vector可以用来存储游戏对象、渲染列表、物理体等。由于游戏世界中的元素数量可能会动态变化,因此vector的灵活性和动态大小特性使其成为这些场景中的理想选择。

  • 科学计算和数据分析

    在科学计算和数据分析领域,vector可以用来存储数值数据,如向量、矩阵的行或列等。通过结合C++的模板和STL算法库,你可以对存储在vector中的数据进行高效的计算和分析。

  • 需要高性能的循环迭代

    当你需要对一组元素进行迭代,并且希望迭代过程尽可能快时,vector是一个很好的选择。由于vector在内存中连续存储元素,因此CPU可以高效地缓存这些元素,从而减少内存访问延迟。

  • 简单的集合操作

    虽然vector本身不是一种集合类型(如setmap),但你可以使用它来模拟一些简单的集合操作,如去重(通过排序和去重算法)、查找(使用线性搜索或二分搜索)等。然而,请注意,这些操作可能不如使用专门的集合类型高效。

四、对vector容器的简单使用

1、vector构造函数

构造函数原型 接口说明
vector() 默认构造函数
vector(v.begin(),v.end()) 将v[begin(),end()区间中的元素拷贝给本身
vector(n, elem); 构造函数将n个elem拷贝给本身
vector(const vector &vec); 拷贝构造函数。
#include 
#include 
using namespace std;

void my_printf(vector &v)//封装一个打印函数
{
	for(vector::iterator it = v.begin();it != v.end();it++)
	{
		cout << (*it) << " ";
	}
	cout << endl;
}
int main()
{
	vector v;//创建一个vector对象
	for(int i = 0;i < 10;i++)
	{
		v.push_back(i);//尾部插入
	} 
	my_printf(v);
	
	//通过区间构造
	vector v2(v.begin(),v.end());//v.begin()代表指向容器的第一个元素,v.end()代表指向容器的最后一个元素的下一个位置
	my_printf(v2);
	
    //构造函数将10个11拷贝给本身
	vector v3(10,11);
	my_printf(v3);
	
	//拷贝构造
	vector v4(v3);
	my_printf(v4);
	
	return 0;
}

2、vector赋值操作

函数原型 函数说明
vector& operator=(const vector &vec) 重载等号操作符
assign(beg, end); 将[beg end)区间中的数据拷贝赋值给本身。
assign(n, elem); 将n个elem拷贝赋值给本身
#include 
#include 
using namespace std;

void my_printf(vector &v)
{
	for(vector::iterator it = v.begin();it != v.end();it++)
	{
		cout << *it <<" ";
	}
	cout << endl;
}
int main()
{
	vector v;
	for(int i =0;i<10;i++)
	{
		v.push_back(i);
	}
	my_printf(v);
	
	//赋值操作
	//operator= 方式;vector类中实现了重载
	vector v2;
	v2 = v;
	my_printf(v2);
	
	//assign方式
	vector v3;
	v3.assign(v.begin(),v.end());//把v的v.begin()位置到v.end()位置赋给v3;
	my_printf(v3);
	
	//n个elem方式
	vector v4;
	v4.assign(10,22);//把十个22放入到v4容器中
	my_printf(v4);
		
	return 0;
}

3、vector容量与元素个数

函数原型 函数说明
empty(); 判断容器是否为空
capacity(); 容器的容量
size(); 返回容器中元素的个数
resize(int num); 重新指走容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则未尾超出容器长度的元素被删除。
resize(int num, elem); 重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则未尾超出容器长度的元素被删除
#include 
#include 
using namespace std;


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

int main()
{
	vector v;
	for(int i = 0;i<10;i++)
	{
		v.push_back(i);
	}	
	my_printf(v);
	
	if(v.empty() == 1)//判空
	{
		cout << "该容器为空" << endl;
	}
	cout << "容器大小:" << v.capacity() <

C++vector容器的使用_第1张图片

4、vector的插入和删除

函数原型 函数说明
push back(ele); 尾部插入元素ele
pop_back(); 删除最后一个元素
insert(const iterator pos,ele); 迭代器指向位置pos插入元素ele
insert(const_iterator pos,int count,ele); 迭代器指向位置p0s插入count个元素ele
erase(const iterator pos); 删除迭代器指向的元素
erase(const iterator start,const iterator end); /删除迭代器从start到end之间的元素
clear(); 删除容器中所有元素
#include 
#include 
using namespace std;


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

int main()
{
	vector v;
	for(int i = 0;i<10;i++)
	{
		v.push_back(i);//尾插
	}	
	my_printf(v);
	
	v.pop_back();//尾删除
	my_printf(v);	
	
	//插入
	v.insert(v.begin(),11);//参数一:迭代器,指向要插入的位置,可以理解为指针;参数二:插入的数据;
	my_printf(v);
	
	v.insert(v.begin()+2,2,22);//参数一:迭代器,v.begin()指向第1的元素,+2表示指向第3个元素参数二:插入个数;参数三:数据;
	my_printf(v);

	//删除
	v.erase(v.begin());//删除第一个元素
	my_printf(v);
	
	//清空
	//v.erase(v.begin(),v.end());//与clear()效果一样;
	v.clear();
	my_printf(v);
		
	return 0;
}

C++vector容器的使用_第2张图片

5、vector数据的存取

函数原型 函数说明
at(iht idx); 返回索引idx所指的数据
operator[]; 返回索引idx所指的数据
front(); 返回容器中第一个数据元素
back(); 返回容器中最后一个数据元素
#include 
#include 
using namespace std;

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

	//利用[]访问数据元素
	for(int i = 0;i

6、vector容器互换

函数原型 函数说明
swap(vec);  将vec与本身的元素互换
#include 
#include 
using namespace std;

//实现两个容器内元素进行互换
void my_printf(vector &v)
{
	for(vector::iterator it=v.begin();it != v.end();it++)
	{
		cout << *it <<" ";
	}
	cout << endl;
	
}
int main()
{
/*
	cout << "交换前:" << endl;
	vector v;
	for(int i = 0;i<10;i++)
	{
		v.push_back(i);
	}
	my_printf(v);
	
	vector v2;
	for(int i =9;i>=0;i--)
	{
		v2.push_back(i);
	}
	my_printf(v2);
	
	cout << "交换后:" << endl;
	v.swap(v2);
	my_printf(v);
	my_printf(v2);
*/
	//实际用途
	//巧用swap可以收缩内存空间
	vector v;
	for(int i = 0;i<100000;i++)
	{
		v.push_back(i);
	}
	cout << "v的容量:" << v.capacity() << endl;
	cout << "v的大小:" << v.size() << endl;
	//重新指定大小;重新指定大小后容量不会改变
	v.resize(50);
	cout << "v的容量:" << v.capacity() << endl;
	cout << "v的大小:" << v.size() << endl;
    //可以发现该容器的容量没有发生改变,但元素个数远小于容量,浪费了大量的空间;利用swap()可以收缩内存空间;
	
	vector (v).swap(v);//匿名对象
	cout << "v的容量:" << v.capacity() << endl;
	cout << "v的大小:" << v.size() << endl;
	
	return 0;
}

C++vector容器的使用_第3张图片

7、预留空间

函数原型 函数说明 功能描述:
reserve(int len); 容器预留len个元素长度,预留位置不初始化,元素不可访问。 减少vector在动态扩展容量时的扩展次数
#include 
#include 
using namespace std;

int main()
{
	int num = 0;//统计开辟空间次数
	int *p = NULL;
	vector v;

	//利用reservr预留空间大小
	v.reserve(100000);//当不加本行时,会平凡的开辟空间次数,降低效率
	for(int i = 0;i<100000;i++)
	{
		v.push_back(i);

		if(p != &v[0])
		{
			p = &v[0];
			num++;
		}
	}
	cout << num <

你可能感兴趣的:(C++入门到精通,c++,开发语言)