C/C++ - 容器deque

目录

容器特性

deque

容器特性

使用场景

构造函数

默认构造函数

填充构造函数

范围构造函数

拷贝构造函数

大小函数

函数:size()​​

增加函数

函数:push_back()​​

函数:push_front()​​

函数:insert()​​

删除函数

函数:pop_back()​​

函数:pop_front()​​

函数:erase()​​

函数:clear​​

函数:resize​​

修改函数

直接索引访问修改元素

使用迭代器修改元素


容器特性

  • deque
    • 在C++标准模板库(STL)中,deque​​(双端队列)是一种序列容器,它允许从容器的前端和后端高效地插入和删除元素。与vector​​相比,deque​​提供了更灵活的数据结构,使得在序列的两端操作元素变得更加高效。
  • 容器特性
    • 动态大小:类似于vector​​,deque​​的大小可以根据需要动态扩展或缩减。
    • 随机访问:deque​​支持随机访问,即可以直接通过索引访问任何元素,其时间复杂度为O(1)。
    • 高效的插入和删除:在deque​​的前端和后端插入或删除元素的操作非常高效,相比于vector​​在前端的操作要快得多,因为deque​​设计为支持在两端高效操作。
    • 非连续存储:deque​​内部可能采用多个连续的数组来存储数据(具体实现依赖于编译器),这与vector​​的单一连续存储区别明显。这种设计支持了deque​​在两端的高效操作,但可能使得随机访问的性能略逊于vector​​。
  • 使用场景
    • 需要频繁在序列两端添加或移除元素的场景:当你需要一个可以从头部和尾部都能快速插入和删除元素的容器时,deque​​是一个理想的选择。例如,在实现数据结构如队列(FIFO)和双端队列(Deque)时特别有用。
    • 需要随机访问元素,但又要比vector​​更灵活地在两端操作的场景:如果你的用例需要随机访问元素,同时也需要在容器的两端进行高效的插入和删除操作,deque​​提供了比vector​​更优的选择。

构造函数

  • 默认构造函数
    • 函数:默认构造函数
    • 用途:创建一个空的 std::deque​​ 容器。
    • 语法:std::deque dequeName;​​
    • 返回值:无返回值
    • 
      #include 
      #include 
      
      int main() {
          std::deque myDeque;
          std::cout << "Size of myDeque: " << myDeque.size() << std::endl;
          return 0;
      }
      
  • 填充构造函数
    • 函数:填充构造函数
    • 用途:创建一个具有指定数量元素的 std::deque​​ 容器,每个元素都是拷贝自给定的值。
    • 语法:std::deque dequeName(size_type n, const T& value);​​
    • 返回值:无返回值
    • #include 
      #include 
      
      int main() {
          std::deque myDeque(5, 10);  // 5个元素,每个都是10
      
          std::cout << "Size of myDeque: " << myDeque.size() << std::endl;
          for(int elem : myDeque) {
              std::cout << elem << " ";
          }
          return 0;
      }
      
  • 范围构造函数
    • 函数:范围构造函数
    • 用途:创建一个 std::deque​​ 容器,其内容是由指定范围内的元素构成。
    • 语法:std::deque dequeName(InputIterator first, InputIterator last);​​
    • 返回值:无返回值
    • #include 
      #include 
      #include 
      
      int main() {
          std::vector vec = {1, 2, 3, 4, 5};
          std::deque myDeque(vec.begin(), vec.end());
          std::cout << "Elements in myDeque: ";
          for(int elem : myDeque) {
              std::cout << elem << " ";
          }
          return 0;
      }
      
  • 拷贝构造函数
    • 函数:拷贝构造函数
    • 用途:创建一个新的 std::deque​​ 容器,其内容是另一个 std::deque​​ 容器的副本。
    • 语法:std::deque dequeName(const std::deque& other);​​
    • 返回值:无返回值
    • #include 
      #include 
      
      int main() {
          std::deque originalDeque = {1, 2, 3, 4, 5};
          std::deque myDeque(originalDeque); // 使用originalDeque创建myDeque
      
          std::cout << "Elements in myDeque: ";
          for(int elem : myDeque) {
              std::cout << elem << " ";
          }
          return 0;
      }
      
  • 移动构造函数 (C++11)

    • 函数:移动构造函数
    • 用途:利用另一个 std::deque​​ 容器构建新容器,同时不复制对象,而是移动它。
    • 语法:std::deque dequeName(std::deque&& other);​​
    • 返回值:无返回值
    • #include 
      #include 
      
      int main() {
          std::deque originalDeque = {1, 2, 3, 4, 5};
          std::deque myDeque(std::move(originalDeque)); // 移动构造
      
      
          std::cout << "Elements in myDeque: ";
          for(int elem : myDeque) {
              std::cout << elem << " ";
          }
          std::cout << "\nSize of originalDeque: " << originalDeque.size();  // 应该为0
      
          return 0;
      }
      
  • 内存布局

    • 成员字段

      C/C++ - 容器deque_第1张图片

    • MAP数组

    • C/C++ - 容器deque_第2张图片

    • C/C++ - 容器deque_第3张图片

