C++ deque详解及用法

一、c++ deque函数

C++ STL中的deque是一种支持双端插入和删除的线性容器。deque中的元素可以在两端进行push和pop。下面是deque常用的函数:

#include <deque>

// deque构造函数
deque();
deque(int n);
deque(int n, const T& v);
deque(const deque& x);

// 元素访问
reference operator[](int n);
reference at(int n);
reference front();
reference back();

// 容量
bool empty() const;
size_type size() const;
size_type max_size() const;

// 修改容器
void clear();
iterator insert(iterator position, const T& x);
void insert(iterator position, int n, const T& x);
void insert(iterator position, InputIterator first, InputIterator last);
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
void push_back(const T& x);
void push_front(const T& x);
void pop_back();
void pop_front();
void swap(deque& x);

// 比较器
bool operator==(const deque& x, const deque& y);
bool operator!=(const deque& x, const deque& y);
bool operator<(const deque& x, const deque& y);
bool operator<=(const deque& x, const deque& y);
bool operator>(const deque& x, const deque& y);
bool operator>=(const deque& x, const deque& y);

二、c++ deque实现

c++ STL中deque的实现一般是由一个中控器(指针数组)与多个缓冲区组成,中控器维持着整个deque的结构,每个缓冲区存放着一定数量的元素,以此来保证deque的双端插入和删除。下面是一个简单的deque实现:

template <typename T, typename Alloc = alloc, size_t BufSiz = 0>
class deque {
public:
    typedef T value_type;
    typedef value_type* pointer;
    typedef size_t size_type;

private:
    typedef simple_alloc data_allocator;
    typedef simple_alloc map_allocator;

    typedef pointer* map_pointer;

    size_type initial_map_size() const { return 8; }

    map_pointer map_;
    size_type map_size_;

    pointer allocate_node() { return data_allocator::allocate(buffer_size()); }
    void deallocate_node(pointer p) { data_allocator::deallocate(p, buffer_size()); }
    size_type buffer_size() const { return BufSiz != 0 ? BufSiz : sizeof(T) < 512 ? 512 / sizeof(T) : 1; }

public:
    deque() : map_(nullptr), map_size_(0) { create_map_and_nodes(0); }
    deque(int n, const value_type& value) : map_(nullptr), map_size_(0) { fill_initialize(n, value); }

    void push_front(const value_type& value);
    void push_back(const value_type& value);
    void pop_front() {}
    void pop_back() {}
    reference operator[](size_type n) const {}
    reference at(size_type n) const {}
    reference front() const {}
    reference back() const {}
    size_type size() const {}
    bool empty() const {}
    void swap(deque& rhs) {}
    iterator begin() const {}
    iterator end() const {}

    ~deque() {}
};

三、c++ deque用法

deque的使用方式与vector类似,不同的是deque可以在头尾两端进行操作。下面是一个简单的deque使用例子:

#include <iostream>
#include <deque>
using namespace std;

int main() {
    deque<int> myDeque;
    myDeque.push_back(1);        // insert 1 at the end of deque
    myDeque.push_front(2);       // insert 2 at the beginning of deque
    myDeque.insert(myDeque.end(), 3);    // insert 3 before the position pointed by the iterator
    myDeque.pop_back();          // remove the last element of deque
    myDeque.pop_front();         // remove the first element of deque
    myDeque.clear();             // remove all of the elements of deque
    return 0;
}

四、c++ deque底层实现

deque底层一般由中控器和多个缓冲区组成,中控器维护着整个deque的结构,每个缓冲区存放着一定数量的元素,通过缓冲区之间的连接,形成了一个双向链表的结构,支持双端插入和删除。deque底层实现的优越性在于可以避免插入或删除时的数据迁移,但在空间利用率上不如vector(vector只需要一个连续的内存空间即可存放所有元素)。

五、c++的缺点

在使用deque时需要考虑与vector等其他容器的选择,c++的缺点主要在于对于大规模数据的处理严重依赖于底层硬件。同时在程序设计的过程中,需要注意指针空指针问题、内存泄漏等缺陷与陷阱。

六、c和指针选取

c和指针是很常用的高级编程语言,但与c++相比,c的面向对象能力较弱,在程序设计的过程中需要手动维护内存、支持分离编译等功能,但也由于这些特性使得c代码执行速度快、内存占用小。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/286704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-23 03:48
下一篇 2024-12-23 03:48

相关推荐

  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25

发表回复

登录后才能评论