【C++】-- STL之String模拟实现(二)

简介: 【C++】-- STL之String模拟实现

14.operator+=()

分为两种情况:

(1)+= 1个字符 ,使用push_back插入

(2)+= 字符串,使用append追加到字符串末尾

1.      //+= 1个字符
2.    string& operator+= (char c)
3.    {
4.      push_back(c);//尾插字符
5.      return *this;
6.    }
7. 
8.    //+= 字符串
9.    string& operator+= (const char* str)
10.     {
11.       append(str);//拼接字符串
12.       return *this;
13.     }

 

15.insert()

在指定位置插入字符:

(1)判断是否需要增容

(2)将pos位至字符串末尾的字符都向后挪一个位置

(3)将要插入的字符插入到pos位

(4)更新_size

 

1.      //insert插入一个字符
2.    string& insert(size_t pos, const char ch)
3.    {
4.      assert(pos <= _size);//pos必须小于等于字符串长度
5. 
6.      if (_size == _capacity)
7.      {
8.        reserve(2 * _capacity);//如果满了就增容
9.      }
10. 
11.       size_t end = _size + 1;
12.       while (end > pos)//将pos至_size之间的字符依次向后挪动一个位置,来腾出pos位置
13.       {
14.         _str[end] = _str[end - 1];
15.         end--;//end为0时,因此end类型应为int,那么end--就为-1,pos为无符号数,不满足循环条件,退出循环
16.             //但如果end类型为size_t,那么end为0时,end--就为-1,在内存中存储为无符号数(-1补码全1),满足循环条件,永远无法退出循环
17.       }
18. 
19.       _str[pos] = ch;//pos位置插入ch
20.       _size++;//更新_size
21. 
22.       return *this;
23.     }

16.erase()

删除字符,len为要删除的字符个数,分两种情况:

(1)从pos到字符串末尾的字符个数<要删除的字符个数,说明this._str长度不够删,那pos之后全都被删完了,直接将pos位置'\0',_size更新为pos即可。

 

(2)从pos到字符串末尾的字符个数≥要删除的字符个数,说明this._str长度够删,但是剩余的字符需要向前挪动len位

 

1.    //erase 删除字符
2.    string& erase(size_t pos, size_t len = npos)
3.    {
4.      assert(pos < _size);
5. 
6.      size_t leftLen = _size - pos;//从pos位置到字符串结束的字符长度
7.      if (leftLen < len)//1.pos之后的字符全部删掉
8.      {
9.        _str[pos] = '\0';
10.         _size = pos;
11.       }
12.       else//2.pos之后的字符删掉一部分,没删完的部分要挪到pos位置
13.       {
14.         strcpy(_str + pos, _str + pos + len);
15.         _size -= len;
16.       }
17.       return *this;
18.     }

 

17.find()

分为查找字符和查找字符串

1.    //查找字符
2.    size_t find(char ch, size_t pos = 0)
3.    {
4.      assert(pos < _size);
5.      for (size_t i = 0; i < _size; i++)
6.      {
7.        if (_str[i] == ch)
8.        {
9.          return i;//找到就返回字符所在位置
10.         }
11.       }
12.       return npos;//没找到就返回-1
13.     }
1.    //查找字符串(子串)
2.    size_t find(const char* str, size_t pos = 0)
3.    {
4.      assert(pos < _size);
5.      const char* ret  = strstr(_str + pos, str);
6. 
7.      if (ret)
8.      {
9.        return ret - _str;//计算str与_str的偏移量,即str在_str中的下标
10.       }
11.       else
12.       {
13.         return npos;//没找到就返回-1
14.       }
15.     }

 

18.operator>

字符串比较,只需要实现>和==,剩余的可以用这两个实现重载

1.         bool operator>(const string& s)
2.    {
3.      return strcmp(_str, s._str) < 0;
4.    }

 

19.operator==

1.      bool operator==(const string& s)
2.    {
3.      return strcmp(_str, s._str) == 0;
4.    }

 

20.operator>=

1.      bool operator>=(const string& s)
2.    {
3.      return (*this > s) || (*this == s);
4.    }

 

21.operator<

1.      bool operator<(const string& s)
2.    {
3.      return !(*this >= s);
4.    }

 

22.operator<=

1.      bool operator<=(const string& s)
2.    {
3.      return !(*this > s);
4.    }

 

23.operator!=

1.      bool operator!=(const string& s)
2.    {
3.      return !(*this == s);
4.    }

 

24.clear()

将字符串清空

1.      void clear()
2.    {
3.      _size = 0;
4.      _str[0] = '\0';
5.    }

 

25.operator<<

输出重载<<让string直接输出打印,像内置类型一样,用范围for就可以实现

1.     ostream& operator<<(ostream& out, const string& s)
2.  {
3.    for (auto ch: s)
4.    {
5.      out << s;
6.    }
7.    return out;
8.  }

 

目录
打赏
0
0
0
0
10
分享
相关文章
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
28 1
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
51 7
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
97 4
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
101 5
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
78 2
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
82 0
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
46 0
|
4月前
|
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
54 0
java基础(13)String类
|
3月前
|
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
81 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
80 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等