C++ STL vector,deque,string,array容器对比

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();  // 检查容器是否为空(始终为 false)
size_t size = arr.size();  // 获取容器大小

性能对比

特性/操作std::vectorstd::dequestd::stringstd::array
内存布局连续多块连续连续
随机访问支持支持支持支持
尾部插入高效高效高效高效(固定大小)
尾部删除高效高效高效高效(固定大小)
中间插入低效(可能需要 O(n))低效(可能需要 O(n))低效(可能需要 O(n))不支持
中间删除低效(可能需要 O(n))低效(可能需要 O(n))低效(可能需要 O(n))不支持
内存分配策略动态扩容动态分配多个块动态分配固定大小
适用场景动态数组双端队列字符串处理固定大小数组

注意事项

  • std::vectorstd::string 通常用于需要动态大小和随机访问的场景。
  • std::deque 适用于需要快速两端访问的场景。
  • std::array 适用于大小固定的场合,提供了编译时大小检查和栈内存分配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小凡下方了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值