C++中的vector容器(保姆级讲解)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 目录一、vector基本概念功能vevtor与普通数组的区别:动态拓展:二、vector构造函数功能描述 函数原型三、Vector赋值操作功能描述函数原型四、Vector容量和大小功能描述:函数原型 五、vector插入和删除功能描述函数原型六、vector数据存取功能描述函数原型 七、vector互换容器功能描述函数原型 八、预留空间功能描述函数原型

目录


一、vector基本概念


功能


vevtor与普通数组的区别:


动态拓展:


二、vector构造函数


功能描述


函数原型


三、Vector赋值操作


功能描述


函数原型


四、Vector容量和大小


功能描述:


函数原型


五、vector插入和删除


功能描述


函数原型


六、vector数据存取


功能描述


函数原型


七、vector互换容器


功能描述


函数原型


八、预留空间


功能描述


函数原型


一、vector基本概念

功能

vector数据结构和数组非常相似,也称单端数组


vevtor与普通数组的区别:

不同之处是于数组是静态空间,而vector是动态拓展、


动态拓展:

并不是在原有空间之后续集新的空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间

image.png

这个容器前端是封闭的,通常不会在前端进行操作,可以在尾部通过push_back()插入数据,通过pop_back()


front()代表第一个元素                                                    v.begin()代表第一个元素的位置

v.end()    代表最后一个元素的下一个位置                        v.rbegin()代表最后一个元素的位置

back()代表最后一个元素                                    v.rend()代表第一个元素的前一个位置


二、vector构造函数

功能描述

创建vector容器


函数原型

 vector<T> v;                   // 采用模板实现类实现,默认构造函数。
 vector(v.begin() ,v.end());    //将v[begin(),end())区间的元素拷贝本身(前闭后开)
 vector(n,elem);                //构造函数将n个elem拷贝给本身。
 vector(const vector &vec)      //拷贝构造函数。

例子演示

#include <bits/stdc++.h>
using namespace std;
void printVector(vector<int>&v)
{
  for(vector<int>::iterator it = v.begin(); it != v.end();it ++)
  {
    cout << *it << " ";
  }
  cout<<endl;
}
//vector容器构造 
void test01()
{
  vector<int>v1;   //构造函数  无参构造
  for(int i = 0;i < 10 ;i++) 
  {
    v1.push_back(i);
  }
  printVector(v1);
  //通过区间方式构造
  vector<int>v2(v1.begin(),v1.end());
  printVector(v2); 
  //n个elem方式构造 
  vector<int> v3(10,100);     //表示10个100 
  printVector(v3) ;
  //拷贝构造
  vector<int>v4(v3);
  printVector(v4); 
}
int main()
{
  test01();
} 

结果

image.png

三、Vector赋值操作


功能描述

给vector容器赋值


函数原型

vector& operator = (const vector &vec);                   //重载等号操作符

assign(beg,end);                                                    //将[beg,end)区间的数据拷贝赋值给本身

assign(n,elem);                                                      //将n个elem拷贝赋值给本身


例子演示

#include <iostream>
using namespace std;
#include <vector>
void printVector(vector<int>& v)
{
  for(vector<int>::iterator it = v.begin(); it != v.end();it ++)
  {
    cout<<*it<<" ";
  }
  cout << endl;
}
 //vector赋值
 void test01() 
{
  vector<int>v1;
  for(int i = 0;i < 10;i ++)
  {
    v1.push_back(i);
  }
  printVector(v1);
    //赋值 operator =
  vector<int> v2;
  v2 = v1;
  printVector(v2); 
  //assign
  vector<int> v3;
  v3.assign(v1.begin(),v1.end());
  printVector(v3); 
  //assign
  vector<int> v4;
  v4.assign(10,100);
  printVector(v4); 
}
int main()
{
  test01();
}

四、Vector容量和大小


功能描述:

对vector容器的容量和大小操作


函数原型

empty();                      //判断容器是否为空
capacity();                   //容器的容量
size();                       //返回容器中元素的个数
resize(int num);              //重新指定容器的长度为num,若容器变长,则以默认值填充新位置
                              //如果容器变短,则末尾超出容器的长度被删除
resize(int num,elem)         //重新指定容器的长度为num,若容器变长,则以elem填充新位置
                              //如果容器变短,则末尾超出容器的长度被删除

例子演示

#include <iostream>
using namespace std;
#include <vector>
void printVector(vector<int>&v)
{
  for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
  {
    cout<< *it << " ";
  }
  cout<< endl;
}
//vector 容器的容量和大小操作
void test01()
{
   vector<int>v1;
   for(int i = 0; i < 10;i ++){
    v1.push_back(i);
   }
   printVector(v1);
   if(v1.empty())  //为真 代表容器为空
   {
       cout<< "v1为空"<<endl; 
   } 
   else{
    cout<<"v1不为空"<<endl;
  cout<<"v1的容量为:"<< v1.capacity() << endl;
  cout<<"v1的大小为:"<< v1.size() << endl;
   }
   //重新指定大小
   v1.resize(15,100);           //利用重载版本,可以指定默认填充值,参数2 
   printVector(v1);             //如果重新指定的过长,用0填充 
   v1.resize(5);
   printVector(v1);             //如果重新指定的比原来短了,超出部分会删除掉 
} 
int main()
{
  test01(); 
} 

结果

image.png

五、vector插入和删除


功能描述

对vector容器进行插入,删除操做


函数原型

