📜  C++ STL中的双端队列(1)

📅  最后修改于: 2023-12-03 15:13:56.952000             🧑  作者: Mango

C++ STL中的双端队列

概述

双端队列(deque)是一种支持从队列两端进行插入和删除操作的数据结构。STL提供了deque容器,可以方便地实现双端队列的功能。

deque容器在内部实现时,使用了一段连续空间的集合,每个空间中存储着一个元素,而这些空间通过指针进行连接,形成了一个双向链表。这种实现方式可以实现高效的头尾插入和删除操作,也能够像vector一样通过下标进行随机访问。

容器操作
头尾插入

双端队列的核心操作就是头部和尾部的插入和删除。deque容器提供了两个成员函数back()和push_back(),可用于在队列的尾部插入元素,以及访问队列的尾部元素。同样,front()和push_front()函数则可用于在队列的头部进行插入和删除操作。

#include <deque>
#include <iostream>
 
int main() {
    std::deque<int> dq;
    dq.push_back(5);    // 在队尾插入元素5
    dq.push_front(2);   // 在队头插入元素2
    std::cout << "队列头部元素为:" << dq.front() << std::endl;   // 输出队头元素
    std::cout << "队列尾部元素为:" << dq.back() << std::endl;   // 输出队尾元素
    return 0;
}
头尾删除

deque容器也提供了头尾删除操作的函数。pop_back()函数可以删除队列的尾部元素,pop_front()则可用于删除队列的头部元素。

#include <deque>
#include <iostream>
 
int main() {
    std::deque<int> dq = {1,2,3,4,5};
    dq.pop_front();     // 删除队头元素1
    dq.pop_back();      // 删除队尾元素5
    std::cout << "队列头部元素为:" << dq.front() << std::endl;   // 输出队头元素
    std::cout << "队列尾部元素为:" << dq.back() << std::endl;   // 输出队尾元素
    return 0;
}
访问元素

除了front()和back()函数外,deque容器还提供了另外一种方式访问元素:通过迭代器进行访问。deque容器提供了begin()和end()函数用于获取迭代器,通过这种方式访问元素可以随机访问,效率比较高。

#include <deque>
#include <iostream>
 
int main() {
    std::deque<int> dq = {1,2,3,4,5};
    std::deque<int>::iterator iter;
    for(iter = dq.begin(); iter != dq.end(); ++iter) {
        std::cout << *iter << " ";  // 通过迭代器随机访问元素
    }
    std::cout << std::endl;
    return 0;
}
插入元素

除了push_back()和push_front()函数外,deque容器还提供了另外一种插入元素的方法:insert()函数。这个函数可以在任意位置进行插入操作,并且可以插入多个元素。其中第一个参数指定插入位置的迭代器,第二个参数指定要插入的元素的数量,第三个参数则指定要插入的元素的值。

#include <deque>
#include <iostream>
 
int main() {
    std::deque<int> dq = {1,2,3,4,5};
    std::deque<int>::iterator iter = dq.begin() + 2;  // 指向第3个元素的迭代器
    dq.insert(iter, 2, 6);    // 在第3个元素前插入两个6
    std::deque<int>::iterator it;
    for(it = dq.begin(); it != dq.end(); ++it) {
        std::cout << *it << " ";    // 输出所有元素
    }
    std::cout << std::endl;
    return 0;
}
删除元素

和插入元素类似,deque容器也提供了erase()函数用于删除指定位置的元素。同样,这个函数也可以一次删除多个元素,只需指定起始和结束的迭代器即可。

#include <deque>
#include <iostream>
 
int main() {
    std::deque<int> dq = {1,2,3,4,5};
    std::deque<int>::iterator iter = dq.begin() + 2;  // 指向第3个元素的迭代器
    dq.erase(iter);   // 删除第3个元素
    std::deque<int>::iterator it;
    for(it = dq.begin(); it != dq.end(); ++it) {
        std::cout << *it << " ";    // 输出所有元素
    }
    std::cout << std::endl;
    return 0;
}
总结

双端队列是一种支持从队列两端进行插入和删除操作的数据结构。STL中提供了deque容器,通过该容器可以方便地实现双端队列的功能。双端队列的核心操作包括头尾插入和删除、访问元素、插入元素和删除元素等。熟练掌握deque容器的使用可以大大提高程序的开发效率。