C++ STL 部分顺序容器对比(vector,deque,string,array)
std::vector
- 内存分配:连续内存块。
- 随机访问:支持,高效。
- 尾部操作:插入和删除高效。
- 中间操作:可能低效,涉及元素移动。
- 容量变化:可能需要扩容和复制。
vector方法示例
#include <vector>
std::vector<int> vec;
vec.push_back(10);
vec.emplace_back(20);
vec.insert(vec.begin() + 1, 30);
int value = vec.front();
vec.pop_back();
vec.erase(vec.begin() + 1);
bool empty = vec.empty();
size_t size = vec.size();
vec.resize(10);
vec.clear();
std::deque
- 内存分配:多个固定大小的内存块。
- 随机访问:支持,但可能比
std::vector
稍慢。 - 两端操作:插入和删除高效。
- 中间操作:通常低效,涉及元素移动。
deque常用方法示例
#include <deque>
std::deque<int> dq;
dq.push_back(10);
dq.push_front(20);
dq.emplace_front(25);
int value = dq.front();
dq.pop_front();
dq.erase(dq.begin() + 1);
std::string
- 内存分配:动态分配,连续内存块。
- 随机访问:支持,高效。
- 字符串操作:提供丰富的字符串操作方法。
- 容量变化:可能涉及内存重新分配。
string常用方法示例
#include <string>
std::string str;
str.push_back('a');
str += "bc";
str.insert(1, "de");
char value = str.front();
str.pop_back();
str.erase(str.begin() + 1);
size_t length = str.length();
str.resize(10, 'x');
str.clear();
std::array
- 内存分配:固定大小,通常在栈上分配。
- 随机访问:支持,高效。
- 大小变化:编译时确定,不可变。
- 内存连续性:保证内存连续。
array常用方法示例
#include <array>
std::array<int, 5> arr = {{1, 2, 3, 4, 5}};
int value = arr.front();
arr[1] = 20;
bool empty = arr.empty();
size_t size = arr.size();
性能对比
特性/操作 | std::vector | std::deque | std::string | std::array |
---|
内存布局 | 连续 | 多块 | 连续 | 连续 |
随机访问 | 支持 | 支持 | 支持 | 支持 |
尾部插入 | 高效 | 高效 | 高效 | 高效(固定大小) |
尾部删除 | 高效 | 高效 | 高效 | 高效(固定大小) |
中间插入 | 低效(可能需要 O(n)) | 低效(可能需要 O(n)) | 低效(可能需要 O(n)) | 不支持 |
中间删除 | 低效(可能需要 O(n)) | 低效(可能需要 O(n)) | 低效(可能需要 O(n)) | 不支持 |
内存分配策略 | 动态扩容 | 动态分配多个块 | 动态分配 | 固定大小 |
适用场景 | 动态数组 | 双端队列 | 字符串处理 | 固定大小数组 |
注意事项
std::vector
和 std::string
通常用于需要动态大小和随机访问的场景。std::deque
适用于需要快速两端访问的场景。std::array
适用于大小固定的场合,提供了编译时大小检查和栈内存分配。