【C++/STL】2. vector向量

  • vector与常用的数组类似,占用连续内存空间,对随机存取支持很好。可以类似数组用下标访问,也可以类似字符串用vector.at()成员函数访问
  • vector是尾部开口设计,类似栈。从尾部插入数据效率最高(push_back()函数)
  • vector可以自动实现动态空间申请和释放,使用简便
  • vector定义于 vector.h,命名空间std

一、构造函数

编号构造函数解释
1vector<T>();创建一个没有任何元素的向量
2vector<T>(vector & _Right);创建一个向量,并用另一个向量_Rigth初始化它
3vector<T>(size_type nSize);创建一个大小为nSize的向量
4vector<T>(size_type nSize , const_type _Val);创建一个大小为nSize的向量,全部初始化为Val
5vector<T>(InputIterator _First , InputIterator _last)创建一个向量,并以迭代器 _First和 _last之间的元素初始化该向量
  • T可以是intfloat等类型,也可以是自定义的类
#include <iostream>
#include <vector> 
using namespace std;

int main()
{
	vector<int>::iterator v1_Iter, v2_Iter,v3_Iter,v4_Iter,v5_Iter,v6_Iter;	//定义vector迭代器
	
	//创建一个长度为3,初始值为0的向量          (构造函数3) 
	vector<int>v1(3);
	cout<<"v1=";
	for(v1_Iter=v1.begin();v1_Iter!=v1.end();v1_Iter++)
		cout<<" "<<*v1_Iter;
	cout<<endl;
	
	//创建一个长度为5,初始值为2的向量          (构造函数4) 
	vector<int>v2(5,2);
	cout<<"v2=";
	for(v2_Iter=v2.begin();v2_Iter!=v2.end();v2_Iter++)
		cout<<" "<<*v2_Iter;
	cout<<endl;
	
	//创建一个int向量,用v2初始化它	          (构造函数2) 
	vector<int>v3(v2);
	cout<<"v3=";
	for(v3_Iter=v3.begin();v3_Iter!=v3.end();v3_Iter++)
		cout<<" "<<*v3_Iter;
	cout<<endl;
	
	//创建一个int向量,用v2的部分元素初始化它	  (构造函数5) 
	vector<int>v4(v2.begin()+1,v2.begin()+3);
	cout<<"v4=";
	for(v4_Iter=v4.begin();v4_Iter!=v4.end();v4_Iter++)
		cout<<" "<<*v4_Iter;
	cout<<endl;
	
	//创建一个空int向量                        (构造函数1) 
	vector<int>v5; 
	cout<<"v5=";
	for(v5_Iter=v5.begin();v5_Iter!=v5.end();v5_Iter++)
		cout<<" "<<*v5_Iter;
	cout<<endl;
	
	return 0;
}
  • 注意vector重载了运算符=,可以用=在两个对象间复制数据

二、vector元素操作

  • 以下介绍部分vector的常用操作,不全

1、静态vector

  1. const vector<int> ivec(...); 这样的定义,是指ivec容器中所有元素都是const
const vector<int> ivec(10,10);
ivec[0] = 1;		//报错,此处返回的是一个const int 	
  1. vector<const int> ivec(...);这样的定义,会被编译器当做vector<int>处理
vector<const int> ivec2(10, 10); 	//通过
ivec2[0] = 1;					    //通过

2、读向量容器元素的操作

  • 这个表里所有pos都是size_type型变量,调用时写数字,从0开始
函数功能调用示例
reference front();返回第一个元素的引用v1.front();
const_reference front() const;返回第一个元素的常引用(const vector)v1.front();
reference back();返回最后一个元素的引用v1.back();
const_reference back() const;返回最后一个元素的常引用(const vector)v1.back();
reference opreator [] (size_type Pos);返回Pos指定位置上的元素的引用v1[Pos]
reference at(size_type Pos);返回Pos指定位置上的元素的引用v1.at(Pos);
const_reference operator [] (size_type_Pos) const;返回Pos指定位置上的元素的常引用(const vector)v1[Pos]
const_reference at(size_type Pos) const;返回Pos指定位置上的元素的常引用(const vector)v1.at(Pos);
  • 这个表里所有pos·都是iterator迭代器类型,这几个常用在for循环中遍历vcetor
函数功能调用示例
iterator begin()返回向量头指针,指向第一个元素v1.begin()
iterator end()返回向量尾指针,指向最后一个元素后面v1.end()
reverse_iterator rebegin()反向迭代器,指向最后一个元素v1.rebegin()
iterator rend()反向迭代器,指向第一个元素前面v1.rend()

3、改变数据的成员函数

  • 注意,以下都是vector对象的成员函数
  • 这个表里所有pos·都是iterator迭代器类型
