【C++】STL——vector的简单介绍、vector的定义、vector的构造函数声明、vector iterator的使用

news2025/1/19 11:32:59

文章目录

  • 1.vector的含义
  • 2.vector的使用
    • 2.1vector构造函数声明
      • (1)vector()
      • (2)vector(size_type n, const value_type& val = value_type())
      • (3)vector(const vector& x)
      • (4)vector(InputIterator first, InputIterator last)
    • 2.2vector iterator的使用
      • (1)begin + end
      • (2)rbegin + rend

1.vector的含义

在这里插入图片描述

(1)vector是表示可变大小数组的序列容器。

(2)就像数组一样,vector也采用的连续存储空间来存储元素。 也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

(3)本质讲,vector使用动态分配数组来存储它的元素。 当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

(4)vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。 不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

(5)因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。

(6)与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。 对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

2.vector的使用

2.1vector构造函数声明

(constructor)构造函数声明接口说明
vector()无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val
vector (const vector& x);拷贝构造
vector (InputIterator first, InputIterator last);使用迭代器进行初始化构造

(1)vector()

  vector()构造函数是用于创建一个空的vector对象的构造函数,它不带任何参数。

  下面是创建空的vector对象的示例代码:

  我们使用了std::vector来声明一个名为myVector的vector对象,并调用了vector()构造函数来创建一个空的vector对象。在这个阶段,myVector中没有任何元素。

#include <vector>

int main() {
    // 创建空的vector对象
    std::vector<int> myVector;

    // 在这里可以对myVector进行其他操作

    return 0;
}

(2)vector(size_type n, const value_type& val = value_type())

  vector(size_type n, const value_type& val = value_type())是一个构造函数,用于创建一个包含指定数量元素的vector对象。

  n:指定vector对象的初始大小,即要创建的元素数量。

  val:可选参数,用于指定要初始化的值,默认为元素类型的默认值。

  下面是使用vector(size_type n, const value_type& val = value_type())构造函数创建具有初始大小的vector对象的示例代码:

  我们创建了一个vector对象,该对象包含了5个元素,初始值均为10。通过遍历vector对象的元素,我们可以看到所有元素的值都为10。

#include <vector>
#include <iostream>

