首页 > 编程语言 >【C++/STL】2. vector向量

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

时间:2022-11-22 10:38:32浏览次数:44  
标签:begin const cout STL C++ v1 vector Iter


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

文章目录

  • ​​一、构造函数​​
  • ​​二、vector元素操作​​
  • ​​1、静态vector​​
  • ​​2、读向量容器元素的操作​​
  • ​​3、改变数据的成员函数​​
  • ​​4、描述容器状态的函数​​
  • ​​5、综合示例​​
  • ​​三、C++11中vector新特性​​
  • ​​1、使用列表{}对vector进行初始化赋值​​
  • ​​2、利用for遍历元素并进行简单操作​​
  • ​​3. 示例​​

一、构造函数

编号

构造函数

解释

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可以是​​int​​​、​​float​​等类型,也可以是自定义的类
#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”

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

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;
}


标签:begin,const,cout,STL,C++,v1,vector,Iter
From: https://blog.51cto.com/u_15887260/5876697

相关文章

  • C/C++中拆分long/float/double等数据并重新组合的方法
    在嵌入式编程时,常常会遇到需要做数据通信的场景。单片机往往只支持一次8位的数据传递,为了传输较长的数据类型,只能先在主机将数据拆分,再在从机重新组合,这里介绍一些实用的数......
  • 【C++】使用boost库的split函数分割字符串
    1#include<iostream>2#include<vector>3#include<boost/algorithm/string.hpp>45intmain(constintargc,constchar*argv[])6{7std::vect......
  • C++快速幂
    C++快速幂快速幂的作用:当我们做一些高次幂的计算时,就不能直接进行暴力的计算。例如:需要计算2^n并且n≤10^18。这时候如果我们直接进行暴力的计算,时间复杂度为O(n),那......
  • [C++学习笔记-IO控制_2]:控制台IO-cin 输入
    目录控制台I/O:cin输入1.重载的>>运算符2.cin的特点3.其他输入方法3.1单字符输入:get()3.2字符串输入:get()/getline()3.3其他的输入函数控制台I/O:cin输......
  • C/C++数据结构题目(2022)
    C/C++数据结构题目(2022)1、菜鸟智慧系统(线性表)[问题描述]使用双向链表模拟快递驿站的系统运作:假设快递驿站的货架分小、中、大3种类型,容量分别为500、100、50个包裹;......
  • C/C++员工通讯录(链表实现)
    C/C++员工通讯录(链表实现)一、设计一个员工通讯录(如编号、身份证号码、姓名等),用单链表实现员工通讯录的存储和增删改查等操作。通讯录链表的建立;通讯者信息的插入;通讯......
  • C/C++校运动会成绩管理系统
    C/C++校运动会成绩管理系统该系统可以记录校运动会全部运动项目的成绩、得分和排名情况,系统功能项以菜单形式显示。项目包括50米、100米、200米、400米、1500米、各接力项......
  • C/C++文件压缩与解压(哈夫曼编码)
    C/C++文件压缩与解压(哈夫曼编码)实验四:文件压缩与解压一、实验目的:掌握哈夫曼编码和解码二、实验内容:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降......
  • C/C++仓库管理系统
    C/C++仓库管理系统四、仓库管理系统问题描述:1.问题描述:已知一工厂有5个仓库(仓库编号、仓库规格),用于保存公司生产的10类产品(产品编号、产品名称、产品规格),任何--......
  • c++命令行传参
    intmain(intargc,char**argv)argc:命令行参数个数(ArgumentCount)argv:命令行参数向量(ArgumentVector)argv是一个字符串数组,双指针代表指向首个字符串的地址和......