• C++复习 - String


    自己实现String类

    1. #include
    2. #include
    3. #include
    4. namespace whxnchy {
    5. class string {
    6. public:
    7. typedef char* iterator;
    8. // 构造函数
    9. string(const char* str = "") {
    10. _size = strlen(str);
    11. _capacity = _size;
    12. _str = new char[_capacity + 1];
    13. strcpy(_str, str);
    14. }
    15. // 拷贝构造函数
    16. string(const string& s)
    17. : _str(nullptr), _size(0), _capacity(0) {
    18. string tmp(s._str);
    19. (*this).swap(tmp);
    20. }
    21. // 赋值运算符的重载
    22. string& operator=(string s) {
    23. this->swap(s);
    24. return *this;
    25. }
    26. // 析构函数
    27. ~string() {
    28. if (_str) {
    29. delete[] _str;
    30. _str = nullptr;
    31. }
    32. }
    33. // 迭代器
    34. iterator begin() { return _str; }
    35. iterator end() { return _str + _size; }
    36. // 修改操作
    37. void push_back(char c) {
    38. if (_size == _capacity)
    39. reserve(_capacity * 2);
    40. _str[_size++] = c;
    41. _str[_size] = '\0';
    42. }
    43. string& operator+=(char c) {
    44. push_back(c);
    45. return *this;
    46. }
    47. void append(const char* str) {
    48. size_t len = strlen(str);
    49. if (_size + len > _capacity)
    50. reserve(_size + len);
    51. strcpy(_str + _size, str);
    52. _size += len;
    53. }
    54. string& operator+=(const char* str)
    55. {
    56. append(str);
    57. return *this;
    58. }
    59. void clear() {
    60. _size = 0;
    61. _str[_size] = '\0';
    62. }
    63. void swap(string& s) {
    64. std::swap(_str, s._str);
    65. std::swap(_size, s._size);
    66. std::swap(_capacity, s._capacity);
    67. }
    68. const char* c_str() const {
    69. return _str;
    70. }
    71. // 容量
    72. size_t size() const {
    73. return _size;
    74. }
    75. size_t capacity() const {
    76. return _capacity;
    77. }
    78. bool empty() const {
    79. return _size == 0;
    80. }
    81. void resize(size_t newSize, char c = '\0') {
    82. if (newSize > _size) {
    83. if (newSize > _capacity)
    84. reserve(newSize);
    85. memset(_str + _size, c, newSize - _size);
    86. }
    87. _size = newSize;
    88. _str[newSize] = '\0';
    89. }
    90. void reserve(size_t newCapacity)
    91. {
    92. if (newCapacity > _capacity) {
    93. char* newStr = new char[newCapacity + 1];
    94. strcpy(newStr, _str);
    95. delete[] _str;
    96. _str = newStr;
    97. _capacity = newCapacity;
    98. }
    99. }
    100. // 访问
    101. char& operator[](size_t index) {
    102. assert(index < _size);
    103. return _str[index];
    104. }
    105. const char& operator[](size_t index) const {
    106. assert(index < _size);
    107. return _str[index];
    108. }
    109. // 比较运算符
    110. bool operator<(const string& s)
    111. {
    112. return strcmp(_str, s._str) < 0;
    113. }
    114. bool operator<=(const string& s) {
    115. return strcmp(_str, s._str) <= 0;
    116. }
    117. bool operator>(const string& s) {
    118. return strcmp(_str, s._str) > 0;
    119. }
    120. bool operator>=(const string& s)
    121. {
    122. return !(*this
    123. }
    124. bool operator==(const string& s) {
    125. return strcmp(_str, s._str) == 0;
    126. }
    127. bool operator!=(const string& s) {
    128. return strcmp(_str, s._str) != 0;
    129. }
    130. // 查找和操作
    131. size_t find(char c, size_t pos) const {
    132. size_t i = pos;
    133. while (i < _size && _str[i] != c)
    134. ++i;
    135. return (i < _size) ? i : std::string::npos;
    136. }
    137. size_t find(const char* s, size_t pos) const {
    138. size_t len = strlen(s);
    139. if (len == 0)
    140. return pos;
    141. if (pos + len > _size)
    142. return std::string::npos;
    143. const char* result = strstr(_str + pos, s);
    144. return result ? result - _str : std::string::npos;
    145. }
    146. string& insert(size_t pos, char c) {
    147. if (pos > _size)
    148. pos = _size;
    149. if (_size == _capacity)
    150. reserve(_capacity * 2);
    151. memmove(_str + pos + 1, _str + pos, _size - pos + 1);
    152. _str[pos] = c;
    153. ++_size;
    154. return *this;
    155. }
    156. string& insert(size_t pos, const char* str) {
    157. if (pos > _size)
    158. pos = _size;
    159. size_t len = strlen(str);
    160. if (_size + len > _capacity)
    161. reserve(_size + len);
    162. memmove(_str + pos + len, _str + pos, _size - pos + 1);
    163. memcpy(_str + pos, str, len);
    164. _size += len;
    165. return *this;
    166. }
    167. string& erase(size_t pos, size_t len){
    168. if (pos >= _size)
    169. return *this;
    170. if (pos + len >= _size)
    171. len = _size - pos;
    172. memmove(_str + pos, _str + pos + len, _size - pos - len + 1);
    173. _size -= len;
    174. return *this;
    175. }
    176. private:
    177. friend std::ostream& operator<<(std::ostream& _cout, const whxnchy::string& s);
    178. friend std::istream& operator>>(std::istream& _cin, whxnchy::string& s);
    179. private:
    180. char* _str;
    181. size_t _capacity;
    182. size_t _size;
    183. };
    184. std::ostream& operator<<(std::ostream& _cout, const whxnchy::string& s) {
    185. for (size_t i = 0; i < s.size(); ++i) {
    186. _cout << s[i];
    187. }
    188. return _cout;
    189. }
    190. }
    191. // 进行测试
    192. void TestBitstring() {
    193. whxnchy::string s1("hello");
    194. s1.push_back(' ');
    195. s1.push_back('b');
    196. s1.append("it");
    197. s1 += "'!!'";
    198. std::cout << s1 << std::endl;
    199. std::cout << "Size: " << s1.size() << std::endl;
    200. std::cout << "Capacity: " << s1.capacity() << std::endl;
    201. whxnchy::string::iterator it = s1.begin();
    202. while (it != s1.end()) {
    203. std::cout << *it << " ";
    204. ++it;
    205. }
    206. std::cout << std::endl;
    207. for (auto ch : s1)
    208. std::cout << ch << " ";
    209. std::cout << std::endl;
    210. }
    211. int main() {
    212. TestBitstring();
    213. return 0;
    214. }

  • 相关阅读:
    关于Date存储到数据库
    高德地图与CAD图叠加显示方法汇总及优缺点分析
    java词汇
    3D-SKIPDENSESEG医学图像分割
    c#把DataTable的数据存到Text文件
    基于jsp+servlet+mysql+bootstrap的权限设计
    Socket.D v2.4.9 发布
    持续集成部署-k8s-配置与存储-配置管理:ConfigMap 的热更新
    Supervisor进程管理
    k8s学习笔记4-基础部分pod探针
  • 原文地址:https://blog.csdn.net/hgkhjkljnl/article/details/136500288