Bootstrap

STL容器与算法(三)C++ Vector知识点

C++ Vector知识点

vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

vector是STL的动态数组,在运行时能根据情况需要改变数组的大小。由于它是以数组形式存储,也就是说它的内存空间是连续的,所以索引可以在常数时间内完成,但是在中间进行插入和删除会造成内存块的复制。另外,如果数组后面的内存空间不够,需要申请一块足够大的内存,会影响vector的效率,同时使迭代器失效。


先看下下列函数基本功能,然后在目录查找,定位到相应函数,有相应的代码片段和解释

在这里插入图片描述


头文件

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

定义

在这里插入图片描述

  • 定义int型
  • 定义string型
  • 定义结构型数组
  • 还可以定义多维数组,例如定义一个二维数组:vector <int> a[MAXN];
    其第一维大小是固定的MAXN,第二维是动态的。
	vector<int> vec;  //定义int型数组 
	vector<string> vec1;//定义string型数组 
	
	struct STU{
   
		int age;
	};
	vector<STU> vec2;   //定义结构型数组 

构造函数

语法:

vector();
vector( size_type num, const TYPE &val );
vector( const vector &from );
vector( input_iterator start, input_iterator end );

C++ Vectors可以使用以下任意一种参数方式构造:

  • 无参数 - 构造一个空的vector,
  • 数量(num)和值(val) - 构造一个初始放入num个 值为val的元素的Vector
  • vector(from) - 构造一个与vector from 相同的vector
  • 迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).
	vector<int> vec;   // 空的vector 不能输出 
	vector<int> vec1(3);//三个元素均为 0 
	vector<int> vec2(3,12);//三个元素均为1 

	vector<int> vec3(vec2);//将vec2的元素初始化给vec3
	//参数类型要相同 

	//用迭代器初始化 
	vector<int>::iterator ite = vec2.begin();//指向vec的头 
	vector<int>::iterator ite1 = vec2.end(); //指向vec的尾 
	vector<int> vec4(ite, ite1);

输出结果:
在这里插入图片描述


属性

1.容量(重新分配,则迭代器失效)

  • capacity() 能容下的元素数量

语法:

size_type capacity();

  • 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
  • capacity() 函数 返回当前vector在重新进行内存分配以前所能容纳的元素数量.
	vector<int> vec;
	cout << vec.capacity() << endl;
	
	vector<int> vec1(3);
	cout << vec1.capacity() << endl;
	
	vec1.push_back(1);   //在vector尾部加一个元素 
	cout << vec1.capacity() << endl;

输出结果:
在这里插入图片描述

  • reserve() 设置容量

语法:

void reserve( size_type size );

  • 设置Vector最小的元素容纳数量(只能变大,不能变小)(设置多大就是多大)(重新分配后,迭代器失效)
  • reserve()函数为当前vector预留至少共容纳size个元素的空间.(译注:实际空间可能大于size)
	vector<int> vec2(3);//三个元素均为零
	cout << vec2.capacity() << endl;
	vec2.reserve(10);
	cout << vec2.capacity()	<< endl;

输出结果:
在这里插入图片描述

  • size() 返回大小

语法:

size_type size();

  • 返回Vector元素数量的大小
  • size() 函数返回当前vector所容纳元素的数目
	vector<int> vec3(3,12);
	vec3.reserve(5);//当前vec3容器为5,元素为3 
	cout << vec3.size() << endl;

输出结果:
在这里插入图片描述

2.大小

  • resize() 改变大小

语法:

void resize( size_type size, TYPE val );

  • 改变Vector元素数量的大小
  • resize() 函数改变当前vector的大小为size,且对新创建的元素赋值val
	vector<int> vec3(3,12);
	vec3.reserve(5);//当前vec3容器为5,元素为3 
	cout << vec3.size() << endl;
	vec3.resize(4);  //只改变容器元素的数量,不改变容器空间大小
	cout << vec3.size() << endl;
	cout << vec3.capacity() << endl; 

输出结果:
在这里插入图片描述

  • empty() 是否为空

语法:

bool empty();

  • 判断Vector是否为空(返回true时为空)
  • 如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false.例如,以下代码清空一个vector,并按照逆序显示所有的元素:
	vector<int> vec;
	vector<int> vec1(3);
	cout << vec.empty() << endl;
	cout << vec1.empty() << endl;

输出结果:
在这里插入图片描述

  • clear() 清空

语法:

void clear();

  • 清空所有元素
  • clear()函数删除当前vector中的所有元素.
	vector<int> vec(3,2);
	cout << vec.capacity() << endl;
	cout << vec.size() << endl;
	vec.clear();
	cout << vec.capacity() << endl;
	cout << vec.size() << endl;

输出结果:
在这里插入图片描述


操作

1.增

  • push_back() 尾部

语法:

void push_back( const TYPE &val );

  • 在Vector最后添加一个元素
  • push_back()添加值为val的元素到当前vector末尾
	vector<int> vec;
	for(int i=10;i<20;i++){
   
		vec.push_back(i); //在vec尾部依次加 i的 
	}
	for(int i=0;i<10;i++){
   
		cout << vec[i] << " "; 
	}

输出结果:
在这里插入图片描述

  • insert() 中间

语法:

iterator insert( iterator loc, const TYPE &val );
void insert( iterator loc, size_type num,

;