学点 STL C++ 的线性容器

点击蓝字

4c45bfc5e6eb9ee24e3270c7dcc0d12b.png

关注我们

std::array

看到这个容器的时候肯定会出现这样的问题:

  1. 为什么要引入 std::array 而不是直接使用 std::vector

  2. 已经有了传统数组,为什么要用 std::array?

先回答第一个问题,与 std::vector 不同,std::array 对象的大小是固定的,如果容器大小是固定的,那么可以优先考虑使用 std::array 容器。另外由于 std::vector 是自动扩容的,当存入大量的数据后,并且对容器进行了删除操作, 容器并不会自动归还被删除元素相应的内存,这时候就需要手动运行 shrink_to_fit() 释放这部分内存。

std::vector<int> v;
std::cout << "size:" << v.size() << std::endl;         // 输出 0
std::cout << "capacity:" << v.capacity() << std::endl; // 输出 0// 如下可看出 std::vector 的存储是自动管理的,按需自动扩张
// 但是如果空间不足,需要重新分配更多内存,而重分配内存通常是性能上有开销的操作
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::cout << "size:" << v.size() << std::endl;         // 输出 3
std::cout << "capacity:" << v.capacity() << std::endl; // 输出 4// 这里的自动扩张逻辑与 Golang 的 slice 很像
v.push_back(4);
v.push_back(5);
std::cout << "size:" << v.size() << std::endl;         // 输出 5
std::cout << "capacity:" << v.capacity() << std::endl; // 输出 8// 如下可看出容器虽然清空了元素,但是被清空元素的内存并没有归还
v.clear();                                             
std::cout << "size:" << v.size() << std::endl;         // 输出 0
std::cout << "capacity:" << v.capacity() << std::endl; // 输出 8// 额外内存可通过 shrink_to_fit() 调用返回给系统
v.shrink_to_fit();
std::cout << "size:" << v.size() << std::endl;         // 输出 0
std::cout << "capacity:" << v.capacity() << std::endl; // 输出 0

而第二个问题就更加简单,使用 std::array 能够让代码变得更加“现代化”,而且封装了一些操作函数,比如获取数组大小以及检查是否非空,同时还能够友好的使用标准库中的容器算法,比如 std::sort

使用 std::array 很简单,只需指定其类型和大小即可:

std::array<int, 4> arr = {1, 2, 3, 4};arr.empty(); // 检查容器是否为空
arr.size();  // 返回容纳的元素数// 迭代器支持
for (auto &i : arr)
{// ...
}// 用 lambda 表达式排序
std::sort(arr.begin(), arr.end(), [](int a, int b) {return b < a;
});// 数组大小参数必须是常量表达式
constexpr int len = 4;
std::array<int, len> arr = {1, 2, 3, 4};// 非法,不同于 C 风格数组,std::array 不会自动退化成 T*
// int *arr_p = arr;

当我们开始用上了 std::array 时,难免会遇到要将其兼容 C 风格的接口,这里有三种做法:

void foo(int *p, int len) {return;
}std::array<int, 4> arr = {1,2,3,4};// C 风格接口传参
// foo(arr, arr.size()); // 非法, 无法隐式转换
foo(&arr[0], arr.size());
foo(arr.data(), arr.size());// 使用 `std::sort`
std::sort(arr.begin(), arr.end());

std::forward_list

std::forward_list 是一个列表容器,使用方法和 std::list 基本类似,因此我们就不花费篇幅进行介绍了。

需要知道的是,和 std::list 的双向链表的实现不同,std::forward_list 使用单向链表进行实现, 提供了 O(1) 复杂度的元素插入,不支持快速随机访问(这也是链表的特点), 也是标准库容器中唯一一个不提供 size() 方法的容器。当不需要双向迭代时,具有比 std::list 更高的空间利用率。

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

9ae3ea77e9821b0e1d57732c4b70cf16.png

65e9c5b42316104dac884ce1208840bf.gif

