和C++STL中vector的初次见面,vector常见用法和操作(零基础/小白)

2023-12-18 03:20

本文主要是介绍和C++STL中vector的初次见面,vector常见用法和操作(零基础/小白),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. 基本概念:

    功能:

    vector与普通数组的区别:

    动态扩展:

    数据结构:顺序表

2. 构造函数(初始化):

3. 赋值操作:

4. 容量和大小:

5. 插入和删除:

6. 数据存取:

7. 互换容器:


        因为是对STL中vector容器的讲解,所以下面的讲述都是默认大家对STL的基本概念有所了解,即知道什么是容器,算法,迭代器即可,如果你还是不是很了解,可以花费几分钟快速浏览一下,下面这篇文章:

、C++中STL的概念——零基础/小白向,适合竞赛,初学C++者使用-CSDN博客

1. 基本概念:

    功能:

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

    vector与普通数组的区别:

        不同之处在于数组是静态空间,而vector是可以动态扩展的。

    动态扩展:

        动态扩展并不是在原空间之后开辟新空间,而是找到更大的内存空间,将原数据拷贝过来,释放原空间。

    数据结构:顺序表

        这里我们就介绍一个数据结构,叫做顺序表,它是线性表的一种,如果你有时间,你可以阅读下面这篇文章,详细了解什么是顺序表,并能用C语言写出顺序表底层代码,看完之后,你对STL的vector可能会有更深一层理解。

数据结构入门 --------- 顺序表的实现及应用(C语言/零基础/小白/新手 + 通讯录的实现)-CSDN博客

        学习vector时,你一定要学会查看文档:https://cplusplus.com/reference/vector/vector/,当然你只需要熟练掌握接口就可,如果日后有就业需求,那你可以阅读相关底层代码。下面列出哪些接口是要重点掌握的。
        这里我们先介绍几个vector容器的迭代器,迭代器你可以先简单的理解为指针,最常用的就是begin()和end(),如果是出现,先熟练掌握这两个,begin()获取的数组首元素的位置,end()获取数组尾元素的下一个位置,rbegin()获取最后一个元素的位置,rend()获得第一个元素的前一个位置。

        在学习接口之前,你要明白你不需要可以去记住这些接口,你只需要掌握其中的一种你认为最好即可,我也会为你标红一些较为重要的接口。

2. 构造函数(初始化):

        之后的接口都是先展示函数声明原型,在展示如何转换为代码,如果你对声明不理解,可以对照代码的使用。

    构造函数声明                                                                           接口说明

        vector()                                                                          默认构造,无参构造

     vector(n , val)                                                             构造函数将n个val拷贝给本身

vector<const vector& vec>                                                   拷贝构造函数

vector<v.begin() , b.end()>                                                使用迭代器进行初始化构造

//默认构造,无参构造
vector<int> v1;//拷贝构造
vector<int> v2(v1);//使用n个val拷贝构造
vector<int> v3(3,0);    //放入3个0//使用迭代器构造
vector<int> v4(v1.begin(),v1.end());

        这里为了更好的给大家理解学习,我们就先写个代码,打印0 ~ 9的数字,将-数据放在vector容器,然后打印,因为是从零基础开始,所以不需要你会敲出,你只需要能看懂即可,我会做出详细说明。            

	vector<int> v1;    //默认构造,无参构造for (int i = 0;i < 10;i++){v1.push_back(i);    //插入,将数据放入容器}//定义一个迭代器从首元素位置开始,知道尾元素的下一个位置。for (vector<int>::iterator i = v1.begin();i != v1.end();i++){cout << *i << ' ';}cout << endl;vector<int> v2(v1);    //拷贝构造,将v1的数数据拷贝的v2中//定义v2的迭代器,打印v2中数据for (vector<int>::iterator i = v2.begin();i != v2.end();i++){cout << *i << ' ';}cout << endl;

       两个重要构造接口,大家可能熟悉了,v1.push_back()接口可能不太熟悉,这里push_back()也是个接口,作用是将数据尾插(尾部插入)到容器中。

        如何定义一个vector迭代器,vector<T>::iterator ~,T代表数据类型,~代表取的名,这里你简单的理解为迭代器是个指针。

3. 赋值操作:

    赋值函数声明                                                                           接口说明

vector& opeartor =(constant vector& vec)                            重载等号操作符

assign(beg,end)                                                        将[beg , end)区间中数据拷贝给本身

assign(n,val)                                                                           将n个val拷贝赋值给本身

	vector<int> v1;//1. 重载 = vector<int> v2;v2 = v1;//2. assign,利用迭代器拷贝赋值vector<int> v3;v3.assign(v2.begin(),v2.end());//3. 将n个val拷贝赋值给容器vector<int> v4;v4.assign(10, 0);

        这里我们还是以打印0~9的数为例,再来写一段代码,你只需要先看懂

	vector<int> v1;for (int i = 0;i < 10;i++){v1.push_back(i);}for (vector<int>::iterator i = v1.begin();i != v1.end();i++){cout << *i << ' ';}cout << endl;vector<int> v2;v2 = v1;for (vector<int>::iterator i = v2.begin();i != v2.end();i++){cout << *i << ' ';}cout << endl;vector<int> v3;v3.assign(v2.begin(),v2.end());for (vector<int>::iterator i = v3.begin();i != v3.end();i++){cout << *i << ' ';}cout << endl;vector<int> v4;v4.assign(10, 0);for (vector<int>::iterator i = v4.begin();i != v4.end();i++){cout << *i << ' ';}cout << endl;

                

