目录
对string的各种接口进行一个简易版的模拟实现,在模拟实现完之后对string的底层实现有了进一步的理解,了解大佬的编程写法思路。也算是对string有了一个小总结。
一、string.h
接口的声明。放在.h文件中
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;
namespace bit
{
class string
{
public:
typedef char* iterator;//迭代器本质上就是指针
typedef const char* const_iterator;
iterator begin() const
{
return _str;
}
iterator end()
{
return _str + _size;
}
const_iterator end() const
{
return _str + _size;
}
string(const char* s = "");
string(const string& s);
string& operator=(string s);
~string();
void push_back(char c);
string& operator+=(char c);
string& operator+=(const string& s);
string& operator+=(const char* str);
void append(const char* str);
void clear();
void swap(string& s);
const char* c_str()const;
//capacity
size_t size();
size_t capacity();
void resize(size_t n, char c = '\0');
void reserve(size_t n);
bool empty()const;
bool operator<(const string& s);
bool operator<=(const string& s);
bool operator>(const string& s);
bool operator>=(const string& s);
bool operator==(const string& s);
;
bool operator!=(const string& s);
char& operator[](size_t i);
const char& operator[](size_t i) const;
//返回字符第一次在字符串出现的位置
size_t find(char c, size_t pos = 0) const;
;
//在pos位置插入字符c
string& insert(size_t pos, char c);
//在pos位置插入字符串
string& insert(size_t pos, const char* str);
//返回子串在字符串中出现的位置
size_t find(const char* str, size_t pos = 0);
string substr(size_t pos = 0, size_t len = npos);
// 删除pos位置上的元素,并返回该元素的下一个位置
string& erase(size_t pos, size_t len = npos);
private:
size_t _size;
size_t _capacity;
char* _str;
//静态变量可以赋值处理的前提是有const修饰,这个可以看作是编译器的特殊处理,只能适用于整形家族
static const size_t npos = -1;
};
ostream& operator<<(ostream& out, const string& s);
istream& operator>>(istream& in, string& s);
}
二、string.cpp
接口的各种实现。进行声明定义分离时,要注意格式上的变化,指定类域,声明和定义中,只有声明中可以给缺省值,定义中不能给。string的构造函数有传统写法和现代写法,现代写法更简洁,但和传统写法本质上没有太大的区别
#include "string.h"
names