慎重选择容器类型

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:  慎重选择容器类型一、回顾C++提供的容器Ø        标准的STL序列容器vector、string、deque和list。Ø        标准的STL关联容器set、multiset、map和multimap。
 

慎重选择容器类型

一、回顾C++提供的容器

Ø        标准的STL序列容器

vectorstringdequelist

Ø        标准的STL关联容器

setmultisetmapmultimap

Ø        非标准序列容器

slistrope

Ø        非标准的关联容器

hash_sethash_multisethash_maphash_multimap

Ø        几种标准的非STL容器

数组、bitsetvalarraystackqueuepriority_queue

 

二、一些常见的容器选择问题

Ø        你是否需要在容器的任意位置插入新元素?

如果需要,就选择序列容器;关联容器是不行的。

 

Ø        你是否关心容器中的元素是如何排序的?

如果不关心,则哈希容器是一个可行的选择方案;否则,你要避免哈希容器。

 

Ø        你选择的容器必须是标准C++的一部分吗?

如果必须是,就排除了哈希容器、slistrope

 

Ø        你需要哪种类型的迭代器?

如果它们必须是随机访问迭代器,则对容器的选择就被限定为vectordequestring。或许你也可以考虑rope。如果要求使用双向迭代器,那么你必须避免slist以及哈希容器的一个常见实现。

 

Ø        当发生元素的插入或删除操作时,避免移动容器中原来的元素是否很重要?

如果是,就要避免连续内存的容器。

 

Ø        容器中的数据的布局是否需要和C兼容?

如果需要兼容,就只能选择vector容器。

 

Ø        元素的查找速度是否关键的考虑因素?

如果是,就要考虑哈希容器,排序的vector,和标准关联容器 --- 或许这就是优先顺序。

 

Ø        如果容器内部使用了引用计数技术(reference counting),你是否介意?

如果是,就要避免使用string,因为许多string的实现都是用了引用计数。Rope也需要避免,因为权威的rope实现是基于引用计数的。当然,你需要某种表示字符串的方法,可以考虑vector<char>

 

Ø        对插入和删除操作,你需要事务语义(transactional semantics)吗?也就是说在插入和删除操作失败时,你需要回滚的能力吗?

如果需要,你就要使用基于节点的容器。如果对多个元素的插入操作需要事务语义,则你需要选择list,因为在标准容器中,只有list对多个元素的插入操作提供了事务语义。

 

Ø        你需要使迭代器、指针和引用变为无效的次数最少吗?

如果是这样,就要使用基于节点的容器,因为对这类容器的插入和删除操作从来不会使迭代器、指针和引用变为无效(除非它们指向了一个你正在删除的元素)。而针对连续内存容器的插入和删除操作一般会使指向该容器的迭代器、指针和引用变为无效。

 

Ø        如果序列容器的迭代器是随机访问迭代器类型,而且只要没有删除操作发生,且插入操作只发生在容器的末尾,则指向数据的指针和引用就不会变为无效,这样的容器是否对你有帮助?

这是非常特殊的情况,但如果你面对的情形正是如此,则deque是你所希望的容器。(有意思的是,当插入操作仅在容器末尾发生时,deque的迭代器有可能变为无效。deque是唯一的迭代器可能会变为无效而指针和引用不会变为无效的STL标准容器。)

目录
相关文章
|
3月前
|
Java API Spring
Spring容器如何使用一个注解来指定一个类型为配置类型
Spring容器如何使用一个注解来指定一个类型为配置类型
18 0
|
25天前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
241 2
|
1月前
|
存储 C++ 索引
在C++语言中容器的选择类型
在C++语言中容器的选择类型
12 0
|
1月前
|
存储 C++ 容器
set容器-内置类型指定排序规则讲解
set容器-内置类型指定排序规则讲解
15 0
|
9月前
|
Java 容器
Java容器类型以及使用方法(1)
Java容器类型以及使用方法(1)
|
10月前
|
索引 Python 容器
Python容器类型及对容器的操作,输入和输出(下)
Python容器类型及对容器的操作,输入和输出(下)
|
10月前
|
索引 Python 容器
Python容器类型及对容器的操作,输入和输出(上)
Python容器类型及对容器的操作,输入和输出
|
11月前
|
安全 Java 容器
并发编程-13线程安全策略之两种类型的同步容器
并发编程-13线程安全策略之两种类型的同步容器
61 0
|
存储 前端开发 Go
兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04
书接上回,容器数据类型是指一种数据结构、或者抽象数据类型,其实例为其他类的对象。 或者说得更具体一点,它是以一种遵循特定访问规则的方法来存储对象。 容器的大小取决于其包含的基础数据对象(或数据元素)的个数。Go lang中常用的容器数据有数组、切片和集合。
兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04
|
XML Java 数据格式
【Spring 从0开始】IOC容器的Bean管理 - 基于XML,注入集合类型属性
【Spring 从0开始】IOC容器的Bean管理 - 基于XML,注入集合类型属性
【Spring 从0开始】IOC容器的Bean管理 - 基于XML,注入集合类型属性