戳“阅读原文”我们一起进步

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

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

相关文章

linux at查看进程命令,at命令 - Linux命令大全 | linux教程

at命令允许指定运行脚本时间&#xff0c;at的守护进程atd会以后台模式运行&#xff0c;检查系统上的一个特殊目录来获取at命令的提交的作业。默认情况下&#xff0c;atd守护进程每60秒检查一次目录。有作业时会检查作业运行时间&#xff0c;如果与当前时间匹配&#xff0c;则运…

java替换数组中的元素_如何使用Java 8流快速替换列表中的元素

java替换数组中的元素假设您有一个项目清单&#xff1a; List<String> books Arrays.asList("The Holy Cow: The Bovine Testament","True Hip Hop","Truth and Existence","The Big Book of Green Design" );&#xff08;不要…

C++:良好的编程习惯与编程要点

点击蓝字关注我们以良好的方式编写C class假设现在我们要实现一个复数类complex&#xff0c;在类的实现过程中探索良好的编程习惯。① Header(头文件)中的防卫式声明complex.h: # ifndef __COMPLEX__ # define __COMPLEX__ class complex {} # endif防止头文件的内容被多次包含…

如何使用man命令linux,Linux man命令的使用方法

Linux提供了丰富的帮助手册&#xff0c;当你需要查看某个命令的参数时不必到处上网查找&#xff0c;只要man一下即可。可以使用man man 查看man的使用方法1.man共有以下几个章节代码功能1标准用户命令(Executable programs or shell commands)2系统调用(System calls)functions…

linux adb 端口,linux 无法连接adb 设备

之前电脑linux 连接 adb 设备一直都是正常的&#xff0c;今天突然出现无法连接的情况adb shell出现下面的错误信息error: insufficient permissions for deviceadb device出现下面的信息List of devices attached????????????no permissions解决方法lsusb 查看adb…

php 系统交互 删除文件_FileSystemMap:与文件系统交互的自然方法

php 系统交互 删除文件作为项目的一部分&#xff0c;我目前正在研究创建FileSystemMap 。 我已经开始了一个非常小的GitHub的项目在这里举办的代码。 本质上&#xff0c;此映射实现将允许用户与其文件系统上的目录进行交互&#xff0c;就好像它是java.util.Map 。 映射中的每个…

又要卷?挑战 C 语言,新的系统编程语言 Hare 发布

点击蓝字关注我们开发者 Drew DeVault 公布了一门新的系统编程语言 Hare &#xff08;野兔&#xff09;。Hare 的开发时间接近两年半&#xff0c;它使用静态类型系统、手动内存管理和最小运行时&#xff0c;非常适合编写操作系统、系统工具、编译器以及其他低级高性能任务。据 …

java cuba_CUBA平台–新的Java企业应用程序框架

java cuba所以..你好&#xff0c;世界&#xff01; 我们的英语网站终于可以正常使用了&#xff0c;现在每个人都可以下载该平台&#xff0c;并可以以前所未有的速度更快地创建业务应用程序。 在我们决定与国际Java社区共享足够好之前&#xff0c;我们花了六年的永久发展和偶尔的…

linux设备驱动开发详解源码,linux设备驱动开发详解光盘源码.rar

压缩包 : linux设备驱动开发详解光盘源码.rar 列表19/busybox源代码/busybox-1.2.1.tar.bz219/MTD工具/mtd-utils-1.0.0.tar.gz19/nand驱动范例/s3c2410.c19/nor驱动范例/s3c2410nor.c19/yaffs&yaffs2源代码/yaffs.tar.gz19/yaffs&yaffs2源代码/yaffs2.tar.gz20/USB串口…

进程、线程、协程三个概念傻傻分不清

点击蓝字关注我们进程&#xff0c;是并发执行的程序在执行过程中分配和管理资源的基本单位&#xff0c;每一个进程都有一个自己的地址空间&#xff0c;即进程空间或&#xff08;虚空间&#xff09;。进程空间的大小 只与处理机的位数有关&#xff0c;一个 16 位长处理机的进程空…

