C++ 16 vector容器

目录

一、vector容器

1.1 简介

1.2 构造函数

1.3 赋值操作

1.4 容量和大小

1.5 插入删除

1.6 数据存取

1.7 互换容器

1.8 预留空间


一、vector容器

1.1 简介

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

② vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展。

③ 动态扩展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。

④ vector容器的迭代器是支持随机访问的迭代器。

1.2 构造函数

① 功能描述:创建vector容器

② 函数原型:

  1. vector v;
  2. vector(v.begin(), v,end()); //将v[begin().end())区间(前闭后开)中的元素拷贝给本身。
  3. vector(n, elem); //构造函数将n个elem拷贝给本身
  4. vector(const vector &vec); //拷贝构造函数
#include <iostream>
using namespace std;
#include<vector> 

void printVector(vector<int>&v)   //各种容器的接口,v1容器传进去,就打印v1容器
{
    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()); //把v1.begin()-v1.end()区间内数给v2

    printVector(v2);

    //n个elem方式构造

    vector<int>v3(10, 100); //这是10个100,不是100个10

    printVector(v3);

    //拷贝构造
    vector<int>v4(v3);

    printVector(v4);
}

int main()
{
    test01();

    system("pause");

    return 0;
}
运行结果:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100
请按任意键继续. . .

1.3 赋值操作

① 功能描述:给vector容器进行赋值。

② 函数原型:

  1. vector& operator=(const vector &vec); //重载等号操作符。
  2. assign(beg,end); //将[beg,end)区间中的数据拷贝赋值给本身。
  3. assign(n,elem); //将n个elem拷贝赋值给本身。

③ vector赋值方式比较简单,使用operator=,或者assign都可以。

#include <iostream>
using namespace std;
#include<vector> 

//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);
    }
    printVector(v1);

    //赋值 operator=
    vector<int>v2;
    v2 = v1;
    printVector(v2);

    //assign
    vector<int>v3;
    v3.assign(v1.begin(), v1.end());  //提供两个迭代器,两个迭代器区间中的元素都赋值给vector容器,区间为前闭后开
    printVector(v3);

    //n个elem方式赋值
    vector<int>v4;
    v4.assign(10, 100);
    printVector(v4);
}


int main()
{
    test01();

    system("pause");

    return 0;
}
运行结果:

0123456789
0123456789
0123456789
100100100100100100100100100100
请按任意键继续. . .

1.4 容量和大小

① 功能描述:对vector容器的容量和大小操作。

② 函数原型:

//判断容器是否为空

  1. empy();

//容器的容量

  1. capacity();

//返回容器中元素的个数

  1. size();

//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  1. resize(int num);

//重新指定容器的长度为num,若容器变成,则以elem值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  1. resize(int num, elem);

③ vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数;而 vector 容器的大小(用 size 表示),指的是它实际所包含的元素个数。

④ vector 容器的大小不能超出它的容量,在大小等于容量的基础上,只要增加一个元素,就必须分配更多的内存。注意,这里的“更多”并不是 1 个。换句话说,当 vector 容器的大小和容量相等时,如果再向其添加(或者插入)一个元素,vector 往往会申请多个存储空间,而不仅仅只申请 1 个。

⑤ 一旦 vector 容器的内存被重新分配,则和 vector 容器中元素相关的所有引用、指针以及迭代器,都可能会失效,最稳妥的方法就是重新生成。

#include <iostream>
using namespace std;
#include<vector> 

//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);
    }
    printVector(v1);

    if (v1.empty()) //为真 代表容器为空
    {
        cout << "v1为空" << endl;
    }
    else
    {
        cout << "v1不为空:" << endl;
        cout << "capacity容量:" << v1.capacity() <<endl;
        cout << "v1的大小为:" << v1.size() << endl;

        //重新指定大小
        v1.resize(15);  //如果重新指定的比原来长了,默认用0填充新的位置
        printVector(v1);

        v1.resize(20,100);  //利用重载版本,参数2可以指定默认填充值
        printVector(v1);

        v1.resize(5);  //如果重新指定的比原来短了,超出的部分会删除掉
        printVector(v1);
    }
}


int main()
{
    test01();

    system("pause");

    return 0;
}
运行结果:

0123456789
v1不为空:
capacity容量:13
v1的大小为:10
012345678900000
012345678900000100100100100100
01234
请按任意键继续. . .

1.5 插入删除

① 功能描述:对vector容器进行插入、删除操作。

② 函数原型:

  1. push_back(ele); //尾部插入元素ele
  2. pop__back(); //删除最后一个元素
  3. insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  4. insert(const_iterator pos, int count ele); //迭代器指向位置pos插入count个元素
  5. erase(const_iterator pos); //删除迭代器指向的元素
  6. erase(cons_titerator start, const_iterator end); //删除迭代器从start到end之间的元素
  7. 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 << " ";
    }
    cout << endl;

}

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);
    printVector(v1);

    //删除  参数也是迭代器
    v1.insert(v1.begin(),2,999);
    printVector(v1);

    //删除
    v1.erase(v1.begin());
    printVector(v1);

    //清空  方式一:
    v1.erase(v1.begin(), v1.end());
    printVector(v1);

    //清空  方式二:
    v1.clear();
    printVector(v1);
}


int main()
{
    test01();

    system("pause");

    return 0;
}
运行结果:

10 20 30 40 50
10 20 30 40
100 10 20 30 40
999 999 100 10 20 30 40
999 100 10 20 30 40
请按任意键继续. . .

1.6 数据存取

① 功能描述:对vector中的数据存取操作。

② 函数原型:

  1. at(int idx); ///返回索引idx所指的数据。
  2. operator[]; //返回索引idx所指的数据。
  3. front(); //返回容器中第一个数据元素
  4. back(); //返回容器中最后一个数据元素

③ 除了用迭代器获取vector容器中元素,[]和at也可以。

④ 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 << " ";
    }
    cout << endl;
}

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 < v1.size(); i++)
    {
        cout << v1.at(i) << " ";
    }
    cout << endl;

    //获取第一个元素
    cout << "第一个元素为:" << v1.front() << endl;

    //获取最后一个元素
    cout << "最后一个元素为:" << v1.back() << endl;
}

int main()
{
    test01();

    system("pause");

    return 0;
}

运行结果:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
第一个元素为:0
最后一个元素为:9
请按任意键继续. . .

1.7 互换容器

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

② 函数原型:swao(vec); //将vec与本身的元素互换

③ swap可以使两个容器互换,可以达到实用的收缩内存效果。

#include <iostream>
using namespace std;
#include<vector> 

//vector容器互换

void printVector(vector<int>v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

}

//1、基本使用
void test01()
{
    cout << "交换前:" << endl;

    vector<int>v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    
    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);
}

//2、实际用途
//巧用swap可以收缩内存空间
void test02()
{
    vector<int>v;
    for (int i = 0; i < 100000; i++)
    {
        v.push_back(i);
    }
    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为:" << v.size() << endl;

    v.resize(3);  //重新指定大小
    cout << "v的容量为:" << v.capacity() << endl;  //resize操作,容量并没有变,多余的容量浪费了
    cout << "v的大小为:" << v.size() << endl;

    //巧用swap收缩内存
    vector<int>(v).swap(v);  //vector<int>(v)创建了一个为匿名对象,会按v的大小初始化这个匿名对象容器的大小
                             //.swap(v)会对匿名对象容器与原容器做一个交换,则原容器的指针指向匿名对象的容器,匿名对象的容器的指针改为指向原容器
                             //	系统运行完创建匿名函数这一句语句后对匿名对象的指针(即地址、内存)进行回收

    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为:" << v.size() << endl;
}

int main()
{
    test01();
    test02();

    system("pause");

    return 0;
}
运行结果:

交换前:
0 1 2 3 4 5 6 7 8 9
10 9 8 7 6 5 4 3 2 1
交换后:
10 9 8 7 6 5 4 3 2 1
0 1 2 3 4 5 6 7 8 9
v的容量为:138255
v的大小为:100000
v的容量为:138255
v的大小为:3
v的容量为:3
v的大小为:3
请按任意键继续. .

1.8 预留空间

① 功能描述:减少vector在动态扩展容量时的扩展次数。

 

② 函数原型:

  1. reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。
