vector 对象是如何增长的
为了支持快速随机访问,vector 将元素连续存储——每个元素紧挨着前一个元素存储。
为了避免多次进行内存释放和分配,vector 和 string 的实现通常会分配比新的空间需求更大的内存空间,留以备用。
注意: shrink_to_fit 只是一个请求,标准库并不保证退还内存。
程序如下:
#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;
int main()
{
// 默认初始化容器
vector<int> ivec;
for (int i=0;i<10;i++){
ivec.push_back(i);
}
int size = ivec.size();
int cap = ivec.capacity();
cout << "the ivec's size: " << size << endl;
cout << "the ivec's capacity: " << cap << endl;
// 自主分配内存空间
vector<int> my_ivec;
my_ivec.reserve(100); // 分配能容纳100个元素的内存空间
for (int i=0;i<10;i++){
my_ivec.push_back(i);
}
int my_size = my_ivec.size();
int my_cap = my_ivec.capacity();
cout << "the my_ivec's size: " << my_size << endl;
cout << "the my_ivec's capacity: " << my_cap << endl;
// 退还剩余没用的空间
ivec.shrink_to_fit();
cout << "the ivec's capacity: " << ivec.capacity() << endl;
return 0;
}
额外的 string 操作
这些操作中的大部分要么是提供 string 类和 C 风格字符数组之间的相互转换,要么是增加了允许我们用下标代替迭代器的版本。
解释: cp 指的是 char 型对象
子字符串操作
修改 string 的操作
补充:
s.insert(pos,n,c);
s.insert(pos,cp);
s.insert(s.size(), 5, '!'); // 在s末尾插入5个感叹号
s.insert(s.size(), cp + 7); // 在s末尾插入字符组第8个开始的所有字符
string 搜索操作
若未找到,则返回string::npos。可直接判断。
compare函数
compare函数与C标准库的strcmp函数很相似。类似strcmp,根据 s 是等s于、大于还是小于参数指定的字符串,s.compare 返回0、正数或负数。
数值转换
实现数值数据与标准库 string 之间的转换。
注意:
如果 string 不能转换为一个数值,这些函数抛出一个 invalid_argument 异常。
如果转换得到的数值无法用任何类型来表示,则抛出一个 out_of_range 异常。
程序:
容器适配器
首先,我们要明白适配器是干什么的?其实就是一个接口转换装置,是得我们能用特定的方法去操作一些我们本来无法操作的东西。举一个例子,比如你的一个设备支持串口线,而你的电脑支持的是usb口,这时候,我们没有必要重新买一个支持usb的设备,只需要一根串口转usb口的小玩意,让你的设备能够连接到usb插口上,而它就是适配器。
那么C++中的容器适配器是干什么的呢?可以做一个类比,我们已有的容器(比如vector、list、deque)就是设备,这个设备支持的操作很多,比如插入,删除,迭代器访问等等。而我们希望这个容器表现出来的是栈的样子:先进后出,入栈出栈等等,此时,我们没有必要重新动手写一个新的数据结构,而是把原来的容器重新封装一下,改变它的接口,就能把它当做栈使用了。
总结就是简化容器操作,最后只剩下stack、queue和preiority_queue所需要的操作。
默认情况下,stack 和 queue 是基于 deque 实现的,priority_queue 是在 vector 之上实现的。
初始化容器适配器操作和容器类似。而且可用默认容器初始化容器适配器:
deque<int> deq;
stack<int> stk(deq); // 从deq 拷贝元素到 stk。
参考:
容器适配器:https://blog.csdn.net/thefutureisour/article/details/7751846