随机数发生器怎么用_用随机数发生器射击自己的脚

随机数发生器怎么用这将不是解释随机数生成器毕竟不是那么随机的文章之一。 因此&#xff0c;您中的那些人希望获得有关如何破解老虎机&#xff0c;继续前进的指南&#xff0c;在这里什么也看不到。 相反&#xff0c;它是有关一个不太常见的锁争用问题的帖子&#xff0c;该问题…

linux 4.14.2编译,vmware中linux内核2.6.14.4编译全过程_linux教程

很久就开始尝试编译Linux内核&#xff0c;但是总是遇到不少的问题&#xff0c;经过几十次的编译&#xff0c;直到现在才解决&#xff0c;人都要崩溃了。所以干脆把这个过程写出来&#xff0c;希望在你遇到同样问题的时候少走点弯路。我用的是Red Hat Linux 9. 内核版本是2.6.14…

C++ STL deque 容器底层实现原理(深度剖析)

点击蓝字关注我们什么是多态&#xff0c;多态有什么用途&#xff1f;定义&#xff1a;“一个接口&#xff0c;多种方法”&#xff0c;程序在运行时才决定调用的函数。实现&#xff1a;C多态性主要是通过虚函数实现的&#xff0c;虚函数允许子类重写override(注意和overload的区…

lambda ::_Lambdas中的例外:有点混乱的优雅解决方案

lambda ::考虑以下用于写入文件的功能&#xff1a; 该方法背后的想法是&#xff0c;以允许用户在不同的实施方式中通过InputStream的方法&#xff0c;以便writeToFile可以被称为例如用GZIPOuputStream &#xff0c; SnappyOuputStream &#xff08;快速压缩&#xff09;或简单…

​常问的16个C语言问题,你能答上来几个?

点击蓝字关注我们最近不少小伙伴在找工作&#xff0c;这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题&#xff0c;你看看能答上来几个呢&#xff1f;1用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09;#de…

centos linux 内核升级,Centos系统的升级及Linux 内核升级

系统及内核版本&#xff1a;[rootnode5 ~]# cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core)[rootnode5 ~]# uname -aLinux node6 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux更新仓库&#xff1a;[rootnode5 yu…

spring javaee_JavaEE还是Spring? 都不行! 我们呼吁新的竞争者!

spring javaee如果您一直在Twitter上关注一些Java的重要人物&#xff0c;或者在Reddit上阅读了“新闻”&#xff0c;那么您一定不会错过Spring和JavaEE宣传人员之间热闹的“贱人之战”&#xff08;请原谅我的法语&#xff09;。 首先&#xff0c;于尔根霍勒&#xff08;JrgenH…

C语言代码优化的方法

点击蓝字关注我们在本篇文章中&#xff0c;我(指原作者)收集了很多经验和方法。应用这些经验和方法&#xff0c;可以帮助我们从执行速度和内存使用等方面来优化C语言代码。简介在最近的一个项目中&#xff0c;我们需要开发一个运行在移动设备上但不保证图像高质量的轻量级JPEG库…

linux源码安装apache2,CentOS7编译安装Apache2

在LAMP环境下对于服务的安装是必不可少的&#xff0c;在linux环境下安装软件也有两种不同的方式&#xff0c;一种是yum安装当然了不同的linux发行版本使用略有不同&#xff0c;另一种是通过编译安装&#xff0c;编译安装要比yum安装要可控此&#xff0c;但是要比yum安装略微麻烦…

finally块_如何从finally块访问方法的结果值

finally块尽管JVM是基于堆栈的计算机 &#xff0c;但Java语言实际上并没有为您提供任何访问该堆栈的方法。 即使有时在极少数情况下&#xff0c;它也将非常有用。 一个例子 方法结果值放在堆栈中。 如果查看以下示例&#xff1a; public int method() {if (something)return …