• string类的模拟实现


    目录

    构造

    迭代器

    访问

    关系运算符重载

    容量

    查找插入删除

    修改

    流插入流提取


    构造

    (传统写法)

    (现代写法):需要引入swap函数改变指针指向

    迭代器

    访问

    关系运算符重载

    容量

    查找插入删除

    修改

    流插入流提取

    1. #pragma once
    2. #include
    3. namespace sig
    4. {
    5. class string
    6. {
    7. friend ostream& operator<<(ostream& _cout, const sig::string& s)
    8. {
    9. for (size_t i = 0; i < s._size; i++)
    10. {
    11. _cout << s._str[i];
    12. }
    13. return _cout;
    14. }
    15. friend istream& operator>>(istream& _cin, sig::string& s)
    16. {
    17. s.clear();
    18. char buff[129];
    19. size_t i = 0;
    20. char ch;
    21. ch = _cin.get();
    22. while (ch != ' ' && ch != '\n')
    23. {
    24. buff[i++] = ch;
    25. if (i == 128)
    26. {
    27. buff[i] = '\0';
    28. s += buff;
    29. i = 0;
    30. }
    31. ch = _cin.get();
    32. }
    33. if (i != 0)
    34. {
    35. buff[i] = '\0';
    36. s += buff;
    37. }
    38. return _cin;
    39. }
    40. public:
    41. typedef char* iterator; //可修改迭代器
    42. typedef char* const_iterator; //不可修改迭代器
    43. public:
    44. string(const char* str = "")
    45. :_size(strlen(str))
    46. ,_capacity(_size)
    47. {
    48. _str = new char[_capacity + 1];
    49. strcpy(_str, str);
    50. }
    51. /*string(const string& s)
    52. {
    53. _str = new char[s._capacity + 1];
    54. strcpy(_str, s._str);
    55. _size = s._size;
    56. _capacity = s._capacity;
    57. }
    58. string& operator=(const string& s)
    59. {
    60. if (this != &s)
    61. {
    62. char* tmp = new char[s._capacity + 1];
    63. strcpy(tmp, s._str);
    64. delete[]_str;
    65. _str = tmp;
    66. _size = s._size;
    67. _capacity = s._capacity;
    68. }
    69. return *this;
    70. }*/
    71. //现代写法
    72. /*void swap(string& s)
    73. {
    74. std::swap(_str, s._str);
    75. std::swap(_size, s._size);
    76. std::swap(_capacity, s._capacity);
    77. }*/
    78. string(const string& s)
    79. :_str(nullptr)
    80. ,_size(0)
    81. ,_capacity(0)
    82. {
    83. string tmp(s._str);
    84. swap(tmp);
    85. }
    86. string& operator=(const string& s)
    87. {
    88. if (this != &s)
    89. {
    90. string tmp(s);
    91. swap(tmp);
    92. }
    93. return *this;
    94. }
    95. ~string()
    96. {
    97. delete[]_str;
    98. _str = nullptr;
    99. _size = _capacity = 0;
    100. }
    101. //
    102. // iterator
    103. iterator begin()
    104. {
    105. return _str;
    106. }
    107. iterator end()
    108. {
    109. return _str + _size;
    110. }
    111. const_iterator begin()const
    112. {
    113. return _str;
    114. }
    115. const_iterator end()const
    116. {
    117. return _str + _size;
    118. }
    119. /
    120. // modify
    121. void push_back(char c)
    122. {
    123. if (_size == _capacity)
    124. {
    125. reserve(_capacity == 0 ? 4 : 2 * _capacity);
    126. }
    127. _str[_size] = c;
    128. _size++;
    129. _str[_size] = '\0';
    130. }
    131. string& operator+=(char c)
    132. {
    133. push_back(c);
    134. return *this;
    135. }
    136. void append(const char* str)
    137. {
    138. size_t len = strlen(str);
    139. if (_size + len > _capacity)
    140. {
    141. reserve(_size + len);
    142. }
    143. strcpy(_str + _size, str);
    144. _size += len;
    145. }
    146. string& operator+=(const char* str)
    147. {
    148. append(str);
    149. return *this;
    150. }
    151. void clear()
    152. {
    153. _str[0] = '\0';
    154. _size = 0;
    155. }
    156. void swap(string& s)
    157. {
    158. std::swap(_str, s._str);
    159. std::swap(_size, s._size);
    160. std::swap(_capacity, s._capacity);
    161. }
    162. const char* c_str()const
    163. {
    164. return _str;
    165. }
    166. /
    167. // capacity
    168. size_t size()const
    169. {
    170. return _size;
    171. }
    172. size_t capacity()const
    173. {
    174. return _capacity;
    175. }
    176. bool empty()const
    177. {
    178. return _size == 0;
    179. }
    180. void resize(size_t n, char c = '\0')
    181. {
    182. if (n < _size)
    183. {
    184. _str[n] = '\0';
    185. _size = n;
    186. }
    187. else
    188. {
    189. reserve(n);
    190. while (_size < n)
    191. {
    192. _str[_size] = c;
    193. _size++;
    194. }
    195. _str[_size] = '\0';
    196. }
    197. }
    198. void reserve(size_t n)
    199. {
    200. if (n > _capacity)
    201. {
    202. char* tmp = new char[n + 1];
    203. strcpy(tmp, _str);
    204. delete[]_str;
    205. _str = tmp;
    206. _capacity = n;
    207. }
    208. }
    209. /
    210. // access
    211. char& operator[](size_t index)
    212. {
    213. assert(index < _size);
    214. return _str[index];
    215. }
    216. const char& operator[](size_t index)const
    217. {
    218. assert(index < _size);
    219. return _str[index];
    220. }
    221. /
    222. //relational operators
    223. bool operator<(const string& s)
    224. {
    225. return strcmp(_str, s._str) < 0;
    226. }
    227. bool operator<=(const string& s)
    228. {
    229. return _str < s._str || _str == s._str;
    230. }
    231. bool operator>(const string& s)
    232. {
    233. return !(_str <= s._str);
    234. }
    235. bool operator>=(const string& s)
    236. {
    237. return !(_str < s._str);
    238. }
    239. bool operator==(const string& s)
    240. {
    241. return strcmp(_str, s._str) == 0;
    242. }
    243. bool operator!=(const string& s)
    244. {
    245. return _str == s._str;
    246. }
    247. // 返回c在string中第一次出现的位置
    248. size_t find(char c, size_t pos = 0) const
    249. {
    250. assert(pos < _size);
    251. for (size_t i = pos; i < _size; i++)
    252. {
    253. if (_str[i] == _str[pos])
    254. {
    255. return i;
    256. }
    257. }
    258. return npos;
    259. }
    260. // 返回子串s在string中第一次出现的位置
    261. size_t find(const char* s, size_t pos = 0) const
    262. {
    263. const char* p = strstr(_str + pos, s);
    264. if (p)
    265. {
    266. return p - _str;
    267. }
    268. else
    269. {
    270. return npos;
    271. }
    272. }
    273. // 在pos位置上插入字符c/字符串str,并返回该字符的位置
    274. string& insert(size_t pos, char c)
    275. {
    276. if (_size == _capacity)
    277. {
    278. reserve(_capacity == 0 ? 4 : 2 * _capacity);
    279. }
    280. size_t end = _size + 1;
    281. while (end > pos)
    282. {
    283. _str[end] = _str[end - 1];
    284. --end;
    285. }
    286. _str[pos] = c;
    287. _size++;
    288. }
    289. string& insert(size_t pos, const char* str)
    290. {
    291. assert(pos <= _size);
    292. size_t len = strlen(str);
    293. if (_size + len > _capacity)
    294. {
    295. reserve(_size + len);
    296. }
    297. int end = _size;
    298. while (end >= (int)pos)
    299. {
    300. _str[end + len] = _str[end];
    301. --end;
    302. }
    303. strncpy(_str + pos, str, len);
    304. _size += len;
    305. }
    306. // 删除pos位置上的元素,并返回该元素的下一个位置
    307. string& erase(size_t pos, size_t len)
    308. {
    309. assert(pos < _size);
    310. if (len == npos || pos + len >= _size)
    311. {
    312. _str[pos] = '\0';
    313. _size = pos;
    314. }
    315. else
    316. {
    317. size_t begin = pos + len;
    318. while (begin <=_size)
    319. {
    320. _str[begin - len] = _str[begin];
    321. ++begin;
    322. }
    323. _size -= len;
    324. }
    325. }
    326. private:
    327. char* _str;
    328. size_t _size;
    329. size_t _capacity;
    330. const static size_t npos = -1;
    331. };
    332. }

  • 相关阅读:
    IPv6与IPv4的区别 网信办等三部推进IPv6规模部署
    GaussDB SQL基础语法-变量&常量
    计算机毕设(附源码)JAVA-SSM基于web在线考试系统
    c++TCP socket实时文件传输
    【毕业设计】基于javaEE+SSH+mysql+strust2的超市积分管理系统设计与实现(毕业论文+程序源码)——超市积分管理系统
    gin 集成 Swagger
    Codeforces Round #790 (Div. 4) E. Eating Queries
    全球与中国液体壁纸行业需求趋势及投资策略分析报告2022-2028年
    计算机毕业设计Java毕业设计管理系统(源码+系统+mysql数据库+lw文档)
    结构体的简单介绍(3)——结构体的内存对齐
  • 原文地址:https://blog.csdn.net/m0_61381297/article/details/134453147