当前位置:首页 C++ > 正文

C++标准库容器对比array,vector,deque,queue,stack

作者:野牛程序员:2023-07-22 11:20:12 C++阅读 2898

在C++标准库中,有多种容器可供选择,每种容器都有其独特的特点和适用场景。下面是array、vector、deque、queue和stack这五种容器的对比:

  1. array:

  • 特点:array是一个固定大小的连续数组,大小在创建时指定,并且不能更改。

  • 优点:由于是连续内存,访问速度较快。

  • 缺点:大小固定,不能动态调整;复制和赋值开销较大。

  • 适用场景:适合存储固定大小的元素,比如存储RGB颜色值或者日期的年月日。

  1. vector:

  • 特点:vector是一个动态大小的数组,可以根据需要自动调整大小,支持动态增长和缩减。

  • 优点:动态调整大小,支持在尾部快速添加和删除元素。

  • 缺点:在头部或中间插入/删除元素相对较慢,因为需要移动其他元素。

  • 适用场景:通常是最常用的容器之一,适合用于大部分元素数量不确定、需要频繁添加或删除元素的情况。

  1. deque(双端队列):

  • 特点:deque也是一个动态大小的数组,与vector相似,但它支持在头部和尾部高效地添加和删除元素。

  • 优点:支持在头部和尾部快速添加和删除元素。

  • 缺点:相对于vector,内存使用略高,访问速度可能稍慢。

  • 适用场景:适合需要频繁在头部和尾部进行添加和删除元素的情况。

  1. queue:

  • 特点:queue是一个先进先出(FIFO)的容器,用于模拟队列数据结构。

  • 优点:支持在队尾插入元素,在队头删除元素。

  • 缺点:不支持随机访问元素。

  • 适用场景:适合需要按照先进先出规则进行数据处理的场景,如BFS算法。

  1. stack:

  • 特点:stack是一个后进先出(LIFO)的容器,用于模拟栈数据结构。

  • 优点:支持在栈顶插入元素,从栈顶删除元素。

  • 缺点:不支持随机访问元素。

  • 适用场景:适合需要按照后进先出规则进行数据处理的场景,如逆序输出等。

总结:

  • 如果元素数量固定且不需要频繁添加或删除元素,可以选择array。

  • 如果元素数量不确定,需要频繁添加或删除元素,并且不需要随机访问元素,可以选择deque。

  • 如果元素数量不确定,需要频繁添加或删除元素,并且需要随机访问元素,可以选择vector。

  • 如果需要模拟队列数据结构,选择queue。

  • 如果需要模拟栈数据结构,选择stack。

根据具体的需求和使用场景,选择合适的容器可以提高代码的效率和可读性。

每种容器举例说明它们的用途和特点。

  1. array:

#include <array>
#include <iostream>

int main() {
    std::array<int, 5> myArray = {1, 2, 3, 4, 5};

    // 访问元素
    std::cout << "Element at index 2: " << myArray[2] << std::endl;

    // 获取数组大小
    std::cout << "Size of array: " << myArray.size() << std::endl;

    return 0;
}

此处的array用于存储5个整数,并且大小是固定的。可以通过索引快速访问数组元素,但不能动态地改变数组的大小。

  1. vector:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> myVector;

    // 添加元素
    myVector.push_back(10);
    myVector.push_back(20);
    myVector.push_back(30);

    // 访问元素
    std::cout << "First element: " << myVector[0] << std::endl;

    // 获取向量大小
    std::cout << "Size of vector: " << myVector.size() << std::endl;

    return 0;
}

在这个例子中,vector用于动态地存储整数,可以随时添加或删除元素。通过push_back()函数向尾部添加元素。

  1. deque:

#include <deque>
#include <iostream>

int main() {
    std::deque<int> myDeque;

    // 添加元素
    myDeque.push_back(100);
    myDeque.push_front(200);
    myDeque.push_back(300);

    // 访问元素
    std::cout << "First element: " << myDeque.front() << std::endl;

    // 获取双端队列大小
    std::cout << "Size of deque: " << myDeque.size() << std::endl;

    return 0;
}

这里,deque用于存储整数,可以在头部和尾部高效地添加和删除元素。通过push_back()函数向尾部添加元素,通过push_front()函数向头部添加元素。

  1. queue:

#include <queue>
#include <iostream>

int main() {
    std::queue<int> myQueue;

    // 添加元素
    myQueue.push(1);
    myQueue.push(2);
    myQueue.push(3);

    // 访问队头元素
    std::cout << "Front element: " << myQueue.front() << std::endl;

    // 删除队头元素
    myQueue.pop();

    // 访问队头元素
    std::cout << "Front element after pop: " << myQueue.front() << std::endl;

    // 获取队列大小
    std::cout << "Size of queue: " << myQueue.size() << std::endl;

    return 0;
}

在此示例中,queue用于存储整数,并模拟了先进先出(FIFO)的数据结构。通过push()函数向队列尾部添加元素,通过pop()函数从队头删除元素。

  1. stack:

#include <stack>
#include <iostream>

int main() {
    std::stack<int> myStack;

    // 添加元素
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 访问栈顶元素
    std::cout << "Top element: " << myStack.top() << std::endl;

    // 弹出栈顶元素
    myStack.pop();

    // 访问栈顶元素
    std::cout << "Top element after pop: " << myStack.top() << std::endl;

    // 获取栈的大小
    std::cout << "Size of stack: " << myStack.size() << std::endl;

    return 0;
}

在这个例子中,stack用于存储整数,并模拟了后进先出(LIFO)的数据结构。通过push()函数向栈顶添加元素,通过pop()函数从栈顶删除元素。

这些例子希望能够帮助更好地理解这些容器的用途和特点。具体在实际项目中,可以根据不同的需求选择适合的容器。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击