4. 容量和大小:

函数原型:

empty();                        判断容器是否为空

capacity();                     容器的容量

size();                            返回容器中元素的个数

resize()                          重新指定容器的长度为num,若容器变长,用默认值(0)代替

                                      若容器变短,超出元素个数的值被删除。

        我们还是以打印0~9为例,对上述所有接口做一个概述:

	vector<int> v;for (int i = 0;i < 10;i++){v.push_back(i);}for (vector<int>::iterator i = v.begin();i != v.end();i++){cout << *i << ' ';}cout << endl;if (v.empty()){cout << "vector为空" << endl;}else{cout << "vector不为空" << endl;}cout <<"capacity = " << v.capacity() << endl;cout << "size = " << v.size() << endl;v.resize(5);cout << "resize = " << v.size() << endl;

                

        这里我们先创建一个vecot,插入0~9的数,再判断vector容器是否为空,打印结果,在打印vector此时空间大小和元素个数,再将元素个数调整为5,在打印元素个数。

        需要注意的是resize()只是减少容器中的元素个数,容器开辟的内存空间大小还是没有变的,即只改变了size,没有改变capacity的值。

5. 插入和删除:

push_back(val);                //尾部插入元素val

pop_back();                      //尾部删除最后一个元素

insert(const_iterator pos , val);                //迭代器指向位置pos插入元素val

insert(const_iterator pos, count , val);                //迭代器指向位置pos插入count个元素val

erase(const_iterator pos);                     //删除迭代器指向的元素

erase(const_iterator beg , const_iterator end);        //删除区间[beg , end)之间元素

clear();                                                  //清空容器中所有元素

尾插和尾删:

        这里我们先尾插两个数据,再尾删一个数据,分别打印两次容器里面的内容。

	vector<int> v;v.push_back(1);v.push_back(2);for (vector<int>::iterator it = v.begin();it != v.end();it++){cout << *it<<' ';}cout << endl;v.pop_back();for (vector<int>::iterator it = v.begin();it != v.end();it++){cout << *it;}

插入和删除:

        先插入插入两个数据,再在头部删除一个数据,分别打印两次结果。

	vector<int> v;v.push_back(1);v.insert(v.end(), 2);for (vector<int>::iterator it = v.begin();it != v.end();it++){cout << *it<<' ';}cout << endl;v.erase(v.begin());for (vector<int>::iterator it = v.begin();it != v.end();it++){cout << *it;}cout << endl;

 

当执行v.erase(v.begin() , v.end())的效果和clear()功能一样,都是清除vector容器中所有元素。

6. 数据存取:

函数原型:

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

operatorp[ ];                    // 返回suoyinidx所指向的数据

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

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

        这里我们同样使用打印0~9,分别用[ ] 和 at 修改第一个数据,打印结果,在打印头部和尾部元素。

	vector<int> v;for (int i = 0;i < 10;i++){v.push_back(i);}for (vector<int>::iterator it = v.begin();it != v.end();it++){cout << *it << ' ';}cout << endl;v[0] = -1;for (vector<int>::iterator it = v.begin();it != v.end();it++){cout << *it << ' ';}cout << endl;v.at(0) = 0;for (vector<int>::iterator it = v.begin();it != v.end();it++){cout << *it << ' ';}cout << endl;cout << "front = " << v.front() << endl;cout << "back = " << v.back() << endl;

7. 互换容器:

功能:实现两个容器内元素进行互换

函数原型:

        swap(vec);        //将本身与vec的元素内容进行互换。

vector<int> v1;
vector<int> v2;
v1.swap(v2);

        这里将0-9的数据放在v1里面,9-0的数据放在v2里面,打印交换前 和 交换后的内容

	vector<int> v1;for (int i = 0;i < 10;i++){v1.push_back(i);}cout << "v1 = ";for (vector<int>::iterator it = v1.begin();it != v1.end();it++){cout << *it << ' ';}cout << endl;vector<int> v2;for (int i = 9;i >= 0;i--){v2.push_back(i);}cout << "v2 = ";for (vector<int>::iterator it = v2.begin();it != v2.end();it++){cout << *it << ' ';}cout << endl;v1.swap(v2);cout << "v1 = ";for (vector<int>::iterator it = v1.begin();it != v1.end();it++){cout << *it << ' ';}cout << endl;cout << "v2 = ";for (vector<int>::iterator it = v2.begin();it != v2.end();it++){cout << *it << ' ';}cout << endl;

                        

        这里还有一个扩展,swap还可以用于在减少元素个数时( resize() ),缩减内存空间。

	vector<int> v1;for (int i = 0;i < 10;i++){v1.push_back(i);}cout << "v1.capacity = " << v1.capacity() << endl;cout << "v1.size = " << v1.size() << endl;v1.resize(5);cout << "v1.capacity = " << v1.capacity() << endl;cout << "v1.size = " << v1.size() << endl;vector<int>(v1).swap(v1);    //缩减内存空间cout << "v1.capacity = " << v1.capacity() << endl;cout << "v1.size = " << v1.size() << endl;

        这里我们是创建了个匿名的vector对象,用v1里面的元素个数初始化匿名对象,这时匿名对象的size和capacity都为v1的size,v1再和匿名对象进行交换,这就能达到内存缩减的操作。

        C++STL内容众多,这里也只是对vector进行了初步的讲解,更为复杂的内容,日后会在专栏中更新,你可以订阅专栏,查看里面的最新的内容。

这篇关于和C++STL中vector的初次见面,vector常见用法和操作(零基础/小白)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/506873

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及