STL - Vector容器

news2025/1/19 3:40:43

基本概念

功能:
        vector数据结构和数组十分类似,也成为单端数组

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

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

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

vector构造函数

功能描述:
        创建vector容器

函数原型:

 

#include <algorithm> //标准算法头文件
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// vector容器
void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}
void test02()
{
    vector<int> v1; //默认构造 无参构造
    for (int i = 0; i < 5; i++) {
        v1.push_back(i);
    }
    printVector(v1);

    //通过区间进行构造
    vector<int> v2(v1.begin(), v1.end());
    printVector(v2);

    // n个elem方式
    vector<int> v3(5, 100);
    printVector(v3);

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

int main()
{
    test02();
    return 0;
}

 总结:vector的多种构造方式,没有可比性,灵活使用

vector赋值操作

功能描述:
        给vector赋值

#include <algorithm> //标准算法头文件
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// vector容器赋值

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}
void test02()
{
    vector<int> v1; //默认构造 无参构造
    for (int i = 0; i < 5; i++) {
        v1.push_back(i);
    }
    printVector(v1);

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

    // assign 分配
    vector<int> v3;
    v3.assign(v1.begin(), v1.end());
    printVector(v3);
    // n 个elem
    vector<int> v4;
    v4.assign(10, 100);
    printVector(v4);
}

int main()
{
    test02();
    return 0;
}

 总结:赋值比较简单,使用= 或者assign

vector容器和大小

#include <algorithm> //标准算法头文件
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// vector容器和大小capacity

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    if (v.empty()) {
        cout << "容器位空" << endl;
    } else {
        cout << "容量" << v.capacity() << endl; //容量大于等于大小,C++自动扩充大小
        cout << "大小" << v.size() << endl;
    }
}
void test02()
{
    vector<int> v1; //默认构造 无参构造
    for (int i = 0; i < 5; i++) {
        v1.push_back(i);
    }
    printVector(v1);

    v1.resize(15, 100); //如果指定比原来过长,默认用0填充,可以指定填充值,修改的是大小
    printVector(v1);

    v1.resize(3);
    printVector(v1);
}

int main()
{
    test02();
    return 0;
}

 总结:
        判断是否为空 --empty
        判断元素个数 --size
        判断容器大小 --capacity
        从新指定大小 -- resize

vector插入和删除

#include <algorithm> //标准算法头文件
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// vector插入和删除

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it < v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}
void test02()
{
    vector<int> v1; //默认构造 无参构造
    for (int i = 0; i < 5; i++) {
        //尾插
        v1.push_back(i);
    }
    printVector(v1);

    //尾删
    v1.pop_back();

    //插入
    v1.insert(v1.begin(), 100); //第一个参数是迭代器
    v1.insert(v1.begin(), 2, 13); //插入2个3
    v1.erase(v1.begin());
    //    v1.erase(v1.begin(), v1.end()); //清空
    v1.clear();

    printVector(v1);
}

int main()
{
    test02();
    return 0;
}

 vector数据存取

#include <algorithm> //标准算法头文件
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// vector插入和删除

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it < v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}
void test02()
{
    vector<int> v1; //默认构造 无参构造
    for (int i = 0; i < 5; i++) {
        //尾插
        v1.push_back(i);
    }
    //    printVector(v1);
    //利用【】方式访问数组中元素
    for (unsigned long long  i = 0; i < v1.size(); i++) {
        //        cout << v1.at(i) << " ";
        cout << v1[i] << " ";
    }
    cout << endl;
    cout << "第一个元素" << v1.front() << endl;
    cout << "最后一个元素" << v1.back()<<endl;
}

int main()
{
    test02();
    return 0;
}

 vector互换容器

#include <algorithm> //标准算法头文件
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// vector互换

