ramlife

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

迭代器的作用

STL 为了泛型的思想,推崇算法的复用,所以把和数据相关的容器与实际计算的算法分离。这时候算法就需要能够通过统一的接口从不同的容器中获取数据,这个统一的接口就是迭代器,可以向前,向后,随机从容器中读取和写入数据。

参考:
迭代器是什么,C++ STL迭代器(iterator)用法详解
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510777511959.html

为什么迭代器使用 for 的时候,使用 != 而不是 < 来和 end 做对比?

因为只有随机读取的容器才支持 < 这样的比较索引的方法,正常的正向容器只能支持 !=

容器中支持的函数成员

见:
C++序列式容器(STL序列式容器)是什么
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510777611960.html

array 容器比数组便捷

  • 使用 swap 可以直接交换两个 array 的数据。
  • 使用 = 直接赋值给另外一个 array
  • 使用 < 等可以直接比较两个 array 的数据。

参考:
C++ array容器:普通数组的“升级版”
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510778111964.html

vector

  • 可以直接赋值给另外一个。
  • 可以通过指针或迭代器把一个 vector 的一部分复制给另外一个。 std::vector<int>value2(std::begin(value1),std::begin(value1)+3);//value2保存{1,2,3}
  • 可以用 swap 交换。
  • front(), back() 获取首尾元素。
  • data() 获取首元素指针。
  • reserve() 改变的时容量 capacity, resize() 改变的是元素个数 size。 容量和个数,实际的类型类似于 vector<int>::size_type
  • 内部源码使用三个指针, _Myfirst 指向首,_Mylast 指向末元素,_myend 指向末空间。
  • 向 vector 中添加元素时,不能使用迭代器,只能使用成员函数,push_back 和 emplace_back,在底层实现时,push_back 在其他地方创建对象,然后优先移动,如果没有移动就复制到 vector 末尾; emplace_back 更加高效,可以直接在 vector 末尾创建对象,省去了移动或者复制的步骤,所以 c11 之后,建议使用 emplace_back 和 emplace 更有效率。
  • insert() 可以添加一个,或者多个元素,但是 emplace 只能添加一个元素。 但是效率上面还是 emplace 高。
  • remove() 把等于的元素移动到末尾,并不实际的删除,所以 size 和 capacity 也不改变。 remove 需要和 erase 搭配使用。
  • 因为 vector 会自动扩容,正常时原来的2倍容量。所以如果能够预计到需要的容量,最好一开始就 reserve 相应的容量,这样只要扩容一次即可,否则可能需要扩容多次。shrink_to_fit() 可以缩减容量和元素个数一致。
  • swap 方法也可以缩减容量和个数一致, vector<int>(myvector).swap(myvector); 创建一个临时 vector 对象,然后把原来的 vector 中的元素复制过去,最后把这个临时的空间交换给原来的 vector,释放掉原来 vector 占有的空间。类似的 vector<int>().swap(myvector); 可以直接容量和个数归零。
  • 不要使用 vector<bool> ,因为具体实现 bool 是比特位。 如果个数一开始就确定了,可以使用 bitset<bool>,如果个数不确定,可以使用 deque<bool> .

参考:
C++ STL vector容器详解
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510778211965.html
C++ STL vector容器访问元素的几种方式
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510778411967.html
C++ vector容量(capacity)和大小(size)的区别
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510778511968.html
深度剖析C++ vector容器的底层实现机制
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510778611969.html
C++ STL vector添加元素(push_back()和emplace_back())详解
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510778711970.html
C++ STL vector插入元素(insert()和emplace())详解
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510778911971.html
C++ STL vector删除元素的几种方式(超级详细)
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510779011972.html
如何避免vector容器进行不必要的扩容?
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510779111973.html
vector swap()成员方法还可以这样用!
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510779211974.html
切忌,vector不是存储bool类型元素的vector容器!
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510779311975.html

deque

  • deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中
  • 迭代器不能用来初始化空的 deque
  • 底层是由多个连续空间组成的,这些连续空间的首地址放在一个数组中。
  • 迭代器维护三个指针,分别是 cur 当前元素,first 连续空间最前,last 连续空间末尾。还有一个 node 二级指针,指向首地址数组。
  • 容器本身维护两个迭代器,分别是 start 最前连续空间,finish 最后连续空间。还有一个 node 二级指针,指向首地址数组。
  • 没有 data() 这个成员函数,因为不是连续内存。并且直接使用指针,很危险。可以使用 [] 或者 at().
  • 插入删除,类似 vector.

参考:
C++ STL deque容器(详解版)
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510779411976.html
C++ STL deque容器迭代器用法详解
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510779611977.html
深度剖析deque容器底层实现原理
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510779711978.html
C++ STL deque容器访问元素(4种方法)
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510779811979.html

list

  • 不能随机读取,其他类似其他容器。 首的前向指针是 null,尾的后向指针是 null
  • 是双向迭代器,不是随机迭代器,不支持类似 p1[i], p1+=i, p1<p2 这样的操作。
  • 插入或者删除,只有指向插入删除的那个迭代器失效,其他的迭代器正常。但是数目不对,可能造成遍历的遗漏。

参考:
C++ list(STL list)容器完全攻略(超级详细)
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510780011981.html
C++ STL list迭代器及用法(详解版)
http://www.cdsy.xyz/computer/programme/stl/20210307/cd161510780211982.html

posted on 2022-08-31 18:23  ramlife  阅读(35)  评论(0编辑  收藏  举报