函数功能调用示例
void clear()删除容器中所有元素v1.clear()
iterator erase(pos)删除容器中pos位置元素v1.erase(v.begin())
iterator erase(beg , end)删除beg到end-1间所有元素v1.erase(v1.begin()+1 , v1.begin()+5)
iterator insert(iterator pos , const T &elem)在pos位置插入一个元素elemv1.insert(v1.begin()+1 , 200);
void insert(iterator pos , int n, const T &elem)在pos位置前插入元素elem的n个拷贝v1.insert(v1.begin()+1 , 3 , 200);
void insert(iterator pos , const_iterator beg , const_iterator end)将另一vector从beg到end-1间所有元素的拷贝插入pos位置前v.insert(v.begin(),v.begin()+4,v.begin()+7);
void push_back(elem)将elem的一个拷贝插入容器末尾v1.push_back(10);
void pop_back()删除一个末尾元素v1.pop_back():
void resize(size_type num)将元素个数改为num。如果size()增加,由默认构造函数创建新元素v1.resize(10);
void resize(size_type num,elem)将元素个数改为num。如果size()增加,由默认构造函数将其初始化为elemv1.resize(10,0);
void swap (vector &)交换两个同类型向量的数据v1.swap(v2)
void assign(int n , const T &x)设置容器大小为n个元素,每个值为xv1.assign(10 0)

4、描述容器状态的函数

函数功能调用示例
size_type capacity() const;返回当前存储空间下,容器可容纳的元素数目(空间由vector自行动态申请,1/2/4/8规律递增)v1.capacity()
bool empty() const;返回容器是否为空v1.empty()
size_type size() const;返回容器中当前存储元素的数目v1.size()
size_type max_zise() const;返回可以输入容器的最大元素数目v1.max_size()

5、综合示例

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


void print(vector<int> &v)
{
	for(int i=0;i<v.size();i++)
		cout<<v[i]<<" ";
	cout<<endl;
}

int main()
{
	vector<int>::iterator v_i;
	vector<int>v;
	
	v.push_back(103);	cout<<"   当前容量:"<<v.capacity()<<endl;
	v.push_back(765);	cout<<"   当前容量:"<<v.capacity()<<endl;
	v.push_back(208);	cout<<"   当前容量:"<<v.capacity()<<endl;
	v.push_back(435);	cout<<"   当前容量:"<<v.capacity()<<endl;
	

	cout<<endl;
	cout<<"利用迭代器打印:"; 
	for(v_i=v.begin();v_i!=v.end();v_i++)
		cout<<*v_i<<" ";		//迭代器可以看作指针 
	cout<<endl;
	
	cout<<"利用at打印:";
	for(int i=0;i<v.size();i++)
	{
		int &nValue=v.at(i);	//注意at返回一个引用 
		cout<<nValue<<" ";			
	} 
	
	cout<<endl; 
	
	cout<<"利用下标打印:";
	for(int i=0;i<v.size();i++)
		cout<<v[i]<<" ";
	cout<<endl<<endl; 
	
	cout<<"在第一位插入100:";
	v.insert(v.begin(),100);
	print(v);
	cout<<"   当前容量:"<<v.capacity()<<endl<<endl;
	
	cout<<"在第二位插入3个200:";
	v.insert(v.begin()+1,3,200);
	print(v);
	cout<<"   当前容量:"<<v.capacity()<<endl<<endl;
	
	cout<<"在第一位插入第五到八位:";
	v.insert(v.begin(),v.begin()+4,v.begin()+7);
	print(v);
	cout<<"   当前容量:"<<v.capacity()<<endl<<endl;
	
	cout<<"删除第一个元素:";
	v.erase(v.begin());
	print(v);	
	
	cout<<endl<<"pop一个元尾部素:"<<v.back()<<endl;
	v.pop_back(); 
	print(v);
	
	cout<<endl<<"清空元素:";
	v.clear();
	print(v);
	cout<<"   当前容量:"<<v.capacity()<<endl<<endl;

	cout<<endl<<"assign整体赋值:";
	v.assign(10,0);
	print(v); 
	cout<<"   当前容量:"<<v.capacity()<<endl<<endl;
	
	return 0;
}

三、C++11中vector新特性

  • dev-C++使用C++11特性,需要
    工具 -> 编译选项 -> 编译时加入以下命令(打钩)-> 写 “-std=c++11”

在这里插入图片描述

1、使用列表{}对vector进行初始化赋值

vector<int>v1={1,2,3};
vector v2{1,2,3}

2、利用for遍历元素并进行简单操作

  1. 引用传递并进行运算
for(auto &i : v1) i*=i;			//遍历元素并进行乘方
  1. 值传递并进行操作
for(auto i : v1) cout<<i<<endl;	//遍历元素并输出 

3. 示例

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

#define print(V)	for(auto i:V) {cout<<i<<" ";} cout<<endl;	//使用新特性遍历 & 打印元素 
 

int main()
{
	//使用新特性初始化vector向量 
	vector<int>v1={1,2,3,4};
	print(v1); 
	
	//使用新特性初始化vector向量 
	vector<int>v2{4,3,2,1};
	print(v2); 
	
	//遍历v1做乘方
	for(auto &i : v1) i*=i;	 
	print(v1); 

	return 0; 
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值