#include <iostream>
using namespace std;
#include<vector> 

//vector容器 预留空间

void test01()
{

    vector<int>v;

    int num = 0;  //统计开辟次数

    int* p = NULL; 

    for (int i = 0; i < 100000; i++)
    {
        v.push_back(i);

        if (p != &v[0])  //一开始指针不指向容量首地址,所以让指针指向容量首地址,开辟内存次数加1
        {
            p = &v[0]; 
            num++;   //由于容量不够,会再次开辟一段容量更大的内存空间,原小容量的内存空间被释放

        }
    }

    cout << "num:" << num << endl;

}

void test02()
{

    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();
    test02();

    system("pause");

    return 0;
}
运行结果:

num:30
num:1
请按任意键继续. . .

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/4682.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.链路层和局域网

链路层链路层的主体是网络适配器&#xff0c;也称为网络接口卡2. 变换局域网链路层交换机的任务是在主机和路由器之间承载数据报没有两个适配器有相同的MAC地址适配器到哪里&#xff0c;MAC地址都不会改变主机移动时&#xff0c;主机的IP地址需要随之改变&#xff0c;以改变连接…

Vue+springboot 高校图书馆座位预约选座系统java毕业设计项目推荐

目前现有的图书馆选座管理系统对于用户而言其选座管理流程仍然过于繁琐&#xff0c;对于图书馆选座管理而言其系统安全性并不能保障。同时整套系统所使用的技术相对较为落后&#xff0c;界面不能动态化展示。相比较于其它同类型网站而言不能体现技术先进性。 1.2 项目目标 图书…

Python视频软件解析教程【源码可送】

人生苦短&#xff0c;我用python 快放假了… 有的人出去玩~ 有的人在家里呆着看电视~ 这次就来康康怎么做一个好玩的小软件~ &#xff08;嘘~自己用&#xff09; 瓜子花生小零食准备好了吗&#xff1f; 效果展示 我们先看看效果 这是本次要写的界面 主流视频都可以看&…

JDK20正式发布了GA版本,短期维护支持,以及JDK21预览

最近&#xff0c;Oracle发布了JDK20&#xff0c;相比对于Java开发者来说&#xff0c;JDK的发版是比较收关注的事情了&#xff0c;小简也来和大家一起了解了解JDK20发生了什么变化呢&#xff1f; 首先&#xff0c;JDK20是一个短周期版本&#xff0c;有6个月的维护时间&#xff0…

Maven和Gradle的区别

首先谈谈为什么要学习Maven&#xff1f; 依赖管理 大家还记得在学习JavaWeb时需要向web项目中引入少许jar包嘛&#xff1f;还记得引入jar包的繁琐过程嘛&#xff1f;实际项目中可能光基座需要引入的jar包就成千上万&#xff0c;jar包从哪里获取也是一个问题。项目中的jar包不仅…

ChatGPT写作文章-快速使用ChatGPT不用注册方式

如何更好地使用ChatGPT批量生成文章&#xff1a;详细教程 作为一款强大的文本生成器&#xff0c;ChatGPT可以帮助您快速、高效地批量生成文章。但如果您还不知道如何更好地使用ChatGPT&#xff0c;那么这篇详细的列表教程将会指导您如何使用它来生成高质量的文章&#xff0c;提…

“工业转型,大势所趋”:ITES深圳工业展暨阿里巴巴1688工业采购节开幕

2023年以来&#xff0c;中国制造业快速发展、需求深度释放&#xff0c;创造了大量的产业机遇。与此同时&#xff0c;国内外社会经济发展不确定因素众多&#xff0c;制造类企业、专业买家呼唤提升发展确定性&#xff1b;面临时代变局&#xff0c;工业品市场渴望在发展模式、合作…

华为OD机试题,用 Java 解【删除指定目录】问题 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:删除指定目录 题目 某文件系统…

JDK 中用到了哪些设计模式?

以下是整理的⼏个在JDK 库中 常⽤的⼏个设计模式。桥接模式这个模式将抽象和抽象操作的实现进⾏了解耦&#xff0c;这样使得抽象和实现可以 独⽴地变化。 在Java 应⽤中&#xff0c;对于桥接模式有⼀个⾮常典型的例⼦&#xff0c;就是应⽤程序使⽤ JDBC 驱动程序进⾏开发的⽅式…