void printVector(vector<int>& v)
{
    for (vector<int>::iterator it = v.begin(); it < v.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
}
void test02()
{
    vector<int> v1; //默认构造 无参构造
    for (int i = 0; i < 5; i++) {
        //尾插
        v1.push_back(i);
    }

    vector<int> v2; //默认构造 无参构造
    for (int i = 5; i > 0; i--) {
        //尾插
        v2.push_back(i);
    }
    // 1.基本使用
    cout << "交换前" << endl;
    printVector(v1);
    printVector(v2);
    v1.swap(v2);

    cout << "交换后" << endl;
    printVector(v1);
    printVector(v2);
}
void test01()
{
    // 2.实际用途
    //巧用swap可以收缩内存空间
    vector<int> v1; //默认构造 无参构造
    for (int i = 0; i < 100000; i++) {
        //尾插
        v1.push_back(i);
    }
    cout << "v1的容量" << v1.capacity() << endl;
    cout << "v1的大小" << v1.size() << endl;

    v1.resize(3); //重新指定大小
    cout << "v1的容量" << v1.capacity() << endl;
    cout << "v1的大小" << v1.size() << endl;
    //收缩
    //分为两部分 匿名对象 swap是指针的交换
    vector<int>(v1).swap(v1);  
    cout << "v1的容量" << v1.capacity() << endl;
    cout << "v1的大小" << v1.size() << endl;
}
int main()
{
    test01();
    return 0;
}

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

vector预留空间

#include <algorithm> //标准算法头文件
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 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; //默认构造 无参构造
    //利用reserve预留空间
    v1.reserve(100000);

    int count = 0;
    unsigned long long c = v1.capacity();
    int* p = NULL;

    cout << "初始值" << c << endl;
    for (int i = 0; i < 100000; i++) {
        //尾插
        v1.push_back(i);
        if (p != &v1[0]) {
            count++;
            p = &v1[0];
        }
        //        if (c != v1.capacity()) {
        //            count++;
        //            c = v1.capacity();
        //        }
    }
    cout << "最后的空间" << v1.capacity() << endl;
    cout << "一共动态扩展了" << count << "次空间" << endl;
}
int main()
{
    test01();
    return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pandas】用户手册:10分钟熟悉pandas(下)

数据分组 Splitting : 利用某些条件将数据进行分组Applying : 函数应用于每个单独的分组Combining : 合并最终的结果 df pd.DataFrame({"A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo&q…

【正点原子FPGA连载】第十四章Linux基础外设的使用 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十四章Linux基…

百趣代谢组学文献分享:间歇性禁食调节糖尿病脑损伤多组学研究

百趣代谢组学文献分享&#xff0c;糖尿病已经成为一个全球问题&#xff0c;国际糖尿病联盟&#xff08;IDF&#xff09;发布的全球糖尿病地图&#xff08;第9版&#xff09;[1]显示&#xff0c;全球糖尿病患者人数不断上升&#xff0c;全球平均增长率为51%&#xff0c;目前有4.…

C#,图像二值化(23)——局部阈值的绍沃拉算法(Sauvola Thresholding)及源程序

1、局部阈值的绍沃拉算法&#xff08;Sauvola Thresholding&#xff09;Niblack和Sauvola阈值算法Niblack和Sauvola阈值是局部阈值技术&#xff0c;对于背景不均匀的图像非常有用&#xff0c;尤其是对于文本识别1、2。代替为整个图像计算单个全局阈值&#xff0c;通过使用考虑到…

【5】K8S_Deployment

目录 1、Deployment作用 2、deployment的冗余能力 3、deployment的多副本部署 4、deployment的扩缩容 5、deployment的自愈能力 6、滚动更新 7、版本回退 1、Deployment作用 控制Pod&#xff0c;使Pod拥有多副本&#xff0c;自愈&#xff0c;扩缩容等能力 2、deployme…

【正点原子FPGA连载】第十五章开发环境搭建 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十五章开发环境…

uniapp 窗口小工具、桌面小部件、微件(日历、时间) Ba-AwCalendarS

简介&#xff08;下载地址&#xff09; Ba-AwCalendarS 是一款窗口小工具&#xff08;桌面小部件、微件&#xff09;插件&#xff0c;默认为简单的时间样式&#xff0c;有其他界面需要&#xff0c;可联系作者定制。 支持定时更新&#xff08;本插件为每分钟&#xff09;支持点…

基于springboot,vue二手交易平台

开发工具&#xff1a;IDEA服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7系统用户前台和管理后台两部分&#xff0c;项目采用前后端分离前端技术&#xff1a;vue elementUI服务端技术&#xff1a;springbootmybatis项目功…

【数据结构】开端序幕

写在前面&#xff0c;感同身受初学数据结构&#xff0c;是不是一脸懵&#xff0c;下面你中招了几条&#xff1f;&#x1f62d;怎么全是指针&#xff01;指针都不会啊&#xff01;怎么变量名那么长&#xff0c;好难理解啊!什么p&#xff0c;什么next&#xff0c;pp->next究竟…

LeetCode[1753]移除石头的最大得分

难度&#xff1a;中等题目&#xff1a;你正在玩一个单人游戏&#xff0c;面前放置着大小分别为 a、b和 c的 三堆 石子。每回合你都要从两个 不同的非空堆 中取出一颗石子&#xff0c;并在得分上加 1分。当存在 两个或更多 的空堆时&#xff0c;游戏停止。给你三个整数 a、b和 c…

动手深度学习-多层感知机

目录感知机多层感知机激活函数sigmoid函数tanh函数ReLU函数多层感知机的简洁实现参考教程&#xff1a;https://courses.d2l.ai/zh-v2/ 感知机 模型&#xff1a; 感知机模型就是一个简单的人工神经网络。 感知机是二分类的线性模型&#xff0c;其输入是实例的特征向量&#x…

智慧管廊智能化运维管理平台详情

运维管理平台 ​ 平台主界面完成各分系统情况的全局性展现&#xff0c;用图形界面的方法提升视觉效果感染力&#xff0c;根据图色区分正常、异常情况。 1、自然环境及设备监控 ​ 选用全景分层三维可视化地理信息系统及其多元化的二维在线地图从温度、风速、电力、排水、安防…

windows检测远程主机是否连通或者某个端口是否开启

文章目录一、检测主机是否连通步骤二、测试端口是否打开步骤telnet安装一、检测主机是否连通 ping命令是个使用频率极高的网络诊断工具&#xff0c;在Windows、Unix和Linux系统下均适用。它是TCP/IP协议的一部分&#xff0c;用于确定本地主机是否能与另一台主机交换数据报。根…

2022年度总结 EXI-小洲

文章目录一、第一次自我介绍二、2022我都干了些什么(我的收获)1.大专顺利毕业2.后端开发辞职3.第二次代表学校参加江西省职业院校大数据技能大赛4.专升本考试5.参加泰迪杯第五届"数据分析技能赛"6.在csdn开始写博文7.在本科阶段&#xff0c;我又认识了几个会喝点酒的…

【2022年度总结】总结过去,展望未来

文章目录前言回顾过去一、刷题道路两眼黑二、助人为乐本身便是一种快乐展望未来兔年Flag博客文章竞赛目标学习目标志同道合前言 注册CSDN一年了&#xff0c;新年伊始&#xff0c;正好趁着这个时间复盘一下逝去的2022&#xff01; 很幸运&#xff0c;在对计算机知识懵懂无知的时…

分布式调度XXL-JOB急速入门

文章目录1.业界分布式定时任务框架简介2.分布式调度XXL-JOB核心特性3.Docker部署MySQL8.04.XXL-JOB数据库脚本介绍5.Docker部署XXL-JOB服务端6.XXL-JOB UI菜单模块介绍7.SpringBoot整合XXL-JOB8.分布式调度参数传递9.分布式调度日志埋点10.自定义返回执行成功或失败11.XXL-Job高…

C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(二)

C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(二) 测试软件: TIA PORTAL V15.1 S7-PLCSIM ADVANCED V3.0 Visual Studio 2019 在上次的分享中,我们了解了TIA博途一侧的具体组态配置,具体内容可参考以下链接中的内容: C#上位机基础学习_基于SOCKET实现与PLC服务…

【ROS】—— 机器人系统仿真 —URDF优化_xacro (十四)

文章目录前言1. URDF优化_xacro2. Xacro_快速体验3. Xacro_语法详解3.1 属性与算数运算3.2 宏3.3 文件包含4. Xacro_完整使用流程示例4.1 编写 Xacro 文件4.2 集成launch文件5. Xacro_实操前言 &#x1f4e2;本系列将依托赵虚左老师的ROS课程&#xff0c;写下自己的一些心得与笔…

SpringBoot自动配置原理

1、自动配置原理 1、我们编写的SpringBoot启动类上有一个SpringBootApplication注解&#xff0c;表示当前类是springboot的启动类(入口类)。 package com.baidou;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBo…

微信小程序2.9.0基础库canvas2D新API,生成海报保存到手机功能实现

canvasToTempFilePath的官方文档写着在 draw()回调里调用该方法才能保证图片导出成功。文档地址&#xff1a;wx.canvasToTempFilePath(Object object, Object this) | 微信开放文档 我在这里面使用的canva 获取canvas实例&#xff0c;使用的官方的代码。用一个变量canvas保存实…