IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++的助手---STL中的vector容器 -> 正文阅读

[C++知识库]c++的助手---STL中的vector容器

? ? ? 各种不同的编程语言各有千秋,c++中的STL(Standard Template Library,标准模板库)就是其区于其他语言的一大优势。它分为算法,容器,迭代器三类。标准库都指出了是库,那里面肯定就存有东西,标准库中有很多有利于程序员的代码库,就是已经写好的存在里面,咱可以直接使用,并且它支持跨平台。我们可以利用它写出高效且简洁的代码。说白了它就是我们写代码的一个工具,很好用的工具。(本文说一下用的特多的vector容器,其他的会后续发文讲述)

? ? ? c中我们学习了数组,数组中可以存取对应的数据类型的元素。但是它的容量是固定的,不可以中途修改,并且一些操作起来也相对比较麻烦费时费力(例如:删除中间元素啊,向中间插入元素啊等等)。再看看c++中vector容器,首先数组可操作的vector全部可以实现,并且可以改变大小,所以学习后使用vector容器比起使用数组是一个更好的选择。

vector作为类模板容器,怎么对其进行创建和初始化呢?

创建形式:vector<类型> 对象名;(数据类型可以是string,int,float型也可以是vector自身,容器内存放自己,对象名自拟)

初始化vector对象:

vector<T> temp1; //创建一个类型为T,名为temp1的对象
vector<T> temp2(temp1) //用temp1进行拷贝,就是拿temp1内的元素进行初始化
vector<T> temp3(n) //定义一个容量为n,名为temp3的对象,例:vector<int> v(10);
vector<T> temp4(n,i) //定义一个容量为n,并用i进行成员初始化的名为temp4的对象 例:vector<int> v(10,1);
vector<T> temp5 = {a,b,c}; //定义一个函数类型成员a,b,c名为temp5的对象;
/*i要和类型T相符合,拷贝的temp1也要和temp2类型相符合,否则报错.如何定义了容量却没进行初始化,标准库会自动初始化,就想是类里面的构造函数就懂了*/

怎么实现二维呢?

vector<vector<T>> temp; //创建了一个类型为vector<T>,名为temp的对象
/*就是说这个对象成员就是一个新的vector对象,把它当成和其他类型一致就行,进行初始化*/
//例:
vector<vector<int>> temp1(n);//就是表示里面有n个vector<int>对象成员,也就相当于二维数组中的n行
vector<vector<int>> temp2(n,vector<int>(m));/*就相当于表示二维数组中的n行m列,其实和一维定义是一致的*/

注:当vector对象没有设置容量时,不得出现数组样访问元素的形式(对象名[i]),这会导致报错null pointer。没有成员怎么访问呢对吧,这点和数组还是有区别的数组是定义即固定容量,vector可以说是一个动态数组,在这里有所不同。当然没有定义容量也是可以插入元素的,插入后会自动定义容量,插入后就可以以那种形式访问了。

下面给出错误案例和正确写法:

//错误代码
vector<int> v;
for(int i=0;i<10;++i)
v[i] = i;
//里面没有元素不能直接索引


//正确形式1:
vector<int> v;
for(int i=0;i<10;++i)
v.push_back(i);

//正确形式2:
vector<int> v(10);
for(int i=0;i<10;++i)
v[i] = i;
/*当然这种形式当i+1大于容量10后,就会报错了,所以还是上面那种更安全,但下面这种当输入数据时也会有所方便*/

vector容器中常用方法

  • push_back()? ? ? //向容器内输入元素,从序列末尾插入一个意思
  • pop_back()? ? ? //向容器内删除元素,从序列末尾删除一个意思
  • front()? ? ? //对容器内首个元素进行引用
  • back()? ? ? //对容器内最后一个元素进行引用
  • insert()? ? ? //向容器内某位置或者某段位置插入元素
  • erase()? ? ? //向容器内某位置或者某段位置删除元素
  • clear()? ? ? //清空容器内元素
  • size()? ? ? //容器内元素序列的长度
  • rsize()? ? ? //重新定义容器内元素序列的长度
  • empty()? ? ? //判断容器是否为空
  • begin()? ? ? //指向容器对象头部的迭代器
  • end()? ? ? //指向容器末尾后的迭代器

