首页 > 其他分享 >初始vector——数组的高级产物

初始vector——数组的高级产物

时间:2024-10-09 23:46:35浏览次数:3  
标签:容器 元素 个数 C++ vector 数组 初始

前言:

C++ 标准模板库(STL)是现代 C++ 编程的基石,其中的容器、算法和迭代器为开发者提供了高效、灵活的数据处理工具。vector 作为 STL 中最常用的顺序容器,不仅支持动态数组的功能,还通过自动内存管理和丰富的操作接口,极大简化了数据操作的复杂性。无论是在日常开发还是算法竞赛中,vector 的高效性和灵活性都使其成为开发者的首选。

本文将详细介绍vector的用法及逻辑,带领读者逐步实现对vector这一动态数组从入门到精通,感悟C++对比C语言的超脱与精妙之处。

一.容器的引入

C++ 提供了丰富的标准模板库 (STL),包括 顺序容器(如 vector)、关联容器(如 mapset)等。vector 是最常用的 STL 顺序容器之一,它的特点是支持 动态数组,可以在运行时自动扩展容量,提供高效的随机访问。

其中其他容器会在后续逐个介绍,本文重点讲解vector的相关语法。

二.vector的简要介绍

1.含义

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

其存储方式与数组类似,都是一片区域空间的连续存储,但是数组的大小在初始化时就已经确定,

而vectotr支持在使用时动态改变大小。

使用对比如下:

使用C语言创建一个数组:
 

int arr[5] = {1, 2, 3, 4, 5};

容器初使用:

#include <vector>
using namespace std;

vector<int> v = {1, 2, 3, 4, 5};  // 自动管理内存和大小

2.优劣对比

优点:支持[]随机访问,动态分配大小,使用灵活效率高

缺点:插入数据时只有尾插较为切换,其他插入与删除数据设计数组元素的大量移动,效率较低。 

三.vector的构造函数

1.常用示例

C++提供了多种构造函数,以应对不同情况下的参数传递。

示例如下:

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

int main() {
    vector<int> v1;                    // 空 vector
    vector<int> v2(5, 100);            // 5个100的元素
    vector<int> v3(v2);                // 拷贝构造
    vector<int> v4 = {1, 2, 3, 4, 5};  // 使用初始化列表

    for (int i : v4) {
        cout << i << " ";  // 输出: 1 2 3 4 5
    }
    return 0;
}

 输出:1 2 3 4 5

2.具体文档

vector的详细用法与介绍见以下文档。

cplusplus.com/reference/vector/vector/

四.vector容积大小相关操作

C++针对vector的动态分配功能,提供了多个函数。

 1.示例操作

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

int main() {
    vector<int> v = {1, 2, 3, 4, 5};

    cout << "Size: " << v.size() << endl;         // 当前元素个数
    cout << "Capacity: " << v.capacity() << endl; // 当前容量
    v.resize(10, 100);                            // 调整大小到10
    cout << "After resize: " << v.size() << endl;
    v.reserve(20);                                // 预留空间
    cout << "Capacity after reserve: " << v.capacity() << endl;
    v.shrink_to_fit();                            // 收缩容量
    cout << "Capacity after shrink_to_fit: " << v.capacity() << endl;

    return 0;
}

输出:

Size: 5
Capacity: 5//说明还没扩容
After resize: 10
Capacity after reserve: 20
Capacity after shrink_to_fit: 10
 

分析:

1.原先元素个数为5,容积也为5(初始情况下容积大小不一定等于元素个数大小! 不同环境下情况可能不同!)

2.使用resize后,将数组元素个数拓展到10个,由于给出了扩容后的默认值为100,因此数组会再增加5个值为100的元素。

3.使用reserve和shrink_to_fit函数改变了容积的大小。

注意:

1.无论是reserve还是shrink_to_fit,都不会导致数组容积小于元素个数这种情况发生,更不会改变数组内的元素情况

2.如果reserve和shrink_to_fit的参数n小于元素个数,编译器有两种选择,要么直接忽视,要么将容积缩小到略大于元素个数为止。并且,shrink_to_fit在遭遇这种情况时,还可能会导致vector数组元素空间的重新分配,但是并不影响数组的元素本身。

