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(