c++容器说明和基本使用方法(最全/全部内容)

c++容器基本使用方法

顺序性容器

类型 特性
vector 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢
deque 双端队列。支持快速随机访问。在头尾位置插入或删除速度很快
list 双向链表。只支持双向顺序访问。在任何位置插入或删除速度都很快
forward_list 单向链表。只支持单向顺序访问。在任何位置插入或删除速度都很快
array 固定大小数组。支持快速随机访问。不能添加或删除元素
string 类似vector,但用于保存字符。支持快速随机访问。在尾部插入或删除速度很快

forward_listarray是C++11新增类型。与内置数组相比,array更安全易用。forward_list没有size操作。

容器选择原则:

  • 除非有合适的理由选择其他容器,否则应该使用vector
  • 如果程序有很多小的元素,且空间的额外开销很重要,则不要使用listforward_list
  • 如果程序要求随机访问容器元素,则应该使用vectordeque
  • 如果程序需要在容器头尾位置插入/删除元素,但不会在中间位置操作,则应该使用deque
  • 如果程序只有在读取输入时才需要在容器中间位置插入元素,之后需要随机访问元素。则:
    • 先确定是否真的需要在容器中间位置插入元素。当处理输入数据时,可以先向vector追加数据,再调用标准库的sort函数重排元素,从而避免在中间位置添加元素。
    • 如果必须在中间位置插入元素,可以在输入阶段使用list。输入完成后将list中的内容拷贝到vector中。
  • 不确定应该使用哪种容器时,可以先只使用vectorlist的公共操作:使用迭代器,不使用下标操作,避免随机访问。这样在必要时选择vectorlist都很方便。

vector

可以理解vector是一个长度可变的数组。数组它在一创建之后就是确定好的大小,并且存放在静态空间,但是vector它内部空间大小可变动的。

1. 头文件
 #include <vector>
2. 常用的API
构造函数
   //1.默认构造,无参构造
   vector<int> v1;	
   for (int i = 0; i < 10; ++i) {
   
   
   	v1.push_back(i);
   }
   // 2.利用区间方式构造
   vector<int> v2(v1.begin(), v1.end());
赋值操作
//直接赋值
vector<int> v2;
v2 = v1;

//assign赋值
vector<int> v3;
v3.assign(v1.begin(), v1.end());

插入和删除
vector<int> v1;
//尾部插入
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);

// 尾部删除
v1.pop_back();

//在v1的头部插入-1元素
v1.insert(v1.begin(), -1);

//在v1的头部插入两个值为520的元素
v1.insert(v1.begin(), 2, 520);

//删除头部第一个元素
v1.erase(v1.begin());

//清空所有的元素
// 方法1 
v1.erase(v1.begin(), v.end());
// 方法2
v1.clear();

容量和大小

size() 函数返回容器当前所包含的元素数量,而 capacity() 函数返回容器在不重新分配内存的情况下可以容纳的元素数量。

// 判断容器是否为空, 如果为空返回true,否则返回false
v1.empty();

// 获取容器的容量
v1.capacity();

// 获取容器的大小 
//(注意!这里的容器的大小可以理解为里面存储的元素的个数)
v1.size();

// 修改容器的容量
v1.resize(100) // 扩容到可容纳100个元素
v1.resize(10, 100)  //将向量 v1 调整为包含 10 个元素的大小,并用值为 100 的元素填充向量。
数据访问
// 下标访问(Subscript Access):使用下标操作符 [] 来访问指定位置的元素
vector<int> vec = {
   
   1, 2, 3, 4, 5};
int value = vec[2]; // 获取索引为 2 的元素,即第三个元素,value 等于 3

//迭代器访问(Iterator Access):使用迭代器来遍历 vector 中的元素
for (auto it = vec.begin(); it != vec.end(); ++it) {
   
   
    cout << *it << " "; // 输出每个元素的值
}

// 范围循环(Range-based Loop):使用 C++11 引入的范围循环来遍历 vector 中的元素。
for (int value : vec) {
   
   
    cout << value << " "; // 输出每个元素的值
}

//at() 函数:使用 at() 函数来访问指定位置的元素,可以在访问越界时抛出 out_of_range 异常。
int value = vec.at(2); // 获取索引为 2 的元素,即第三个元素,value 等于 3


// front() 和 back() 函数:分别用于访问 vector 的第一个和最后一个元素
int first = vec.front(); // 获取第一个元素,即 1
int last = vec.back(); // 获取最后一个元素,即 5

deque

1.头文件
#include <deque>
2.常用API
构造函数
// 创建一个空的 deque 对象 d1
deque<int> d1;

d1.push_back(1);
d1.push_back(2);
d1.push_back(3);

// 使用 d1 的内容初始化另一个 deque d2,即 d2 包含了 d1 的所有元素
deque<int> d2(d1);

// 创建一个包含 10 个元素且每个元素的值都为 100 的 deque 对象 d3
deque<int> d3(10, 100);

deque<int> d4;
d4 = d3; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值