大小函数

  • 大小函数

    • 函数:size()​​
    • 用途: 用于获取C++中deque​​(双端队列)包含的元素数量。

    • 语法:deque_name.size();​​

    • 返回值: 返回deque​​中的元素数量。返回类型为std::deque::size_type​​,通常是一个无符号整型。

      
      #include 
      #include 
      
      int main() {
          std::deque myDeque; // 创建一个包含整数的deque
      
      
          // 向deque中添加元素
      
          myDeque.push_back(10); // 在队列尾部添加一个元素
      
          myDeque.push_front(5); // 在队列头部添加一个元素
      
          myDeque.push_back(20); // 再次在队列尾部添加一个元素
      
      
          // 显示deque的大小
      
          std::cout << "deque中包含 " << myDeque.size() << " 个元素。" << std::endl;
          // 输出:deque中包含 3 个元素。
      
          return 0;
      }
      

增加函数

  • 函数:push_back()​​
    • 用途: 在deque​​的末尾添加一个元素。
    • 语法:deque_name.push_back(value);​​
    • 返回值: 无。
  • 函数:push_front()​​
    • 用途: 在deque​​的开头添加一个元素。
    • 语法:deque_name.push_front(value);​​
    • 返回值: 无。
  • 函数:insert()​​
    • 用途: 在deque​​的指定位置插入一个或多个元素。

    • 语法:

      • 插入单个元素:

        ​deque_name.push_front(value);​​

      • 插入多个相同的元素:

        ​void insert(iterator pos, size_type count, const T& value);​​

      • 插入另一个容器指定范围的元素:​void insert(iterator pos, InputIterator first, InputIterator last);​​

    • 返回值: 对于插入单个元素的情况,返回新插入元素的迭代器。其他情况无返回值。

  • 示例代码

    #include 
    #include 
    
    int main() {
        std::deque myDeque; // 创建一个空的deque
    
    
        // 在deque的末尾添加元素
    
        myDeque.push_back(10); 
    
        // 在deque的开头添加元素
    
        myDeque.push_front(5);
    
        // 在deque的指定位置插入元素
    
        auto it = myDeque.begin() + 1; // 获取开始迭代器后移动1个位置
    
        myDeque.insert(it, 7); // 在第1个元素后插入7
    
    
        // 输出deque中的元素
    
        std::cout << "deque中的元素: ";
        for(int elem : myDeque) {
            std::cout << elem << " ";
        }
        // 输出:deque中的元素: 5 7 10
    
    
        return 0;
    }
    

删除函数

  • 函数:pop_back()​​
    • 用途: 删除deque​​末尾的元素。
    • 语法:deque_name.pop_back();​​
    • 返回值: 无。
  • 函数:pop_front()​​
    • 用途: 删除deque​​开头的元素。
    • 语法:deque_name.pop_front();​​
    • 返回值: 无。
  • 函数:erase()​​
    • 用途: 删除deque​​中指定位置或范围内的元素。

    • 语法:

      • 删除指定位置的元素:

        ​iterator erase(iterator pos);​​

      • 删除指定范围内的元素:

        ​iterator erase(iterator first, iterator last);​​

    • 返回值: 返回指向被删除元素下一个元素的迭代器。如果删除的是deque​​中的最后一个元素,则返回end()​​迭代器。

  • 函数:clear​​
    • 用途: 删除deque​​中的所有元素,大小变为0。
    • 语法:void clear();​
    • 返回值: 无。
  • 函数:resize​​
    • 用途: 改变deque​​的大小,可以增加或减少元素的数量。
    • 语法:void resize(size_type sz, T c = T());​​
    • 返回值: 无。
  • 示例代码

    
    #include 
    #include 
    
    int main() {
        std::deque myDeque = {1, 2, 3, 4, 5}; // 初始化一个deque
    
    
        // 从deque的末尾删除元素
    
        myDeque.pop_back();
    
        // 从deque的开头删除元素
    
        myDeque.pop_front();
    
        // 删除deque中的第二个元素
    
        auto it = myDeque.begin(); // 获取开始迭代器
    
        myDeque.erase(it + 1); // 删除第二个元素
    
    
        // 输出deque中的元素
    
        std::cout << "更新后的deque中的元素: ";
        for(int elem : myDeque) {
            std::cout << elem << " ";
        }
        // 输出:更新后的deque中的元素: 2 4
    
    
        return 0;
    }
    

修改函数

  • 直接索引访问修改元素
    • 用途:通过索引直接修改deque​​中的元素值。
    • 语法:deque_name[index] = value;​​
    • 返回值:无。
  • 使用迭代器修改元素
    • 用途:通过迭代器访问并修改deque​​中的元素值。
    • 语法:*iterator = value;​
    • 返回值:无。

你可能感兴趣的:(编程基础-C/C++,c语言,c++,开发语言)