Node.js 中的线程 与 并发

Node.jsNode.js 中的线程 与并发jcLee95 &#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/129784985 目 录1. JavaScript 与线程1.1 Java…

8种特“坑”的 SQL 写法,性能降低100倍

给大家分享几个SQL常见的“坏毛病”及优化技巧。 SQL语句的执行顺序&#xff1a; 1、LIMIT 语句 分页查询是最常用的场景之一&#xff0c;但也通常也是最容易出问题的地方。比如对于下面简单的语句&#xff0c;一般 DBA 想到的办法是在 type、 name、 create_time 字段上加组…

春分-面试

青岛 zc&#xff1a; 1.String的类型 string、stringbuilder 、stringbuffer&#xff1f; String不可变、另外两个可变、StringBuilder线程不安全、但是效率高、并且String不能被继承。 JVM是C写的编译后的机器码&#xff0c; 2.集合类的用法&#xff0c;还问了键值对。key如果…

06solr 文件删除

文章目录 0x01 漏洞介绍0x02 影响版本0x03 漏洞环境0x04 漏洞复现0x05 修复建议摘抄免责声明0x01 漏洞介绍 Apache Solr 存在任意文件删除漏洞,在目前的最新版本(8.8.2)中仍然未被修复,漏洞的根本成因是函数 **Files.deleteIfExists()**对要删除的文件名并未做校验。同时 Apa…

小程序面试题(day07)

文章目录前言微信小程序自定义tabbar的理解&#xff1f;微信小程序怎么缓存数据&#xff1f;微信小程序怎么进行网络请求&#xff1f;微信小程序路由跳转以及传参如何实现&#xff1f;微信小程序生命周期的理解&#xff1f;微信小程序模块化&#xff1f;微信小程序所有api放在哪…

高并发系统设计:缓存、降级、限流、(熔断)

高并发系统设计&#xff1a;缓存、降级、限流、(熔断) 在开发高并发系统时有三把利器用来保护系统&#xff1a;缓存、降级和限流。 非核心服务可以采用降级、熔断&#xff0c;核心服务采用缓存和限流&#xff08;隔离流量可以最大限度的保障业务无损&#xff09;。 缓存 缓…

Scala隐式转换

Scala 的隐式转换是一种自动类型转换机制&#xff0c;它可以在编译器自动插入一些代码&#xff0c;将一个类型自动转换成另一个类型。这种转换可以发生在函数调用、赋值、类型转换等多种场景中。 隐式转换的机制可以让 Scala 代码更加简洁、优雅。例如&#xff0c;我们可以通过…

“体育游戏第一股”投资未来,望尘科技走向价值兑现周期

2022年的游戏市场&#xff0c;遗憾以疲弱之势落下帷幕。游戏市场规模与用户数量&#xff0c;均出现了小幅下降&#xff0c;显示出存量市场的典型特征。 但与此同时&#xff0c;更多垂直领域的拳头产品、响应市场需求的精品游戏&#xff0c;却屡屡掀起热潮。去年随世界杯而来的…

Darknet-YOLOv4训练步骤

1、打开终端&#xff0c;克隆项目 git clone https://github.com/AlexeyAB/darknet.git2、修改Makefile文件 其中&#xff0c;GPU和CUDNN是GPU加速&#xff0c;CUDNN_HALF是特定硬件加速&#xff0c;OPENCV是否使用OpenCV&#xff0c;AVX和OPENMP是CPU加速opencv编译问题htt…

JavaScript常用知识点

1-包装数据类型 一个基本数据类型当你使用的时候会自动转换成复杂数据类型&#xff0c;当你使用完毕&#xff0c;会自动转换为基本数据类型 比如 字符串 string是基本数据类型&#xff0c;但是它可以使用 length这个方法 &#xff0c;就是因为字符串也是一个包装数据类型&…

Spring整合

Spring整合6&#xff0c;Spring整合6.1 Spring整合Mybatis思路分析6.1.1 环境准备步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步骤7:添加Mybatis核心配置文件步骤8:编写应用…