C++(STL):10---vector空间分配

vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块头的array了,我们可以安心使用array,吃多少用多少。

    vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率。一旦vector的旧有空间满载,如果客户端每新增一个元素,vector的内部只是扩充一个元素的空间,实为不智。因为所谓扩充空间(不论多大),一如稍早所说,是” 配置新空间/数据移动/释还旧空间 “的大工程,时间成本很高,应该加入某种未雨绸缪的考虑。

    另外,由于 vector维护的是一个连续线性空间,所以vector支持随机存取 。

    注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此, 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了 。这是程序员易犯的一个错误,务需小心。

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

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

相关文章

Struts1.x和Struts2.0的Action的区别

Struts1.x Struts2.0 1.接口: Struts1.x必须继承org.apache.struts.action.Action或者其子类 Struts2.0无须继承任务类型或实现任何接口 2.表单数据: Struts1.x表单数据封住在FormBean中 Struts2.0表单数据包含在Action中,通过Getter和…

C++(STL):15--- list源码剖析

一、list概述 总的来说:环形双向链表特点:底层是使用链表实现的,支持双向顺序访问在list中任何位置进行插入和删除的速度都很快不支持随机访问,为了访问一个元素,必须遍历整个容器与其他容器相比,额外内存开销大设计目的:令容器在任何位置进行插入和删除都很快何时使用:…

C++(STL):14--- forward_list比list更高效的容器

forward_list 是 C++ 11 新添加的一类容器,其底层实现和 list 容器一样,采用的也是链表结构,只不过 forward_list 使用的是单链表,而 list 使用的是双向链表(如图 1 所示)。 图 1 单链表( a) )和双向链表( b) ) 图 1 中,H 表示链表的表头。 通过图 1 不难看出,使用…

leetcode 190. 颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。 示例 1: 输入: 00000010100101000001111010011100 输出: 00111001011110000010100101000000 解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192&…

C++(STL):12--- list基本介绍

list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。图 1 展示了 list 双向链表容器是如何存储元素的。 图 1 list 双向链表容器的存储结构示意图 可以看到…

C++(STL):13--- list插入和访问元素

前面章节介绍了如何创建 list 容器,在此基础上,本节继续讲解如何向现有 list 容器中添加或插入新的元素。list 模板类中,与“添加或插入新元素”相关的成员方法有如下几个: push_front():向 list 容器首个元素前添加新元素;push_back():向 list 容器最后一个元素后添加新…

leetcode266. 回文排列

给定一个字符串,判断该字符串中是否可以通过重新排列组合,形成一个回文字符串。 示例 1: 输入: "code" 输出: false 示例 2: 输入: "aab" 输出: true 示例 3: 输入: "carerac" 输出…

Linux下MySQL忘记root密码及解决办法

第一步 修改MySQL的配置文件(默认为/etc/my.cnf),在配置文件的[mysqld]标签下加入一行“skip-grant-tables”,并保存文件sudo vim /etc/my.cnf.d/mysql-server.cnf 第二步 重启MySQL服务sudo service mysqld restart 第三步 输入“mysql -u root -p”命令进入数据库,…

MySQL -通过调整索引提升查询效率

我们遇到的最容易引起困惑的问题就是索引列的顺序。正确的顺序依赖于使用该索引的查询,并且同时需要考虑如何更好地满足排序和分组的需要(顺便说明,本节内容适用于B-Tree索引;哈希或者其他类型的索引并不会像B-Tree索引一样按顺序存储数据)。在一个多列B-Tree索引中,索引…

leetcode270. 最接近的二叉搜索树值

给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的数值。 注意: 给定的目标值 target 是一个浮点数 题目保证在该二叉搜索树中只会存在一个最接近目标值的数 示例: 输入: root [4,2,5,1,3]&a…

C++(STL):21---deque之源码剖析

一、deque概述 deque的使用语法:总的来说:是一个双端队列特点:支持快速随机访问(支持索引取值)在头尾插入/删除速度很快deque是非常复杂的数据结构,由多个vector组成,迭代器使用时会在不同的区间跳转存取元素的时候,deque的内部结构会多出一个间接过程,相比vector操作…

C++(STL):19---deque之删除和emplace用法

deque 容器中,无论是添加元素还是删除元素,都只能借助 deque 模板类提供的成员函数。表 1 中罗列的是所有和添加或删除容器内元素相关的 deque 模板类中的成员函数。 表 1 和添加或删除deque容器中元素相关的成员函数 成员函数功能push_back()在容器现有元素的尾部添加一个元…

Struts2.x中获取request,response,session的方式

Struts2.x中获取request,response,session的方式有两种:非IOC方式和IOC方式: 一:非IOC方式: 要获得request,response,session 这些对象,关键是Struts2.x中的com.opensy…

leetcode208. 实现 Trie (前缀树)

实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。 示例: Trie trie new Trie(); trie.insert("apple"); trie.search("apple"); // 返回 true trie.search("app"); // 返回 false trie.startsWith…

C++(STL):20---deque容器访问元素

和 array、vector 容器一样,deque可以采用普通数组访问存储元素的方式,访问 deque 容器中的元素,比如: #include <iostream>#include <deque>using namespace std;int main(){deque<int>d{ 1,2,3,4 };cout << d[1] << endl;//修改指定下标位…

C++(STL):17---deque之迭代器使用

deque 容器迭代器的类型为随机访问迭代器,deque 模板类提供了表 1 所示这些成员函数,通过调用这些函数,可以获得表示不同含义的随机访问迭代器。 表 1 deque 支持迭代器的成员函数 成员函数功能begin()返回指向容器中第一个元素的正向迭代器;如果是 const 类型容器,在该函…

C++(STL):16---deque之常规用法

deque 是 double-ended queue 的缩写,又称双端队列容器。前面章节中,我们已经系统学习了 vector 容器,值得一提的是,deque 容器和 vecotr 容器有很多相似之处,比如: deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。d…

C++(STL):22 ---序列式容器queue使用

queue是队列,特点是先进先出,后进后出,你可以理解为数据结构里的队列模型,他只允许你访问 queue<T> 容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。许多程序都使用了 queue 容器。queue 容器可以用来表示超市的结账队列或服务…

C++(STL):23 ---序列式容器queue源码剖析

一、queue概述 queue是一种先进先出(First In First Out,FIFO)的数据结构。它有两个出口,形式如下图所示特点:queue允许新增元素、移除元素、从最底端加入元素、取得最顶端元素但除了最底端可以加入、最顶端可以取出外,没有任何其他方法可以存取queue的其他元素。换言之q…

leetcode374. 猜数字大小

我们正在玩一个猜数字游戏。 游戏规则如下&#xff1a; 我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。 每次你猜错了&#xff0c;我会告诉你这个数字是大了还是小了。 你调用一个预先定义好的接口 guess(int num)&#xff0c;它会返回 3 个可能的结果&#xff08;-1&…