Effective STL:第二部分 容器

2024-06-08 13:18

本文主要是介绍Effective STL:第二部分 容器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第二部分 vector和容器



第十三条:vector和string优先于动态分配的数组

当你决定用new来分配内存时,将承担以下责任:

n  你必须确保以后会有人调用delete来删除所分配的内存,否则将导致资源泄露。

n  你必须确保调用了正确的delete形式。比如单个对象调用delete;分配了数组,则调用delete[]。

n  你必须确保只delete了一次。如果一次分配被多次delete,结果也是不确定的。

如果使用vector和string,则可以减少以上的担忧。

如果你使用的string是以引用计数来实现的,而又在多线程的环境中,可以考虑以下几种做法:

n  检查库实现,看看是否可以禁止引用计数。这种方法不可移植。

n  寻找或开发一个不适用引用计数的string实现。

n  考虑使用vector<char>而不是string,会丢失使用string的成员函数的机会,但可以通过stl算法实现。



第十四条使用reserve来避免不必要的分配。

Vector和的string的自动增长是这样实现的:

n  当容器容量不足时,分配一块大小为当前容量+max(当前容量,新增容量) 的新内存。大多数时候,都是每次以2的倍数增长,即容量需要扩张时,它们的容量加倍。

n  把容器的所有元素从旧的内存复制到新的内存。

n  析构掉旧内存中的对象

n  释放旧内存

因此,容器的自动增长是会很耗时的。使用reserve能避免容器不必要的重复分配。主要有两种方式:

n  若能确切知道或大概预计容器中最终会有多少元素,则可以使用reserve。

n  先预留足够大的空间,然后,当把所有数据都加入以后,去除多余的容量。可以考虑使用“swap技巧“(见17条)。


第十五条 注意string实现的多样性

几乎每个string实现都包含以下信息:

n  字符串的大小

n  用于存储该字符中的字符的内存的容量

n  字符串的值

n  它的分配子的一个拷贝,这个字段是可选的

n  对数的引用计数。

String的实现比咋看上去有更多的自由度;同样明显的是,不同的实现以不同的方式利用了这种设计上的灵活性。这些区别总结如下:

n  String的值可能会被引用计数

n  String对象大小的范围可以是一个char*指针的大小的1-7倍

n  创建一个新的字符串值可能需要零次,一次或两次动态分配内存

n  String对象可能共享,也可能不共享其大小和容量信息。

n  String可能支持,也可能不支持针对单个对象的分配子

n  不同的实现对字符内存的最小分配单位有不同的策略。

其实stl也有很多实现版本,每个版本的string实现都是不太一样的。以后会再找一个string实现源码具体分析。



第十六条了解如何把vector和string数据传给旧的API

Vector和string的数据传送到旧API方式:

n  vector保证和数组具有同样的布局,可以直接把vector中的数据当做数组来对待。&V[0]即数组的首地址指针。反之亦然,可以将数组元素直接复制到vector的内存地址。

n  String提供c_str()函数来返回一个指向字符串的值的指针,且可用于C。因为string中的数据不一定是存储在连续的内存中,而且不一定以空字符结尾。所以不能随便修改指针指向内存的值,特意用显式调用作为提醒。

n  对于其他类型的stl容器,可以将数据先拷贝到vector,用vector作为中介与旧API相互传送数据

这篇关于Effective STL:第二部分 容器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042294

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

C++ STL 适配器

系列文章目录 模板特例化,偏特化,左右值引用 https://blog.csdn.net/surfaceyan/article/details/126794013 C++ STL 关联容器 https://blog.csdn.net/surfaceyan/article/details/127414434 C++ STL 序列式容器(二) https://blog.csdn.net/surfac

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern