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, const TYPE &val );
void insert( iterator loc, input_iterator start, input_iterator end );

  • 插入元素到Vector中

  • insert() 函数有以下三种用法:

    • 在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,
    • 在指定位置loc前插入num个值为val的元素
    • 在指定位置loc前插入区间[start, end)的所有元素 .
vector<int> vec1(3,1);
	vector<int> vec2(5,2); 
	for ( int i=0;i<vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout << endl;
	
	vec1.insert(vec1.begin(),7);//将vec1的第一个改为7 
	for ( int i=0;i<vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout << endl;
	
	vec1.insert(vec1.begin()+1,3,6);//在第二个位置加入3个6 
	for ( int i=0;i<vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout<< endl;
	
	vec1.insert(vec1.begin()+2,vec2.begin(),vec2.begin()+2);
	//在vec1的第三个位置加入vec2的第1到第2个 
	for(int i=0;i< vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout<< endl;

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

2.删

  • pop_back()

语法:

void pop_back();

  • 移除最后一个元素
  • pop_back()函数删除当前vector最末的一个元素
	vector<char> vec;
	for(int i=0;i<10;i++){
		vec.push_back( i + 65);
	}
	for(int i=0;i<10;i++){
		vec.pop_back();//删除vec尾部最后一个元素 
		for(int i=0;i<vec.size();i++)
		cout << vec[i];
		cout << endl;
	}
	//或者用迭代器 	
//	int size = vec.size();
//	vector<char>::iterator theIterator;
//	for( int i=0; i < vec.size(); i++ ) {
//  		vec.pop_back();
//  	for( theIterator = vec.begin(); theIterator != vec.end(); theIterator++ )
//      	cout << *theIterator;
//  		cout << endl;
//	}

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

  • erase()

语法:

iterator erase( iterator loc );
iterator erase( iterator start, iterator end );

  • 删除指定元素
  • erase函数要么删作指定位置loc的元素,要么删除区间[start, end)的所有元素. 返回值是指向删除的最后一个元素的下一位置的迭代器
	vector<char> vec1; 
	for(int i=0;i<10;i++){
		vec1.push_back(i+65);
	}
	int size1=vec1.size();
	for(int i=0;i<size1;i++){
		vec1.erase(vec1.begin());  //删除vec1的首个元素
		for(int i=0;i<vec1.size();i++)
			cout << vec1[i];
			cout << endl;
	}
//	或者用迭代器 	
//	vector<char>::iterator startIterator;
//	vector<char>::iterator tempIterator;
//	for( int i=0; i < size1; i++ ){
//		startIterator = vec1.begin();
//		vec1.erase(startIterator);
//		for( tempIterator = vec1.begin(); tempIterator != vec1.end(); tempIterator++ )
//  			cout << *tempIterator;
//   		cout << endl;
//
//	}

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

3.改

修改元素,可以用insert()函数,在前面有提到

  • assign()

语法:

void assign( input_iterator start, input_iterator end );
void assign( size_type num, const TYPE &val );

  • 对Vector中的元素赋值
  • assign() 函数要么将区间[start, end)的元素赋到当前vector,或者赋num个值为val的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.
vector<int> vec;
	vector<int> vec1(5,1);
	vec.assign(vec1.begin(),vec1.begin()+3);
	//将vec1的第一个到第三个赋值给vec 
	
	for( int i=0;i<vec.size();i++){
		cout << vec[i] << " ";
	}
	cout << endl;
	
	vec1.assign(3,6);
	//将三个6赋值给vec1,并将之前vec1的内容清除 
	for( int i=0;i<vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout << endl;

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

4.查

1.返回Vector首个元素

  • begin()

语法:

iterator begin();

  • begin()函数返回一个指向当前vector起始元素的迭代器.
  • front()

语法:

TYPE front();

  • front()函数返回当前vector起始元素的引用

2.返回Vector最后一个元素

  • end()

语法:

iterator end();

  • end() 函数返回一个指向当前vector末尾元素的下一位置的迭代器.
  • back()

语法:

TYPE back();

  • back() 函数返回当前vector最末一个元素的引用

3.返回指定位置

  • at()

语法:

TYPE at( size_type loc );

  • at() 函数 返回当前Vector指定位置loc的元素的引用. at() 函数 比 [] 运算符更加安全, 因为它不会让你去访问到Vector内越界的元素.
	vector<int> v( 5, 1 );
	for( int i = 0; i < 10; i++ ) {
  	cout << "Element " << i << " is " << v[i] << endl;
	}

因为v中只有五个元素均为1,而循环中到10,显然越界,会造成不可预知的事情发生,
如图:
在这里插入图片描述
若用at(),代码将更加安全:

vector<int> v( 5, 1 );
	for( int i = 0; i < 10; i++ ) {
  		cout << "Element " << i << " is " << v.at(i) << endl;
	}

取代试图访问内存里非法值的作法,at() 函数能够辨别出访问是否越界并在越界的时候抛出一个异常.
在这里插入图片描述
4.返回全部内容

  • 可以使用循环操作 ①.下标运算 ②.迭代器 (不做具体代码解释)
  • for_each()

void fun(int i)
{
      cout << i << endl;
 }

void VecChange()
{
	vector<int> vec;
    for(int i=0 ;i<10 ;i++)
    {
       vec.push_back(i);
     }  
	 for_each(vec.begin(), vec.end(), fun);   
	 //for_each()使用需加#include<algorithm>头文件
}

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


其他函数和运算符重载

Operators
语法:

v1 == v2
v1 != v2
v1 <= v2
v1 >= v2
v1 < v2
v1 > v2
v[]

两个vectors被认为是相等的,如果:

1.它们具有相同的容量
2.所有相同位置的元素相等.

vectors之间大小的比较是按照词典规则.

  • swap()

语法:

void swap( vector &from );

  • 交换两个Vector
  • swap()函数交换当前vector与vector from的元素
	vector<int> vec(3,1);
	vector<int> vec1(3,6);
	vec.swap(vec1); //将vec与vec1内容交换

扩展算法

需要的头文件:#include < algorithm>
遍历:for_each

  • 排序:

    sort()

void STLSuan( )
{
    vecor<int> vec;
    vec.push_back(2);
    vec.push_back(1);
    vec.push_back(4);
    vec.push_back(3);
    sort(vec.begin()+1 , vec.end());  //第二个到最后一个进行从小到大排序
    sort( vec.begin()+1 , vec.end() , greate<int>() );      
    //从大到小排序,用greater需要加头文件#include<functional>
}



以上所用到的代码整体如下:

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

void VecDefine()
{
	
	vector<int> vec;  //定义int型数组 
	vector<string> vec1;//定义string型数组 
	
//	struct STU{
//		int age;
//		int y;
//	};
//	vector<struct STU> vec2;   //定义结构型数组 
	
	
}

//构造函数 
void VecConstructor()
{
	vector<int> vec;   // 空的vector 不能输出 
	vector<int> vec1(3);//三个元素均为 0 
	vector<int> vec2(3,12);//三个元素均为12

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

	for(int i=0;i<3;i++){
		cout << vec1[i] << " ";
	} 
	cout << endl;
	for(int i=0;i<3;i++){
		cout << vec2[i] << " ";
	}
	cout << endl;
	for(int i=0;i<3;i++){
		cout << vec3[i] << " ";
	}
	cout << endl;
	
	
	//用迭代器初始化 
	vector<int>::iterator ite = vec2.begin();//指向vec的头 
	vector<int>::iterator ite1 = vec2.end(); //指向vec的尾 
	vector<int> vec4(ite, ite1);

	for(int i=0;i<3;i++){
		cout << vec4[i] << " ";
	}
	cout << endl; 
}

//属性
void VecCapacity()
{
	vector<int> vec;
	cout << vec.capacity() << endl;
	
	vector<int> vec1(3);
	cout << vec1.capacity() << endl;
	
	vec1.push_back(1);   //在vector尾部加一个元素 
	cout << vec1.capacity() << endl;
	
	vector<int> vec2(3);
	cout << vec2.capacity() << endl;
	vec2.reserve(10);
	cout << vec2.capacity()	<< endl;
	
	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;
	
	
	cout << vec.empty() << endl;
	cout << vec1.empty() << endl; 
	
	vector<int> vec4(3,2);
	cout << vec4.capacity() << endl;
	cout << vec4.size() << endl;
	vec4.clear();
	cout << vec4.capacity() << endl;
	cout << vec4.size() << endl;
}


//操作
void VecDo()
{
	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] << " "; 
	}
	
	vector<int>::iterator ite = vec.begin();
	for(ite; ite != vec.end(); ite++){
		cout << *ite << endl;
	}  //用迭代器输出 
		
 } 
 
//增
void VecAdd()
{
	
	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] << " "; 
	}
	cout << endl;
	
	vector<int> vec1(3,1);
	vector<int> vec2(5,2); 
	for ( int i=0;i<vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout << endl;
	
	vec1.insert(vec1.begin(),7);//将vec1的第一个改为7 
	for ( int i=0;i<vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout << endl;
	
	vec1.insert(vec1.begin()+1,3,6);//在第二个位置加入3个6 
	for ( int i=0;i<vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout<< endl;
	
	vec1.insert(vec1.begin()+2,vec2.begin(),vec2.begin()+2);
	//在vec1的第三个位置加入vec2的第1到第2个 
	for(int i=0;i< vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout<< endl;
} 

//删
void VecDel()
{
	
	vector<char> vec;
	for(int i=0;i<10;i++){
		vec.push_back( i + 65); 
	}
	for(int i=0;i<10;i++){
		vec.pop_back();	//删除vec尾部最后一个元素
		for(int i=0;i<vec.size();i++)
		cout << vec[i];
		cout << endl;
	}
	//或者用迭代器 	
//	int size = vec.size();
//	vector<char>::iterator theIterator;
//	for( int i=0; i < vec.size(); i++ ) {
//  		vec.pop_back();
//  	for( theIterator = vec.begin(); theIterator != vec.end(); theIterator++ )
//      	cout << *theIterator;
//  		cout << endl;
//	}

///----------------------------------
	vector<char> vec1; 
	for(int i=0;i<10;i++){
		vec1.push_back(i+65);
	}
	int size1=vec1.size();
	for(int i=0;i<size1;i++){
		vec1.erase(vec1.begin());
		for(int i=0;i<vec1.size();i++)
			cout << vec1[i];
			cout << endl;
	}
//	或者用迭代器 	
//	vector<char>::iterator startIterator;
//	vector<char>::iterator tempIterator;
//	for( int i=0; i < size1; i++ ){
//		startIterator = vec1.begin();
//		vec1.erase(startIterator);
//		for( tempIterator = vec1.begin(); tempIterator != vec1.end(); tempIterator++ )
//  			cout << *tempIterator;
//   		cout << endl;
//
//	}
 } 

//改
void VecChange()
{
	vector<int> vec;
	vector<int> vec1(5,1);
	vec.assign(vec1.begin(),vec1.begin()+3);
	//将vec1的第一个到第三个赋值给vec 
	
	for( int i=0;i<vec.size();i++){
		cout << vec[i] << " ";
	}
	cout << endl;
	
	vec1.assign(3,6);
	//将三个6赋值给vec1,并将之前vec1的内容清除 
	for( int i=0;i<vec1.size();i++){
		cout << vec1[i] << " ";
	}
	cout << endl;
	
	
	vec.swap(vec1); 
}

//查
void fun(int i)
{
      cout << i << endl;
 }
void VecFind()
{
//	vector<int> v( 5, 1 );
//	for( int i = 0; i < 10; i++ ) {
//  	cout << "Element " << i << " is " << v[i] << endl;
//	}
//	vector<int> v( 5, 1 );
//	for( int i = 0; i < 10; i++ ) {
//  		cout << "Element " << i << " is " << v.at(i) << endl;
//	}
	
	vector<int> vec;
    for(int i=0 ;i<10 ;i++)
    {
       vec.push_back(i);
     }  
	 for_each(vec.begin(), vec.end(), fun);   
	 //for_each()使用需加#include<algorithm>头文件
 } 

int main()
{
	//VecDefine();
	//VecConstructor();
	//VecCapacity();
	//VecDo();
	//VecAdd();
	//VecDel();
	//VecChange();
	//VecFind();
	
	system("pause");
	return 0;
} 
发布了16 篇原创文章 · 获赞 75 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/diviner_s/article/details/104201513