C++ ---- 顺序容器(三)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值