STL复习-序列式容器和容器适配器部分

STL复习

1. 常见的容器

如何介绍这些容器,分别从常见接口,迭代器类型,底层实现

在这里插入图片描述


序列式容器

string

string严格来说不属于stl,它是属于C++标准库

**底层实现:**string本质是char类型的顺序表,因为不同编译器下的具体实现不同,这里只提供一个我的简答框架

class string
{
   
   
public:
    typedef char* iterator;
    typedef const char* const_iterator; 
private:
    char* _str; 		// 堆上开辟的顺序表空间
    size_t _size; 		// 有效字符个数
    size_t _capacity; 	// _str的空间大小

    static const size_t npos; // 最大字符串大小
};

const size_t string::npos = -1;

实际在VS系列下,string是包含一个指针,一个联合体(一个数组和一个指针,如果字符串长度小于16就会使用提前开辟好的数组,如果大于16字节再去堆上申请空间使用指针指向),size和capacity

在g++下string只包含一个指针,指向堆上的一段空间,包含一个指针指向为字符串开辟的空间,引用计数,size和capacity,这个引用计数可以让赋值拷贝这些对象只需要浅拷贝增加引用计数即可

迭代器类型: 随机访问迭代器

常用接口:

函数名 功能
size / length 返回字符串有效字符个数
clear / reserver / resize 清空有效字符 / 预留空间 / 将有效字符的个数该成n个,多出的空间用字符c填充
operator[] 返回pos位置的字符
push_back / append / operator+= 在字符串后尾插字符c / 字符串 / 字符串
c_str 返回C格式字符串
find / rfind + npos 从字符串pos位置开始往(后 / 前)找字符c,返回该字符在字符串中的位置,没有返回npos
substr 在str中从pos位置开始,截取n个字符,然后将其返回
operator<< / operator>> / getline 从iostream中写 / 读 (空格/回车),getline可自定义分隔符
// 剪去报头 length\r\n*******\r\nlength\r
std::string Decode(std::string& str)
{
   
   
	// 判断条件是否满足,不满足返回空串
	size_t pos = str.find(SEP);
	if (pos == std::string::npos)
		return "";
	size_t lenght = atoi(str.substr(0, pos).c_str());

	if (lenght > str.size() - pos - SEP_LEN * 2)
		return "";

	str.erase(0, pos + SEP_LEN);
	std::string ret = str.substr(0, lenght);
	str.erase(0, lenght + SEP_LEN);
	return ret;
}
// 简单实现

class string
{
   
   
	friend std::ostream& operator<<(std::ostream& out, const string& str);
	//friend istream& operator>>(istream& in, const string& str);
public:
	string() : _str(nullptr), _size(0), _capacity(0)
	{
   
   }

	string(const char* str) :string()
	{
   
   
		size_t sz = strlen(str);
		_str = new char[sz + 1] {
   
   0};
		strcpy(_str, str);
		_size = sz;
		_capacity = sz + 1;
	}

	string(const string& str)
		: string(str.c_str())
	{
   
   }

	string& operator==(string str)
	{
   
   
		if(this != &str)
			swap(str);
		return *this;
	}

	~string()
	{
   
   
		delete[] _str;
	}

	string& operator+=(const string& str)
	{
   
   
		size_t sz = str._size;
		if (sz + _size + 1 > _capacity)
		{
   
   
			reserve(sz > _capacity ? _capacity + sz : 2 * _capacity);
		}
		strcpy(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值