(这些是个人平时觉得常会用到的,当然vector容器内方法不止这些,如果想要了解更多可翻阅书籍)

掌握初始化后就可以学习方法应用了,看代码学习吧:

push_back(), pop_back(), front(), back(), size():

?insert(), erase();

insert()有三种插入形式:

  1. vector_name.insert(position, val);//position参数表示的是插入的位置的迭代器,val是插入的值
  2. vector_name.insert(position, size, val);//size是指要插入val这个数据的次数
  3. vector_name.insert(position, iterator1, iterator2);//这种一般是将另一个对象中的一段序列值插入到其中,因为迭代器是对容器对象的引用嘛,这里iterator1和iterator2是指要插入的另一个对象的迭代器插入头部与尾部的后一个

erase()有两种删除形式:

  1. vector_name.erase(position); //position参数表示要删除的位置的迭代器
  2. vector_name.erase(startposition,endposition); //startposition表示要删除的初始位置,endposition表示要删除序列的末位置的后一个
#include<bits/stdc++.h>
using namespace std;

int main(){
	vector<int> nums = {10,8,11,7}; //创建一个vector对象,初始化序列为10,8,11,7,序列长度为4; 
	cout<<"size of nums "<<nums.size()<<endl;
	
	//我们向10与8之间插一个数  vector_name.insert(position, val);
	int val1 = 5;  //输入要插入的数 
	//cin>>val;  
	nums.insert(nums.begin()+1,val1); //要插入的位置就是第二位所以begin()+1就行
	cout<<"size of nums now "<<nums.size()<<endl;
	//输出插入后的序列 
	for(int x:nums) //新序列10,5,8,11,7 
	cout<<x<<" ";
	
	//我们在新序列的基础上在第三个元素位置上插入两个3  vector_name.insert(position, size, val);
	int val2 = 3;
	nums.insert(nums.begin()+2,2,val2);
	cout<<"\nsize of nums now "<<nums.size()<<endl;
	//输出插入后的序列 
	for(int x:nums) //新序列10,5,3,3,8,11,7 
	cout<<x<<" ";
	
	vector<int> nums1 = {5,4,6};
	//将对象nums中的第三个元素到倒数第二个元素之间的序列插入到nums1对象的第二个位置 vector_name.insert(position,iterator1,iterator2);
	nums1.insert(nums1.begin()+1,nums.begin()+2,nums.end()-1); 
	cout<<"\nsize of nums now "<<nums1.size()<<endl;
	//输出nums1插入后的序列 
	for(int x:nums1) //新序列5,3,3,8,11,4,6
	cout<<x<<" ";
	
	//删除nums1对象中的第二个元素 vector_name.erase(position);
	nums1.erase(nums1.begin()+1); 
	cout<<"\nsize of nums now "<<nums1.size()<<endl;
	//输出nums1删除后的序列 
	for(int x:nums1) //新序列5,3,8,11,4,6
	cout<<x<<" ";
	
	//删除nums1新序列第三个到倒数第二的元素序列 vector_name.erase(startposition,endposition);
	nums1.erase(nums1.begin()+2,nums1.end()-2);
	cout<<"\nsize of nums now "<<nums1.size()<<endl;
	//输出nums1删除后的序列 
	for(int x:nums1) //新序列5,3,4,6
	cout<<x<<" ";
	return 0;
}

?

rsize(), empty():

vector<int> nums = {5,4,7,9};
cout<<"size of nums "<<nums.size()<<endl; //输出是size of nums 4

//此时如果想重新定义nums对象的长度序列
nums.rsize(3); //此时序列9就木得了,nums.size()就等于3了

nums.rsize(5); //此时就存在nums[4]了,vector库会对其初始化为0

/*empty()很好理解,如果容器为空就返回true(1),如果不为空就返回false(0)*/
//如果容器不为空就返回头元素
if(nums.empty()!=true)
return nums.front();

clear()就是清空容器,删除容器内的所有元素,如果初始化了容量的话,使用后就是使里面元素全部为0或null。使用格式就是 vector_name.clear();

学会用它了,你还会喜欢用数组吗?这个可有优势多了不是吗~

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:45:50  更:2022-08-19 18:46:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 13:48:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码