String模拟实现的补充说明
前文提到过String的模拟实现,这里补充一下测试效果以及整体的一个编写思路
// 测试代码
int main() {
// 构造函数测试
bit::string s1("Hello");
std::cout << "s1: " << s1 << std::endl; // Hello
// 拷贝构造
bit::string s2(s1);
std::cout << "s2: " << s2 << std::endl; // Hello
// 赋值运算符
bit::string s3;
s3 = s1;
std::cout << "s3: " << s3 << std::endl; // Hello
// push_back
s1.push_back('!');
std::cout << "s1 after push_back: " << s1 << std::endl; // Hello!
// operator+=
s1 += '?';
std::cout << "s1 after += char: " << s1 << std::endl; // Hello!?
// append
s1.append("World");
std::cout << "s1 after append: " << s1 << std::endl; // Hello!?World
// resize
s1.resize(5);
std::cout << "s1 after resize(5): " << s1 << std::endl; // Hello
// 关系运算符
bit::string s4("Apple"), s5("Banana");
std::cout << "s4 < s5: " << (s4 < s5) << std::endl; // true
// find
size_t pos = s5.find('n');
std::cout << "pos of 'n' in s5: " << pos << std::endl;
// insert
s5.insert(0, "Big");
std::cout << "s5 after insert: " << s5 << std::endl; // BigBanana
// erase
s5.erase(3, 3);
std::cout << "s5 after erase: " << s5 << std::endl; // Bigana
return 0;
}
运行结果截图:
构造/析构:
string(const char* str = "");
string(const string& s);
~string();
string& operator=(const string& s);
void swap(string& s);
迭代器:
iterator begin();
iterator end();
const iterator begin() const;
const iterator end() const;
容量相关:
size_t size() const;
size_t capacity() const;
bool empty() const;
void reserve(size_t n);
void resize(size_t n, char c = '\0');
元素访问:
char& operator[](size_t index);
const char& operator[](size_t index) const;
const char* c_str() const;
修改操作:
void push_back(char c);
string& operator+=(char c);
void append(const char* str);
string& operator+=(const char* str);
void clear();string& insert(size_t pos, char c);
string& insert(size_t pos, const char* str);
string& erase(size_t pos, size_t len = npos);
关系运算符:
bool operator<(const string& s) const;
bool operator<=(const string& s) const;
bool operator>(const string& s) const;
bool operator>=(const string& s) const;
bool operator==(const string& s) const;
bool operator!=(const string& s) const;
查找:
size_t find(char c, size_t pos = 0) const;
size_t find(const char* s, size_t pos = 0) const;
友元函数:
//非成员函数想直接访问私有成员
friend std::ostream& operator<<(std::ostream& os, const string& s);
friend std::istream& operator>>(std::istream& is, string& s);
静态成员:
static const size_t npos = -1;
核心成员变量:
char* _str
:指向堆上分配的字符数组size_t _size
:当前字符串长度size_t _capacity
:当前分配的内存容量
构造的实现用到strcpy,赋值采用copy-and-swap惯用法实现,关系运算符基于strcmp实现。
find基于strchr和strstr实现