int main() {
    // 创建一个包含5个元素,初始值为10的vector对象
    std::vector<int> myVector(5, 10);

    // 输出vector对象的元素
    for (int i = 0; i < myVector.size(); ++i) {
        std::cout << myVector[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

//10 10 10 10 10

(3)vector(const vector& x)

  vector(const vector& x)是一个构造函数,用于创建一个新的vector对象,该对象是通过复制另一个vector对象x的内容得到的。

  x:要复制的vector对象。

  下面是使用vector(const vector& x)构造函数创建新的vector对象的示例代码:

  需要注意的是,复制构造函数执行的是深拷贝操作,完整复制了原始vector对象的内容,包括元素的值和大小。这样可以确保新的vector对象是独立的,并且不会受到原始vector对象的修改影响。

#include <vector>
#include <iostream>

int main() {
    // 创建一个原始vector对象
    std::vector<int> Vector = {1, 2, 3, 4, 5};

    // 使用复制构造函数创建一个新的vector对象
    std::vector<int> copiedVector(Vector);

    // 修改原始vector对象的值
    Vector[0] = 10;

    // 输出新的vector对象的元素
    for (int i = 0; i < copiedVector.size(); ++i) {
        std::cout << copiedVector[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

//1 2 3 4 5

(4)vector(InputIterator first, InputIterator last)

  vector(InputIterator first, InputIterator last)是一个构造函数,用于创建一个新的vector对象,并使用输入迭代器范围内的元素进行初始化。

  first:表示输入迭代器的开始位置。

  last:表示输入迭代器的结束位置,但不包括该位置的元素。

  下面是使用vector(InputIterator first, InputIterator last)构造函数创建新的vector对象的示例代码:

  需要注意的是,使用输入迭代器范围进行构造时,会复制范围内的元素到新的vector对象中。因此,在构造函数调用后,新的vector对象将拥有独立的内存空间,并且与原始的数组没有任何关联。

#include <vector>
#include <iostream>

int main() {
    // 创建一个包含一组元素的数组
    int arr[] = {1, 2, 3, 4, 5};

    // 使用构造函数创建一个新的vector对象
    std::vector<int> myVector(arr, arr + sizeof(arr)/sizeof(arr[0]));

    // 输出vector对象的元素
    for (int i = 0; i < myVector.size(); ++i) {
        std::cout << myVector[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

//1 2 3 4 5

2.2vector iterator的使用

iterator的使用接口说明
begin + end获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator
rbegin + rend获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

(1)begin + end

在这里插入图片描述

  使用begin()和end()成员函数可以获取vector对象的起始和结束迭代器,用于表示容器中的元素范围。

  下面是一个使用begin()和end()成员函数来表示vector对象的起始和结束迭代器的示例代码:

  使用begin()和end()成员函数可以方便地获取vector对象的迭代器范围,从而灵活地选择要拷贝的元素。同样地,起始位置是包含在范围内的,而结束位置是不包含在范围内的。

#include <vector>
#include <iostream>

int main() {
    // 创建一个vector对象
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    // 使用begin和end迭代器表示vector对象的范围
    std::vector<int> newVector(myVector.begin() , myVector.end() );

    // 输出newVector对象的元素
    for (int i = 0; i < newVector.size(); ++i) {
        std::cout << newVector[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

//1 2 3 4 5

(2)rbegin + rend

  rbegin()和rend()是成员函数,用于获取反向迭代器的起始和结束位置。它们可以用来表示容器中元素的反向范围。

  下面是一个使用rbegin()和rend()成员函数来表示vector对象的反向范围的示例代码:

  使用rbegin()和rend()成员函数可以方便地获取vector对象的反向迭代器范围,从而获得反向顺序的元素范围。需要注意的是,起始位置是包含在范围内的,而结束位置是不包含在范围内的。

#include <vector>
#include <iostream>

int main() {
    // 创建一个vector对象
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    // 使用rbegin和rend迭代器表示vector对象的反向范围
    std::vector<int> newVector(myVector.rbegin() , myVector.rend());

    // 输出newVector对象的元素
    for (int i = 0; i < newVector.size(); ++i) {
        std::cout << newVector[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

//5 4 3 2 1

这些就是C++中vector的定义和构造函数的简单介绍了😉
如有错误❌望指正,最后祝大家学习进步✊天天开心✨🎉

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

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

相关文章

20230714----重返学习-DOM-diff算法-构建工具-包管理工具-Vite基本使用-Vue3新特性

day-112-one-hundred-and-twelve-20230714-DOM-diff算法-构建工具-包管理工具-Vite基本使用-Vue3新特性 DOM-diff算法 vue2中diff算法 同级比对&#xff0c;跨级比对性能差。而且采用的方式是递归比对&#xff0c;更差一点。根节点只能有一个&#xff0c;比对的时候会从根节…

Android 多边形导圆角(Path画折线导圆角)

前言&#xff1a;用path画折线&#xff0c;2条线相交处导圆角 简介&#xff1a;为开发者提供工具类&#xff0c;方便对使用path画折线设置圆角。使用path画多边形&#xff0c;如三角形、矩形、平行四边形等&#xff0c;同时设置圆角。另外提供计算直线上某点坐标。 实现原理 …

Matplotlib下载和安装

Matplotlib 是 Python 的第三方绘图库&#xff0c;它非常类似于 MATLAB。在使用 Matplotlib 软件包之前&#xff0c;需要对其进行安装。本节以 Windows10 系统为例&#xff0c;介绍 Matplotlib 的几种安装方式。 MATLAB 是一款商业软件&#xff0c;主要用于数据分析、图像处理…

http协议(二)

欢迎来到南方有乔木的博客&#xff01;&#xff01;&#xff01; 博主主页&#xff1a;点击点击&#xff01;戳一戳&#xff01;&#xff01; 博主名:南方有乔木呀 博主简介&#xff1a; 一名在校大学生&#xff0c;正在努力学习Java语言编程。穷且意坚&#xff0c;不坠青云…

Java常规写法与新特性对比详解

Java常规写法与新特性对比详解 ✨1. Lambda表达式对比常规写法&#xff1a;⭐️1.1 迭代集合&#xff1a;⭐️1.2 条件过滤&#xff1a;⭐️1.3 映射转换&#xff1a; ✨2. Stream API对比常规写法&#xff1a;⭐️2.1 过滤和计数&#xff1a;⭐️2.2 排序&#xff1a;⭐️2.3 …

通过 Postman+Newman+Jenkins 进行接口自动化测试和进一步实现 CI

目录 前言&#xff1a; Postman 部分 Collection 或者说测试集的建立 Postman 使用详解 测试工具 mock server Newman 的安装和使用 newman 的使用 对 SSL 的支持 newman 第三版以后&#xff08;目前已经是 4.3.1&#xff09;可以支持通过 CLI 选项来支持 SSL 对 new…

Python 使用 Stable Diffusion API 生成图片示例

代码&#xff1a; import base64 import datetime import json import osimport requestsdef submit_post(url: str, data: dict):"""Submit a POST request to the given URL with the given data.:param url: url:param data: data:return: response"…

用html+javascript打造公文一键排版系统6:三级标题排版

正文中的标题分为四级&#xff0c;文中结构层次序数依次可以用“一、”“&#xff08;一&#xff09;”“1.”“&#xff08;1&#xff09;”标注&#xff1b;一般第一层用黑体字、第二层用楷体字加粗、第三层和第四层用仿宋体字标注。 对于以阿拉伯数字开头、后接英文点号.及…

First image then video A two-stage network for spatiotemporal video denoising

First image then video: A two-stage network for spatiotemporal video denoising http://export.arxiv.org/abs/2001.00346 作者&#xff1a;王策 南开大学 本文针对的是视频中出现大运动。或者前景和背景由于弱光环境较弱时造成去噪性能差的问题而解决&#xff0c;论文时在…

String 类的常用方法

String类的常用方法 说明 String类是保存字符串常量的&#xff0c;每次更新都需要重新开辟空间&#xff0c;效率比较低&#xff0c;因此 java 设计者还提供了StringBuilder和StringBuffer来增强String的功能&#xff0c;并提高效率。 常用方法 public class String01 {publi…

C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)

C语言——动态内存管理 1. 为什么需要动态内存管理 我们以往定义数组&#xff0c;都是这么定义的&#xff1a; int nums[10] {0};以这种方式开辟空间有两个特点&#xff1a; 空间开辟的大小是固定的数组在声明的时候&#xff0c;必须指定数组的长度&#xff0c;它所需要的内…

数据库应用:Navicat连接MySQL

目录 一、理论 1.Navicat 2.MVCC 二、实验 1.Navicat连接MySQL 2.navicat的基础操作 3.测试提交事务 三、问题 1.解决1130 2.解决2003 四、总结 一、理论 1.Navicat &#xff08;1&#xff09;简介 Navicat Premium 是一套数据库开发工具&#xff0c;实现从单一应用…

基于时域特征和频域特征组合的敏感特征集,再利用CNN进行轴承故障诊断(python编程)

1.文件夹介绍&#xff08;使用的是CWRU数据集&#xff09; 0HP-3HP四个文件夹装载不同工况下的内圈故障、外圈故障、滚动体故障和正常轴承数据。 2.模型 按照1024的长度分割样本&#xff0c;构建内圈故障、外圈故障、滚动体故障和正常轴承样本集 2.1.计算11种时域特征值 # 计…

EfficientNet论文笔记

EfficientNet论文笔记 通过NAS平衡了channel&#xff0c;depth&#xff0c;resolution&#xff0c;发现在相同的FLOPs下&#xff0c;同时增加 depth和 resolution的效果最好。 数据集效果小于resolution怎么办&#xff1f; EfficientNet—b0框架 表格中每个MBConv后会跟一个…

Maven —— 项目管理工具

前言 在这篇文章中&#xff0c;荔枝会介绍如何在项目工程中借助Maven的力量来开发&#xff0c;主要涉及Maven的下载安装、环境变量的配置、IDEA中的Maven的路径配置和信息修改以及通过Maven来快速构建项目。希望能对需要配置的小伙伴们有帮助哈哈哈哈~~~ 文章目录 前言 一、初…

力扣刷题序列 - 字符串篇

这里写目录标题 字符1.520 回文串的定义2. 125 公共前缀3. 14 单词4. 4345. 58 字符串的反转6. 3447. 5418. 5579. 151 字符的统计10. 38711. 38912. 38313. 24214. 4915. 45116. 42317. 65718. 55119. 69620. 467 数字与字符间的转换21.41222.50623.53924.553537592---64038 子…

GAME101 OpenCV环境安装

文章目录 Opencv 库编译Step 1.下载源码Step 2. 使用CMake编译Step3. 解决CMake 过程重的报错错误1&#xff1a; 错误的Python版本:错误1 解决办法 错误2&#xff1a;下载ippicv_2020_win_ia32_20191018_general.zip失败错误2 解决办法 错误3&#xff1a;ffmpeg相关文件下载失败…

力扣 509.斐波那契数

509.斐波那契数 1 题目2 思路3 代码4 结果 1 题目 题目来源&#xff1a;力扣&#xff08;LeetCode &#xff09;https://leetcode.cn/problems/fibonacci-number 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为斐波那契数列 。该数列由 0 和 1 开始&…

git国内下载

https://npm.taobao.org/mirrors/git-for-windows/点进去最新的最后一条 选择.exe文件点击

二、遥感物理基础(2)物体的发射与反射辐射特征

前言 本文内容较为枯燥&#xff0c;是遥感的物理原理&#xff0c;作者已经尽量去帮助读者理解了&#xff0c;无论是精细的阅读还是走马观花&#xff0c;长期下来都能提高读者对专业知识的理解&#xff1b;作者非物理专业&#xff0c;对某些知识点的总结仅是个人理解&#xff0c…