C++系列-STL容器之vector

vector基本概念

  • vector数据结构和数组非常相似,也称为单端数组。
  • vector也是一种顺序容器,在内存中连续排列。

vector与数组的区别

  • 数组是静态空间,定义好之后,长度确定。
  • vector可以动态扩展。由于其大小(size)可变,常用于数组大小不可知的情况下来替代数组。

vector容器的特点

动态大小

  • vector容器的大小可以根据需要进行动态调整。
  • 可以在运行时根据实际需求添加或删除元素,而无需在编译时确定容器的大小。
  • vector容器会自动处理内存管理。

连续存储

  • vector容器中的元素在内存中是连续存储的。
  • 可以通过下标来访问容器中的元素,并且支持快速的随机访问。

自动扩容

  • 当向vector容器中添加元素时,如果容器的当前大小不足以容纳新元素,容器会自动扩容。
  • 扩容是通过重新分配内存并将原有元素复制到新内存空间中来实现的。
  • 这种自动扩容的特性使得vector容器能够动态地适应元素的增长。

尾部操作高效

  • vector容器中的元素是连续存储的,因此在尾部进行插入和删除操作是高效的。
  • 这是因为在尾部插入或删除元素时,不需要移动其他元素,只需调整尾部指针即可。

vector动态扩展的含义

  • 并不是在在原空间后面续接新的空间,而是开辟一个更大的空间,将原数据拷贝到新空间,并删除原空间。

vector常用的接口示意

  • 迭代器v.begin():起始元素的位置, v.end(): 最后一个元素之后的位置。
  • 迭代器v.rbegin():末尾元素的位置, v.rend(): 第一个元素之前的位置。
  • front(): 第一个元素,back(): 末尾元素。
  • push_back(): 末尾添加元素,pop_back(): 末尾删除元素。
  • vector的迭代器是支持随机访问的迭代器,也就是说迭代器可以一下跳好几个。
    在这里插入图片描述

vector的构造函数

  • vector v: 采用模板类实现,默认构造函数。
  • vector(v.begin(), v.end()): 将v对象从v.begin()到 v.end()之间的元素拷贝给正在创建的对象,包头不包尾。
  • vector(n, elem): 将n个elem拷贝给正在创建的对象。
  • vector(const vector &vec): 拷贝构造函数。
#include <iostream>
#include <vector>
using namespace std;

void print_vector(vector<int> &vec)
{
   
	for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++)
	{
   
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
   
	vector<int> arr1;								// 一个空数组
	arr1.push_back(11);
	arr1.push_back(22);
	cout << "---------- arr1 ----------";
	print_vector(arr1);
	
	vector<int> arr2 {
   1, 2, 3, 4};					// 包含1、2、3、4这4个元素
	cout << "---------- arr2 ----------";
	print_vector(arr2);

	vector<int> arr3(4);							// 开辟4个空间,值默认为0
	cout << "---------- arr3 ----------";
	print_vector(arr3);
	
	vector<int> arr4(5, 3);							// 5个值为3的数组
	cout << "---------- arr4 ----------";
	print_vector(arr4);
	
	vector<int> arr5(arr3);							// 将arr3的所有值复制进去,array5和arr3一样
	cout << "---------- arr5 ----------";
	print_vector(arr5);

	vector<int> arr6(arr2.begin(), arr2.end());		// 将arr2的值从头开始到尾复制
	cout << "---------- arr6 ----------";
	print_vector(arr6);
	
	vector<int> arr7(arr2.rbegin(), arr2.rend());	// 将arr2的值从尾到头复制
	cout << "---------- arr7 ----------";
	print_vector(arr7);
}
int main()
{
   
	test01();
	system("pause");
	return 0;
}

result:
---------- arr1 ----------11 22
---------- arr2 ----------1 2 3 4
---------- arr3 ----------0 0 0 0
---------- arr4 ----------3 3 3 3 3
---------- arr5 ----------0 0 0 0
---------- arr6 ----------1 2 3 4
---------- arr7 ----------4 3 2 1

vector赋值操作

=重载赋值

  • 函数原型 vector& operator=(const vector &vec), 重载等号运算符

assign赋值

  • v1.assign(beg迭代器,end迭代器), 将[beg迭代器,end迭代器) 之间的数据拷贝给被赋值的对象。
  • v1.assign(n,elem), 将n个elem的数据拷贝给被赋值的对象。
code:
#include <iostream>
#include <vector>
using namespace std;

void print_vector(vector<int>& vec)
{
   
	for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++)
	{
   
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
   
	vector<int> arr1{
   0,1,2,3,4,5,6,7,8,9};
	cout << "---------- arr1 ----------" << endl;
	print_vector(arr1);

	vector<int> arr2;
	arr2 = arr1;			// 直接用
	cout << "---------- arr2 ----------" << endl;
	print_vector(arr2);

	arr2.pop_back();
	arr2.pop_back();
	vector<int> arr3;
	arr3.assign(5, 3);		// 函数重载,将5个3赋值给arr3
	cout << "---------- arr3 ----------" << endl;</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值