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

相关文章

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

linux配置podman阿里云容器镜像加速器详解

《linux配置podman阿里云容器镜像加速器详解》本文指导如何配置Podman使用阿里云容器镜像加速器:登录阿里云获取专属加速地址,修改Podman配置文件并移除https://前缀,最后拉取镜像... 目录1.下载podman2.获取阿里云个人容器镜像加速器地址3.更改podman配置文件4.使用po

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方