欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

STL容器之Deque-《C++标准库(第二版)》读书笔记

发布时间:2025/4/5 c/c++ 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 STL容器之Deque-《C++标准库(第二版)》读书笔记 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

写在前面:本文是阅读《C++标准库(第二版)》的读书笔记。

文章目录

    • 7.4 Deque
      • 7.4.1 Deque的能力
      • 7.4.2 Deque的操作函数
      • 7.4.3 Exception Handling
      • 7.4.4 Deque运用实例

7.4 Deque

容器deque(发音为“deck”)和vector非常相似。它也采用dynamic array来管理元素,提供随机访问,并有着和vector几乎一模一样的接口。不同的是deque的dynamic array头和尾都开放,因此能在头尾两端进行快速安插和删除。

为了提供这种能力,deque通常实现为一组独立区块(a bunch of individual blocks) ,第一区块朝向某方向扩展,最后的区块朝另一方向扩展。

使用deque之间,必须先包含头文件< deque> :#include< deque>
其中,deque类型定义于命名空间std内的一个 class template:

namespace std{tamplate< typename T,typename Allocator = allocator<T>>class deque; }

和vector相同,这里的第一个template参数用来指明元素类型,第二个template实参可有可无,用来指定内存模型(memory model),默认为allocator.

7.4.1 Deque的能力

Deque和vector相比,功能上的差异如下:

  • 两端都能快速安插元素和移除元素(vector只能在尾部可以)。这些操作可以在摊提的常量时间内完成。
  • 访问元素时deque内部结构会多一个间接过程,所以元素的访问和迭代器的动作会稍微慢一些。
  • 迭代器需要在不同的区块间跳转,所以必须是个smart pointer,不能是个普通的pointer。
  • 在内存区块大小有限制的系统中,deque可以内含更多元素,因为它使用不止一块内存。因此deque的max_size()可能更大。
  • Deque不支持对容量和内存重新分配时机的控制。特别要注意的是,除了头尾两端,在任何地点安插和删除元素都将导致指向deque元素的任何pointer、reference和iterator失效。不过,deque 的内存重分配由于vector,因为其内部结构显示,deque不必在内存重新分配时复制所有元素。
  • Deque会释放不再使用的内存区块。deque的内存大小使可所建的,但要不要这么做,以及如何做,由实现决定。
  • Deque的的以下特性和vector差不多:

  • 在中段安插、移除元素的速度相对较慢,因为所有元素都需要移动以腾出或者填补空间。
  • 迭代器属于random-access iterator(随机访问迭代器)。
  • 总之,以下情形最好使用deque:

    • 你需要在两端安插和删除元素(这是deque的拿手好戏)。
    • 无需指向容器内的元素。
    • 要求”不再使用的元素必须释放“(不过,C++ standard 对此无任何保证)。

    7.4.2 Deque的操作函数

    下面列出了deque的操作函数。

    deque的各项操作只有以下两点和vector不同:

  • deque不提供容量操作 (capacity()和reserve()).
  • deque直接提供函数完成头部元素的安插和删除(push_front()和pop_front())。
  • 其他操作都相同。

    请注意,C++11 添加了 shrink_to_fit() ,那是个不具有强制力(nonbinding)的函数,负责缩小内部内存以匹配元素个数。你可能会认为shrink_to_fit()对deque没意义,因为deque本来就会释放不再使用的区块内存。然而,deque内部用来存放”指向独立区块“的所有pointer的空间,通常不会被缩小,如果用了这个函数就有可能真的被缩小。

    还有一些值得考虑的事情:

  • 除了at(),没有任何成员函数会检查”索引或迭代器是否有效“。
  • 除了头尾两端,在任何地点安插和删除元素都将导致指向deque元素的任何pointer、reference和iterator失效。
  • 7.4.3 Exception Handling

    原则上deque提供的异常处理和vector提供的一样。新增的操作函数push_front()和pop_front()分别对应于push_back()和pop_back()。因此C++标准库保证下列行为:
    如果以push_back() 、 push_front()安插元素时发生异常,则该操作不带来任何效应。
    pop_back()和 pop_front() 不会抛出任何异常。

    7.4.4 Deque运用实例

    #include<iostream> #include<deque> #include<iterator> #include<algorithm> #include<string> using namespace std;int main(){//create empty deque of stringsdeque<string> coll;//insert several elementscoll.assign(3,string("string"));//复制3个 ”string“ ,赋值给coll coll.push_back("last string") ; //尾部添加一个字符串 coll.push_front("first string"); //头部添加一个字符串 //print elements separated by newlinescopy( coll.cbegin(),coll.cend(),ostream_iterator<string>(cout,"\n"));cout<<endl;//remove first and last elementcoll.pop_back();coll.pop_front();//insert "another" into every element but the firstfor(int i=1; i<coll.size();i++)coll[i]="another"+coll[i];// change size to four elementscoll.resize(4,"resized string"); //将元素数量改为4,如果size()变大,多出来的新元素都是”resized string“的拷贝 //print elements separated by newlinescopy( coll.cbegin(),coll.cend(),ostream_iterator<string>(cout,"\n"));cout<<endl;}

    输出结果

    总结

    以上是生活随笔为你收集整理的STL容器之Deque-《C++标准库(第二版)》读书笔记的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。