
《白话C++》第10章 迭代器,容器,算法
文章平均质量分 79
《白话C++》第10章 迭代器,容器,算法的学习笔记
yanzhenxi
这个作者很懒,什么都没留下…
展开
-
《白话C++》第10章 Page136 常用容器 10.6.5 std::set和std::multiset (未完待续)
这很好理解,因为一个元素要插在sets(复数,表示set和multiset,下同)中的哪个位置,这是调用者控制不了的。回忆vector,list等容器,它们的insert都还有一个“pos”的入参,用于只是新元素插在哪个位置上,前面使用的sets的insert函数没有这个指示。前面看到multiset的insert操作,返回插入的位置(迭代器),set不允许插入比较结果相同的元素,调用insert就有可能失败,set如果插入新元素失败,那么返回中的“second”值为false.原创 2024-03-04 01:22:48 · 420 阅读 · 0 评论 -
《白话C++》第10章 Page133 常用容器 10.6.5 std::set和std::multiset
vector,deque,list 这类容器内部的元素的(逻辑)存储次序, 由各元素插入选择的位置共同决定,调用一个push_back()插入新元素,新元素就肯定是在容器的尾部,除非事后我们调用sort操作。如果想让学生从高排到低,粗暴的做法是认为地将 Student 中的 “<” 操作符返回 “反逻辑” ,符号是“小于号”,但比较结果是 “大于” 的判断。不行,sets不会聪明到你写一个大于比较符重载,它就自动在内部改用大于判断,我们还是需要写一个判断式,作为第二个模板参数传入。原创 2024-03-03 22:58:21 · 443 阅读 · 0 评论 -
《白话C++》第10章 Page126 常用容器 10.6.4 std::list
因为,采用额外的指针维护前后关系,所以列表节点的内存完全不需要连续,这就让节点的插入,删除,甚至链表的合并操作,变得简单。要合并两个vector,需要在第一个vector开辟一大块连续内存,而合并两个列表,只需要让前一列表最后一个节点的“下一节点指针”,指向第二个列表的首指针,再让后者的“前一节点指针”,指向前者即可。另外一点,list胜出的是:vector和deque由于内存是连续的,当变化之后,容易造成所有数据移位,结果原来代码中使用的迭代器,指针,引用等,很多情况下会失效,需要重新指向。原创 2024-03-03 21:18:52 · 915 阅读 · 0 评论 -
《白话C++》第10章 Page124 常用容器 10.6.3 std::deque
这些家伙都允许你使用[i]访问数据,是时候了,认真复习,对比,归纳,整理这些工具之间的同与异,长处短处,适用面,如何配合?再次强调:访问元素时,除了at(index)会做检查越界,并在越界时抛出out_of_ranges异常之外,其他通过[ ]、front()、back()操作,都不做越界检查。std::vector的特点是内存连续,好处是提供随机访问,坏处是除了在尾部插入或删除数据,在其他地方插入数据或删除数据,都很低效。可见,内存连续带来了“随机访问”的好处,但也带来前面提及的低性能的坏处。原创 2024-03-03 18:14:58 · 764 阅读 · 0 评论 -
《白话C++》第10章 Page120 常用容器 10.6.2 std::vector
也就是说,vector分配的内存,往往要比实际存储的元素所占用的内存要大。则可以向一个合法的位置插入元素,当然,相比push_back,它的性格会慢上许多,当然,哪怕是push_back,由于需要保证在内存连续的前提下分配内存,所以没办法100%保障行。std::vector号称“动态数组”,支持构建时动态指定元素个数(并且分配相应的连续内存),那是基本功(这一点是std::array所不具备的)。vector最大的特点是所存储的数据在内存上是连续的,可以通过第0个元素取址,获得数据的起始内存地址。原创 2024-03-03 09:25:51 · 863 阅读 · 0 评论 -
《白话C++》第10章 Page119 常用容器 10.6.1 std::array
再加上size(),empty()等操作,array 比 vector 高效,比原生数组安全和方便,做C++语言中有个性的数组类型,它做到了。除非我们一开始定义的是一个大小为0的 array 对象,否则通过 std::array 对象调用empty(),总是返回 false,它的存在只是为了让 std::array 可以更好地参与标准库的基于容器的算法。std::array 看着远处舞台上风光的 std::vector,心里暗自说:“人们都说我在模仿他,其实我要做一个和它不同的数组!原创 2024-03-02 20:43:16 · 415 阅读 · 0 评论 -
《白话C++》第10章 Page115 10.5.2 迭代器辅助操作
支持逆向遍历的容器,通常都提供了rbegin()和rend(),作用就像begin()和end(),只不过rbegin()其实是容器的尾端,而rend()是容器的开端。rbegin()的位置相当于end(),但透过rbegin()访问一个数据,访问到的是其前面的那个元素(因为我们不能在end()位置上访问数据),如图10-13所示。正向迭代器表里如一,表现和实际指向的都是同一个节点。如果这个容器是空的,那么begin()和end()是相等的,所以for循环的判断条件在空容器的情况下,也是适用的。原创 2024-03-02 18:19:55 · 982 阅读 · 0 评论 -
《白话C++》第10章 Page109 10.5.1 迭代器基本分类
随机访问迭代器”也是一种“双向访问迭代器”,事实上它可以想访问容器哪个元素,就直接跳去访问这个元素(这里的随机和随机数意义不同,更多是随心所欲的一是)。以上主要以“流迭代器”为例说明输入和输出迭代器,千万别误以为纯正的容器,比如vector,list等没有输入输出迭代器(倒是“流迭代器”从实现的角度上看,算不得“纯正”的迭代器,它们更像某种适配器)。在标准库中,它是一个类模板。迭代器以只读型迭代器居多,但也有一些写入型迭代器,它会在迭代过程中,改变容器内部数据,造成正在访问该容器的其他迭代器失效。原创 2024-03-02 15:03:50 · 878 阅读 · 0 评论