C++语言vector容器介绍和示例
之前我们在声明数组的时候,采用的是datatype array[len]的形式,数组在分配之后,不能调整大小,删除和插入数据时操作十分的繁琐,虽然可以采用链表,但是链表的操作更麻烦,我喜欢简单的方法。
与string类一样, 向量vector 同属于STL(Standard Template Library, 标准模板库)中的自定义的类, vector是一个封装了动态数组的顺序容器(Sequence Container)。跟其它类型的容器一样,它能够存放各种类型的数据和对象。可以简单的认为,vector容器是一个能够存放任意类型的动态数组。
与数组相比,vector 容器的优点在于它能够根据需要自动调整的大小,随时放入更多的元素。此外, vector 也提供了许多的成员函数来对自身进行操作。
容器的定义
首先,如果要在程序中使用vector容器,必须包含头文件 <vector>。如下:
#include <vector>
vector类是一个模板类,位于std命名空间内,为方便使用还需要增加:
using namespace std;
声明一个容器很简单:
vector<int> vi; // 定义用于存放整数的容器
vector<double> vd; // 定义用于存放浮点数的容器
vector<string> vs; // 定义用于存放string字符串的容器
vector<struct st_girl> vgirl; // 定义用于存放超女结构体的容器
vector<CGirl> vGirl; // 定义用于存放超女类的容器
vector容器很牛,有多牛?要多牛有多牛,可以存放很多头牛。
vector容器可以存放C语言的基本数据类型,可以存放结构体,还可以存放类,这正是我们想要的简单的方法,至于链表,我已经有二十年没有用它了。
容器的使用
vector的功能强大,成员函数很多,我不想按普通教程的方式来介绍它,那样会太烦锁,我回忆了二十年来的实际应用场景,采用示例程序介绍vector常用的用法。
1、存放整数
示例(book220.cpp)
运行结果
程序解释如下:
std::vector<int> vheight; // 声明容器用于存放整数,超女身高,单位是cm。
void push_back(const T& x)成员函数:向容器尾部增加一个元素x,x就是你要向容器中增加的变量,在本示例中是一个整数,注意,参数x是一个引用,要用变量的名称,不是变量的地址,如vheight.push_back(height);。
int size()成员函数:返回容器中数据的元素总数。
像数组一样访问容器:容器像数组一样,可以用数组的下标访问,vheight[0]表示容器的第1个元素,vheight[n]表示容器的第n+1个元素。注意,采用下标方式放问容器的时候,下标不要越界,否则可能会引起内存溢出。
iterator begin()成员函数:返回容器头指针,指向第一个元素。
iterator end()成员函数:返回容器尾指针,指向容器最后一个元素的下一个位置。
容器中的元素排序:采用sort()函数对容器中的元素进行排序。如sort(vheight.begin(),vheight.end());表示对容器中全部的元素进行排序。
void clear():清空容器中的全部元素,注意两点:1)容器被声明的时候,本来就是空的;2)容器是类,有析构函数,析构函数中会自动清空容器中的元素,释放内存资源,不需要程序员担心。但是,程序员也可以调clear()函数手工清空容器中的元素。
示例book220.cpp程序展示了vector容器10%的功能和成员函数,但是,在实际开发中,对容器的操作,95%的内容就是这些。
2、存放字符串
示例(book222.cpp)
运行结果
注意几个问题:
1)用容器存放字符串,数据类型用string,不是C语言用0结尾的字符数组char []。
2)用vname.push_back()成员函数把数据追加到容器中,参数的类型可以是string,也可以是char[],但是,这并不是vector的特征,而是string的特征,容器声明的是string类型,string的构造函数支持char [],表面上看push_back()进去的是char [],实际上会被转换为string。
3)对string和结构体等的排序,在以后的章节中会详细介绍。
3、存放结构体
示例(book225.cpp)
运行结果
总的来说,存放结构体的容器和数组的用法基本相同。
在book225.cpp中,采用了memcpy函数,它是C语言的库函数,用于内存中的数据复制,声明如下:
void *memcpy(void *dest, const void *src, size_t n);
dest -- 指向用于存储复制内容的目标地址,类型强制转换为 void* 指针。
src -- 指向要复制的数据源地址,类型强制转换为 void* 指针。
n -- 要被复制的字节数。
该函数返回dest。
4、存放类
在第2节存放字符串中,string就是类。
vector容器可以存放类,但是在实际开发中,除了存放string类,很少用vector存放其它的类。
其它成员函数
vector的成员函数比较多,为了不增加各位的学习负担,我介绍一些可能有用的。
1、定位的函数
iterator begin():返回容器头的指针,指向容器第一个元素的位置。
iterator end():返回容器尾的指针,指向容器最后一个元素的下一个位置。
iterator是跌代器,这个名字让人难以理解,大家不要管它,以下我会举例说明用法,一般来说,begin()和end()成员函数会用在其它成员函数的参数中。
2、增加元素的函数
void push_back(const T& x):向容器的尾部增加一个元素x。
iterator insert(iterator it,const T& x):向容器中指定位置(it)前插入一个元素x。
示例:
strcpy(stgirl.name,"王昭群"); stgirl.age=22;
vgirl.insert(vgirl.begin()+1,stgirl); // 在第2个元素前插入一个元素。
3、删除元素的函数
iterator erase(iterator it):删除容器中指定位置(it)的元素。
示例:
vgirl.erase(vgirl.begin()+2); // 删除容器中第3个元素。
void pop_back():删除容器中最后一个元素。
void clear():清空容器中全部的元素。
4、判断容器的大小
bool empty():判断容器是否为空。
int size():返回容器中元素的个数。
版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道
如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!
如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!
C++语言vector容器介绍和示例相关推荐
- STL vector 容器介绍 (转载)
STL vector 容器介绍<?xml:namespace prefix = o /> A Presentation of the STL Vector Container (By Ni ...
- STL vector 容器介绍
介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...
- vector容器介绍
Vector概念 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法). vector尾部添加或移除元素非常快速,但 ...
- C语言tolower函数介绍、示例和实现
文章目录 1.包含头文件 2.函数声明 3.功能说明 4.示例 5.自定义的tolower函数的实现方法 6.获取视频教程 7.版权声明 C语言tolower函数用于把大写字母转换为小写字母. 在本文 ...
- C语言isupper函数介绍、示例和实现
文章目录 1.包含头文件 2.函数声明 3.功能说明 4.示例 5.自定义的isupper函数的实现方法 6.获取视频教程 7.版权声明 C语言isupper函数用于判断字符是否为大写字母(A-Z). ...
- C语言islower函数介绍、示例和实现
文章目录 1.包含头文件 2.函数声明 3.功能说明 4.示例 5.自定义的islower函数的实现方法 6.获取视频教程 7.版权声明 C语言islower函数用于判断字符是否为小写字母(a-z). ...
- C语言isalnum函数介绍、示例和实现
文章目录 1.包含头文件 2.函数声明 3.功能说明 4.示例 5.自定义的isalnum函数的实现方法 6.获取视频教程 7.版权声明 C语言isalnum函数用于判断字符是否为字母(a-z和A-Z ...
- C语言关系运算符介绍和示例
文章目录 1.关系运算符介绍 2.应用示例 3.获取视频教程 4.版权声明 1.关系运算符介绍 关系运算(Relational Operators),用于判断条件,决定程序的流程. 关系 数学中的表示 ...
- C++语言string类介绍和示例
在C语言中,用0结尾的字符数组表示字符串,C的字符串有一个问题,就是定义后大小不能改变,存入的内容只能比数组小,不能大,如果不小心存多了,会引起内存的溢出,这个问题让程序员很郁闷. C++的strin ...
最新文章
- 数据服务让业务开发更敏捷
- Spring Boot下的Redis缓存实战
- windows redis sentinel install
- python编程语言继承_python应用:学习笔记(Python继承)
- 程序员基本功08异常捕捉的陷阱
- 华谊兄弟:拟向阿里影业、腾讯等发行不超8.2亿股股票
- 边缘节点服务ENS > 产品简介 > 什么是边缘节点服务ENS
- python的模块和类_Python 模块和类
- matlab在同一窗口中画多个三维图像
- 怎样设置计算机安全模式,电脑怎样进入安全模式
- 小程序 订阅消息 原来就是如此
- 脚本基础(未完待续)
- 处理大数据的四个步骤
- 应用第二代测序技术的转录组组装
- 拉斯维加斯国际黑客大会 本周开战
- 何有效提高香港主机的访问速度?
- pvid与vid详解
- 手机和Linux蓝牙通信,Linux下手机与蓝牙的连接配置
- Android课程设计之视频播放器
- 视频教程-PS教程-【和东东一起学PS】Photoshop 2020小白到高手(任务驱动式基础+实战教学)-Photoshop
热门文章
- 2019年第二届全国大学生大数据技能竞赛通知
- leetcode 刷题指南
- mysql show db_mysql show操作
- mysql自定义函数重载_DBLE 2.18.10.1自定义路由函数开发指引
- 回收站有html文件,回收站在哪个盘?(每个磁盘上都有一个回收站)
- python操作excel模板_Python Excel模板读写,维护公式和格式
- python json转csv_python – 如何将JSON转换为CSV?
- 通讯录c语言以文本文件保存,学C三个月了,学了文件,用C语言写了个通讯录程序...
- diy无感无刷电机霍尔安装_从工作原理来了解意大利Brusatori无刷电机
- oracle安装前准备,Oracle 安装前准备