• C++:string的使用


    目录

    1、string的介绍

    2、string的初始化 

    2.1、方法1 

    2.2、方法2

    2.3、方法3

     2.4、方法4

      2.5、方法5

       2.6、方法6

    3、string的赋值运算符重载

    4、 string的常用内置函数使用 

     5、string的遍历

    4.1数组下标访问

    4.2迭代器 

    4.3范围for 

     6、模拟实现MyString

    6.1、头文件:MyString.h

    6.2、源文件:MyString.cpp


    1、string的介绍

    string 是表示字符串的字符串类

    2、string的初始化 

    2.1、方法1 

    1. string();
    2. //空字符串构造函数(默认构造函数),构造一个长度为零个字符的空字符串。
    3. string s;

    2.2、方法2

    1. string(const string & str);
    2. //拷贝构造函数,构造str的副本
    3. string s1(str);

    2.3、方法3

    1. string(const string & str, size_t pos, size_t len = npos);
    2. //子字符串构造函数,复制str中从字符位置pos开始并跨越len个字符的部分
    3. //(如果str太短或len为string::npos,则复制到str的末尾)
    4. string s2(s, 1, 2);

     2.4、方法4

    1. string (const char* s);
    2. //复制s指向的以'\0'结尾的字符序列
    3. string s3("A character sequence");
    4. string (const char* s, size_t n);
    5. //从s指向的字符数组中复制前n个字符
    6. string s4("Another character sequence", 12);

      2.5、方法5

    1. string(size_t n, char c);
    2. //用字符c的n个连续副本填充字符串。
    3. string s5(10, 'x');
    4. string s6(10, 100); //100是ascll码值

       2.6、方法6

    1. //迭代器初始化
    2. string(InputIterator first, InputIterator last);
    3. string s7(s.begin(), s.begin() + 7);

    3、string的赋值运算符重载

    1. string str1, str2, str3;
    2. string & operator= (const char* s);
    3. str1 = "Test string: ";
    4. string& operator= (char c);
    5. str2 = 'x';
    6. string& operator= (const string & str);
    7. str3 = str1 + str2;
    8. str3 = str1;

    4、 string的常用内置函数使用 

    1. string v(10, 'x');
    2. string v1 = "www";
    3. //Iterators(迭代器)
    4. v.begin(); //获取第一个数的位置
    5. v.end(); //获取最后一个数的位置
    6. v.rbegin(); //获取最后一个数的位置
    7. v.rend(); //获取第一个数的位置
    8. //Capacity(容量)
    9. v.size(); //获取v数据的个数
    10. v.length(); //获取v数据的个数
    11. v.max_size(); //返回字符串可以达到的最大长度
    12. v.clear(); //擦除字符串的内容,该字符串将变为空字符串(长度为0个字符)
    13. v.capacity(); //获取v容量的大小
    14. v.empty(); //判断v是否为空
    15. v.resize(10); //改变vector的size,将v的现有元素个数调整至10个,多则删,少则补,其值随机
    16. v.resize(10, 3); //将v的现有元素个数调整至10个,多则删,少则补,并且赋值为3
    17. v.reserve(100); //改变vector的capacity,将v的容量扩充至100
    18. //Element access(元素访问)
    19. v[0]; //下标访问
    20. v.at(3); //返回对字符串中位置pos处的字符的引用
    21. //与下标访问的区别,函数会自动检查pos是否是字符串中字符的有效位置
    22. //(即pos是否小于字符串长度),如果不是,则抛出out_of_range异常
    23. //Modifiers(修改器)
    24. v += " K. "; //通过在字符串的当前值末尾附加附加字符来扩展字符串
    25. v.append(v1); //通过在字符串的当前值末尾附加附加字符来扩展字符串
    26. v.append(v1, 6, 3);
    27. v.append("dots are cool", 5);
    28. v.append("here: ");
    29. v.append(v1.begin(), v1.end());
    30. v.assign("c-string"); //为字符串指定一个新值,替换其当前内容
    31. v.swap(v1); //交换
    32. v.pop_back(); //尾删
    33. v.push_back(5); //尾插一个数,值为5
    34. v.insert(v.begin(), 2); //在pos前插入元素,例如头插2
    35. v.erase(v.begin()); //删除pos位置的数据,例如头删
    36. //string operations(字符串操作)
    37. v.c_str(); //字符转整型
    38. getline(cin, v); //输入值到v中,直到回车

     5、string的遍历

    4.1数组下标访问

    1. string a("www.6666.hh");
    2. for(int i = 0;i <= a.size() - 1;++i)
    3. {
    4. cout << a[i] << endl;
    5. }

    4.2迭代器 

    1. string::iterator it = a.begin();
    2. while (it != a.end())
    3. {
    4. cout << *it << " ";
    5. ++it;
    6. }
    7. cout << endl;

    4.3范围for 

    1. for (auto ch : a)
    2. {
    3. cout << ch << " ";
    4. }
    5. cout << endl;

     6、模拟实现MyString

    6.1、头文件:MyString.h

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. class MyString
    7. {
    8. public:
    9. typedef char* iterator;
    10. typedef const char* const_iterator;
    11. iterator begin()
    12. {
    13. return _str;
    14. }
    15. iterator end()
    16. {
    17. return _str + _size;
    18. }
    19. const_iterator begin() const
    20. {
    21. return _str;
    22. }
    23. const_iterator end() const
    24. {
    25. return _str + _size;
    26. }
    27. //MyString();
    28. MyString(const char* str = "");
    29. MyString(const MyString& s);
    30. ~MyString();
    31. void swap(MyString& s);
    32. MyString& operator=(MyString tmp);
    33. char& operator[](size_t pos);
    34. const char& operator[](size_t pos) const;
    35. size_t capacity() const;
    36. size_t size() const;
    37. void reserve(size_t n);
    38. void resize(size_t n, char ch = '\0');
    39. void clear();
    40. size_t find(char ch, size_t pos = 0);
    41. size_t find(const char* sub, size_t pos = 0);
    42. void push_back(char ch);
    43. void append(const char* str);
    44. void insert(size_t pos, char ch);
    45. void insert(size_t pos, const char* str);
    46. void erase(size_t pos, size_t len = npos);
    47. MyString& operator+=(char ch);
    48. MyString& operator+=(const char* str);
    49. bool operator<(const MyString& s) const;
    50. bool operator==(const MyString& s) const;
    51. bool operator<=(const MyString& s) const;
    52. bool operator>(const MyString& s) const;
    53. bool operator>=(const MyString& s) const;
    54. bool operator!=(const MyString& s) const;
    55. MyString substr(size_t pos, size_t len = npos);
    56. const char* c_str() const;
    57. private:
    58. char* _str;
    59. size_t _size;
    60. size_t _capacity;
    61. public:
    62. const static size_t npos;
    63. };
    64. std::ostream& operator<<(std::ostream& out, const MyString& s);
    65. std::istream& operator>>(std::istream& in, MyString& s);

    6.2、源文件:MyString.cpp

    1. #include"MyString.h"
    2. const size_t MyString::npos = -1;
    3. //MyString::MyString()
    4. // :_str(new char[1] {'\0'})
    5. // , _size(0)
    6. // , _capacity(0)
    7. //{}
    8. MyString::MyString(const char* str)
    9. :_size(strlen(str))
    10. , _capacity(_size)
    11. {
    12. _str = new char[_capacity + 1];
    13. strcpy(_str, str);
    14. }
    15. void MyString::swap(MyString& s)
    16. {
    17. std::swap(_str, s._str);
    18. std::swap(_size, s._size);
    19. std::swap(_capacity, s._capacity);
    20. }
    21. // s2(s1)
    22. MyString::MyString(const MyString& s)
    23. :_str(nullptr)
    24. , _size(0)
    25. , _capacity(0)
    26. {
    27. MyString tmp(s._str);
    28. swap(tmp);
    29. }
    30. // s2 = s3
    31. MyString& MyString::operator=(MyString tmp)
    32. {
    33. swap(tmp);
    34. return *this;
    35. }
    36. MyString::~MyString()
    37. {
    38. delete[] _str;
    39. _str = nullptr;
    40. _size = _capacity = 0;
    41. }
    42. char& MyString::operator[](size_t pos)
    43. {
    44. assert(pos < _size);
    45. return _str[pos];
    46. }
    47. const char& MyString::operator[](size_t pos) const
    48. {
    49. assert(pos < _size);
    50. return _str[pos];
    51. }
    52. size_t MyString::capacity() const
    53. {
    54. return _capacity;
    55. }
    56. size_t MyString::size() const
    57. {
    58. return _size;
    59. }
    60. const char* MyString::c_str() const
    61. {
    62. return _str;
    63. }
    64. void MyString::reserve(size_t n)
    65. {
    66. if (n > _capacity)
    67. {
    68. char* tmp = new char[n + 1];
    69. strcpy(tmp, _str);
    70. delete[] _str;
    71. _str = tmp;
    72. _capacity = n;
    73. }
    74. }
    75. void MyString::resize(size_t n, char ch)
    76. {
    77. if (n <= _size)
    78. {
    79. _str[n] = '\0';
    80. _size = n;
    81. }
    82. else
    83. {
    84. reserve(n);
    85. while (_size < n)
    86. {
    87. _str[_size] = ch;
    88. ++_size;
    89. }
    90. _str[_size] = '\0';
    91. }
    92. }
    93. size_t MyString::find(char ch, size_t pos)
    94. {
    95. for (size_t i = pos; i < _size; i++)
    96. {
    97. if (_str[i] == ch)
    98. {
    99. return i;
    100. }
    101. }
    102. return npos;
    103. }
    104. size_t MyString::find(const char* sub, size_t pos)
    105. {
    106. const char* p = strstr(_str + pos, sub);
    107. if (p)
    108. {
    109. return p - _str;
    110. }
    111. else
    112. {
    113. return npos;
    114. }
    115. }
    116. MyString MyString::substr(size_t pos, size_t len)
    117. {
    118. MyString s;
    119. size_t end = pos + len;
    120. if (len == npos || pos + len >= _size) // 有多少取多少
    121. {
    122. len = _size - len;
    123. end = _size;
    124. }
    125. s.reserve(len);
    126. for (size_t i = pos; i < end; i++)
    127. {
    128. s += _str[i];
    129. }
    130. return s;
    131. }
    132. void MyString::push_back(char ch)
    133. {
    134. if (_size == _capacity)
    135. {
    136. reserve(_capacity == 0 ? 4 : _capacity * 2);
    137. }
    138. _str[_size] = ch;
    139. ++_size;
    140. _str[_size] = '\0';
    141. }
    142. void MyString::append(const char* str)
    143. {
    144. size_t len = strlen(str);
    145. if (_size + len > _capacity)
    146. {
    147. reserve(_size + len);
    148. }
    149. strcpy(_str + _size, str);
    150. _size += len;
    151. }
    152. MyString& MyString::operator+=(char ch)
    153. {
    154. push_back(ch);
    155. return *this;
    156. }
    157. MyString& MyString::operator+=(const char* str)
    158. {
    159. append(str);
    160. return *this;
    161. }
    162. // insert(0, 'x')
    163. void MyString::insert(size_t pos, char ch)
    164. {
    165. assert(pos <= _size);
    166. if (_size == _capacity)
    167. {
    168. reserve(_capacity == 0 ? 4 : _capacity * 2);
    169. }
    170. size_t end = _size + 1;
    171. while (end > pos)
    172. {
    173. _str[end] = _str[end - 1];
    174. --end;
    175. }
    176. _str[pos] = ch;
    177. _size++;
    178. }
    179. void MyString::insert(size_t pos, const char* str)
    180. {
    181. assert(pos <= _size);
    182. size_t len = strlen(str);
    183. if (_size + len > _capacity)
    184. {
    185. reserve(_size + len);
    186. }
    187. // 挪动数据
    188. int end = _size;
    189. while (end >= (int)pos)
    190. {
    191. _str[end + len] = _str[end];
    192. --end;
    193. }
    194. strncpy(_str + pos, str, len);
    195. _size += len;
    196. }
    197. void MyString::erase(size_t pos, size_t len)
    198. {
    199. assert(pos < _size);
    200. if (len == npos || pos + len >= _size)
    201. {
    202. _str[pos] = '\0';
    203. _size = pos;
    204. }
    205. else
    206. {
    207. size_t begin = pos + len;
    208. while (begin <= _size)
    209. {
    210. _str[begin - len] = _str[begin];
    211. ++begin;
    212. }
    213. _size -= len;
    214. }
    215. }
    216. bool MyString::operator<(const MyString& s) const
    217. {
    218. return strcmp(_str, s._str) < 0;
    219. }
    220. bool MyString::operator==(const MyString& s) const
    221. {
    222. return strcmp(_str, s._str) == 0;
    223. }
    224. bool MyString::operator<=(const MyString& s) const
    225. {
    226. return *this < s || *this == s;
    227. }
    228. bool MyString::operator>(const MyString& s) const
    229. {
    230. return !(*this <= s);
    231. }
    232. bool MyString::operator>=(const MyString& s) const
    233. {
    234. return !(*this < s);
    235. }
    236. bool MyString::operator!=(const MyString& s) const
    237. {
    238. return !(*this == s);
    239. }
    240. void MyString::clear()
    241. {
    242. _str[0] = '\0';
    243. _size = 0;
    244. }
    245. std::ostream& operator<<(std::ostream& out, const MyString& s)
    246. {
    247. for (auto ch : s)
    248. out << ch;
    249. return out;
    250. }
    251. std::istream& operator>>(std::istream& in, MyString& s)
    252. {
    253. s.clear();
    254. char buff[129];
    255. size_t i = 0;
    256. char ch;
    257. ch = in.get();
    258. while (ch != ' ' && ch != '\n')
    259. {
    260. buff[i++] = ch;
    261. if (i == 128)
    262. {
    263. buff[i] = '\0';
    264. s += buff;
    265. i = 0;
    266. }
    267. //s += ch;
    268. ch = in.get();
    269. }
    270. if (i != 0)
    271. {
    272. buff[i] = '\0';
    273. s += buff;
    274. }
    275. return in;
    276. }

  • 相关阅读:
    Jenkins 10 问 10 答,你想知道都在这
    c++装饰器模式
    UI5:面向企业级应用的JavaScript框架
    Beyond Compare远程对比
    Elasticsearch优化
    微信小程序使用 ECharts
    【Vue项目复习笔记】Home离开时记录状态和位置
    Excel 语法
    感知机Perceptron
    Seata 1.5.2 源码学习(Client端)
  • 原文地址:https://blog.csdn.net/weixin_74268082/article/details/134054441