3.resize则可以改变元素个数,如果参数n小于当前元素个数,则会直接删除后续元素直到元素个数为n。

 

标签:容器,元素,个数,C++,vector,数组,初始
From: https://blog.csdn.net/2303_81060385/article/details/142798445

相关文章

  • 编辑器项目搭建(一)项目初始化
    技术选择底层:Vite(设计维护都较友好)+React+Ts(项目越来越大并复杂,需标记变量类型,有助于项目管理)路由:ReactRouter状态管理:ZustandUI:AntD其他:iconfont+less+axios+Immer+loadash+react-color创建一个项目用vite开一个ReateTS项目pnpmcreateviteFlavor--templatereate-t......
  • 有序数组的平方
    实际上需要考虑的是两个数组的按序合并,思路还是双指针法,很容易想到合并后数组的最大值只会在最左边或者最右边,而去掉这个元素后也是一样的操作。因此左指针从负数的最大值即最左边开始,右指针从正数的最大值即最右边开始,比较后更新位置。这里需要想清楚的是结束条件,实际上更新位置......
  • java Gzip将json压缩成byte数组
    `importorg.apache.commons.lang3.StringUtils;importjava.io.*;importjava.nio.charset.StandardCharsets;importjava.util.Arrays;importjava.util.zip.GZIPInputStream;importjava.util.zip.GZIPOutputStream;publicclassTestController{publicsta......
  • 新电脑 Windows 系统初始配置
    目录前言1前置配置2安装软件2.1通讯工具2.2后端开发工具2.3硬件开发工具2.4前端开发工具2.4其它工具3Windows11优化4写在最后前言分区(个人习惯):1TBSSD分为2个分区,一个256GB分区为系统盘,剩下的为一个分区。之所以使用256GB为系统盘,是因为除开30GB+的原生......
  • 在K8S中,初始化容器(initcontainer)作用是什么?
    在Kubernetes(K8s)中,初始化容器(InitContainer)是一种特殊的容器,它在Pod的主容器启动之前运行,并执行一系列初始化任务。以下是关于初始化容器作用的详细解释:1.定义与特性定义:初始化容器是定义在Pod规格中的一个或多个容器,它们在Pod中的任何应用程序容器(即普通的容器)启动之前执行。......
  • 【自动驾驶】《VAD: Vectorized Scene Representation for Efficient Autonomous Driv
    1.参考论文:https://arxiv.org/pdf/2303.12077代码:https://github.com/hustvl/VAD2.摘要        自动驾驶由于是一个对安全要求非常高的任务,所以需要全面了解周围的环境,来进行可靠的规划。以前的方法都是网格占用或者分割图等计算量较高的任务。       本......
  • java复制查询数组-cnblog
    java数组复制数组copyOf(待复制数组,复制后新数组的长度)如果复制后数组的长度,长于原来数组,多出来的元素会被补0,如果新数组元素少会从第一个元素,取到指定元素长度packagenb;importjava.util.Arrays;publicclasscopyOf_{publicstaticvoidmain(String[]......
  • 对UVM添加超时前的打印信息+AXI低功耗接口+process的await语句+对象当成参数+sv的单例
    对UVM添加超时前的打印信息首先获取到UVM的超时值,然后手动设定\$time的比较和while延时循环,当超出时间后,打印特殊的debug信息。$time<set_time,则进行循环。uvm_cmdline_processorclp;clp=uvm_cmdline_processor::get_inst();stringtimeout_settings[$];stringtimeout......
  • JavaScript数组合并方法(concat()函数)
    在JavaScript中,concat方法用于连接两个或多个数组,并返回一个新数组。这不会改变现有的数组,而是返回一个包含了连接元素的新数组。解法1:基本的concat使用方法letarray1=[1,2,3];letarray2=[4,5];letarray3=array1.concat(array2);console.log(array3);//输......
  • C++——有Date类,私有成员:月日年,公有成员:函数,其作用输出月日年。一个构造函数有三个参
    没注释的源代码#include<iostream>usingnamespacestd;classDate{private:  intmonth;  intday;  intyear;public:  voiddisplay()  {    cout<<month<<"/"<<day<<"/"<<year<<endl;......