C++标准库容器对比array,vector,deque,queue,stack
在C++标准库中,有多种容器可供选择,每种容器都有其独特的特点和适用场景。下面是array、vector、deque、queue和stack这五种容器的对比:
array:
特点:array是一个固定大小的连续数组,大小在创建时指定,并且不能更改。
优点:由于是连续内存,访问速度较快。
缺点:大小固定,不能动态调整;复制和赋值开销较大。
适用场景:适合存储固定大小的元素,比如存储RGB颜色值或者日期的年月日。
vector:
特点:vector是一个动态大小的数组,可以根据需要自动调整大小,支持动态增长和缩减。
优点:动态调整大小,支持在尾部快速添加和删除元素。
缺点:在头部或中间插入/删除元素相对较慢,因为需要移动其他元素。
适用场景:通常是最常用的容器之一,适合用于大部分元素数量不确定、需要频繁添加或删除元素的情况。
deque(双端队列):
特点:deque也是一个动态大小的数组,与vector相似,但它支持在头部和尾部高效地添加和删除元素。
优点:支持在头部和尾部快速添加和删除元素。
缺点:相对于vector,内存使用略高,访问速度可能稍慢。
适用场景:适合需要频繁在头部和尾部进行添加和删除元素的情况。
queue:
特点:queue是一个先进先出(FIFO)的容器,用于模拟队列数据结构。
优点:支持在队尾插入元素,在队头删除元素。
缺点:不支持随机访问元素。
适用场景:适合需要按照先进先出规则进行数据处理的场景,如BFS算法。
stack:
特点:stack是一个后进先出(LIFO)的容器,用于模拟栈数据结构。
优点:支持在栈顶插入元素,从栈顶删除元素。
缺点:不支持随机访问元素。
适用场景:适合需要按照后进先出规则进行数据处理的场景,如逆序输出等。
总结:
如果元素数量固定且不需要频繁添加或删除元素,可以选择array。
如果元素数量不确定,需要频繁添加或删除元素,并且不需要随机访问元素,可以选择deque。
如果元素数量不确定,需要频繁添加或删除元素,并且需要随机访问元素,可以选择vector。
如果需要模拟队列数据结构,选择queue。
如果需要模拟栈数据结构,选择stack。
根据具体的需求和使用场景,选择合适的容器可以提高代码的效率和可读性。
每种容器举例说明它们的用途和特点。
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个整数,并且大小是固定的。可以通过索引快速访问数组元素,但不能动态地改变数组的大小。
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()函数向尾部添加元素。
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()函数向头部添加元素。
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()函数从队头删除元素。
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()函数从栈顶删除元素。
这些例子希望能够帮助更好地理解这些容器的用途和特点。具体在实际项目中,可以根据不同的需求选择适合的容器。
