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

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

一、构造函数

编号 构造函数 解释
1 vector<T>(); 创建一个没有任何元素的向量
2 vector<T>(vector & _Right); 创建一个向量,并用另一个向量_Rigth初始化它
3 vector<T>(size_type nSize); 创建一个大小为nSize的向量
4 vector<T>(size_type nSize , const_type _Val); 创建一个大小为nSize的向量,全部初始化为Val
5 vector<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位置插入一个元素elem v1.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()增加,由默认构造函数将其初始化为elem v1.resize(10,0);
void swap (vector &) 交换两个同类型向量的数据 v1.swap(v2)
void assign(int n , const T &x) 设置容器大小为n个元素,每个值为x v1.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; 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章