push_back(ele);                          //尾部插入ele
pop_back();                              //删除最后一个元素
insert(const_iterator pos,ele);           //迭代器指向pos插入元素ele
insert(const_iterator pos,int count,ele);  //迭代器指向位置pos插入count个元素ele
erase(const_iterator pos);                 //删除迭代器指向的元素
erase(const_iterator start,const _iterator end());  //删除迭代器从start到end之间的元素
clear();                                   //删除容器中所有元素

例子演示

#include <iostream>
using namespace std;
#include <vector>
void printVector(vector<int>&v)
{
  for(vector<int>::iterator it = v.begin();it!=v.end();it++)
  {
    cout <<*it <<" ";
  }
} 
void test01()
{
  vector<int>v1;  
  //尾插法
  v1.push_back(10);
  v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    //遍历
  printVector(v1);
  //尾删
  v1.pop_back();
  printVector(v1);
  //插入  第一个参数是迭代器 
  v1.insert(v1.begin(),100);  //在前面插入一个100 
  printVector(v1); 
  v1.insert(v1.begin,2,1000) //在前面插俩个1000 
    //删除
  v1.erase(v1.begin());
  printVector(v1); 
  v1.erase(v1.begin(),v1.end()); //从头到尾全部删除 
  //清空
  v1.clear(); 
}
int main()
{
  test01(); 
}

六、vector数据存取


功能描述

对vector中的数据存取操作


函数原型

at(int  idx);                //返回idx所指的数据

operator[ ]                   //返回idx所指的数据

front();                        //返回容器中第一数据元素

back();                       //返回容器中最后一个数据元素位置


代码示例

#include <iostream>
using namespace std;
#include <vector>
void printVector(vector<int>&v)
{
  for(vector<int>::iterator it = v.begin();it!=v.end();it++)
  {
    cout <<*it <<" ";
  }
} 
void test01()
{
  vector<int>v1;
  for(int i = 0;i < 10;i++)
  {
    v1.push_back(i);
  }
  //利用[]方式访问数组中元素 
  for(int i = 0;i < v1.size();i++)
  {
    cout<< v1[i] << " ";
  }
  cout<<endl;
  //利用at方式访问
  for(int i = 0;i < 10; i++)
  {
    cout<<v1.at(i)<<" ";
  } 
  cout<<endl;
  //获取第一个元素
  cout<<"第一个元素为:"<< v1.front() <<endl;
  //获取最后一个元素
  cout<<"最后一个元素为:"<<v1.back()<<endl; 
}
int main()
{
  test01();
 } 

七、vector互换容器


功能描述

实现俩个容器内元素互换


函数原型

swap(vec);  //将vec与本身的元素互换


代码示例

#include <iostream>
using namespace std;
#include <vector>
void printVector(vector<int>&v)
{
  for(vector<int>::iterator it = v.begin();it!=v.end();it++)
  {
    cout <<*it <<" ";
  }
  cout<<endl;
} 
void test01()
{
  vector<int>v1;
  for(int i = 0;i < 10;i++)
  {
    v1.push_back(i);
  }
  cout<<"交换前:"<<endl; 
  printVector(v1);
  vector<int>v2;
  for(int i =10;i >0 ;i--)
  {
    v2.push_back(i);
  }
  printVector(v2);
    cout<<"交换后:"<<endl;
  v1.swap(v2);
  printVector(v1);
  printVector(v2); 
}
//实际用途
//巧用swap可以收缩内存空间
void test02()
{
  vector<int>v;
  for(int i = 0;i < 100000 ;i++)
  {
    v.push_back(i);
  }
  cout<< "v的容量为:"<< v.capacity() <<endl;     //capacity指容器的容量
  cout<< "v的大小为:"<< v.size()<<endl;
  v.resize(3); // 重新指定大小
  cout<< "v的容量为:"<< v.capacity() <<endl;  
  cout<< "v的大小为:"<< v.size()<<endl;
  //巧用 swsp收缩内存空间
  vector<int>(v).swap(v);
  cout<< "v的容量为:"<< v.capacity() <<endl;  
  cout<< "v的大小为:"<< v.size()<<endl;
 } 
int main()
{
  test01();
  test02();
} 

结果

image.png

八、预留空间


功能描述

减少vector在动态拓展容量时的拓展次数


函数原型

reserve(int len);       /容器预留len个元素长度,预留位置不初始化,元素不可访问


代码示例

#include <iostream>
using namespace std;
#include <vector>
void test01()
{
  vector<int>v;
  v.reserve(100000); 
  int num = 0;
  int *p = NULL;
  for(int i = 0;i < 100000;i++)
  {
    v.push_back(i);
    if(p != &v[0]){
      p =&v[0];
      num++;
    }
  }
  cout<<"num = " << num << endl;
}
int main()
{
  test01();
} 
相关文章
|
2月前
|
存储 编译器 C++
【C++】vector介绍+模拟实现
【C++】vector介绍+模拟实现
|
2月前
|
存储 C++ 容器
如何将没有复制或移动构造函数的对象放入vector容器
如何将没有复制或移动构造函数的对象放入vector容器
34 0
|
2月前
|
C++ 容器
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
【C++航海王:追寻罗杰的编程之路】关联式容器的底层结构——AVL树
27 5
|
2月前
|
算法 编译器 Linux
【C++】vector的模拟实现
【C++】vector的模拟实现
|
2月前
|
存储 算法 C语言
【C++】vector的认识与使用
【C++】vector的认识与使用
|
2月前
|
存储 C++ 索引
|
2月前
|
存储 算法 C++
【C++】vector介绍以及模拟实现(超级详细)
【C++】vector介绍以及模拟实现(超级详细)
47 4
|
2月前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
60 0
|
3月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
46 5
|
2月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
下一篇
无影云桌面