C++ string类

打印 上一主题 下一主题

主题 1732|帖子 1732|积分 5196

1.标准库中的string类

在 C++ 里,string类属于标准库的一部分,它在<string>头文件中定义,用于处理和操作字符串。
1.1string类的常用接口阐明

1.1.1. string类对象的常见构造

           string() (重点)                 构造空的string类对象,即空字符串      
           string(const char* s) (重点)                 用C-string来构造string类对象      
           string(size_t n, char c)                 string类对象中包含n个字符c      
           string(const string&s) (重点)                 拷贝构造函数      
  1. void Teststring()
  2. {
  3. string s1; // 构造空的string类对象s1
  4. string s2("hello bit"); // 用C格式字符串构造string类对象s2
  5. string s3(5,'a');//构造n个字符c的类对象
  6. string s4(s2); // 拷贝构造s3
  7. }
复制代码
1.1.2. string类对象的容量操作


  1. void Teststring1()
  2. {
  3.         // 注意:string类对象支持直接用cin和cout进行输入和输出
  4.         string s("hello, bit!!!");
  5.         cout << s.size() << endl;
  6.         cout << s.length() << endl;
  7.         cout << s.capacity() << endl;
  8.         cout << s << endl;
  9.         // 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
  10.         s.clear();
  11.         cout << s.size() << endl;
  12.         cout << s.capacity() << endl;
  13.         // 将s中有效字符个数增加到10个,多出位置用'a'进行填充
  14.         // “aaaaaaaaaa”
  15.         s.resize(10, 'a');
  16.         cout << s.size() << endl;
  17.         cout << s.capacity() << endl;
  18.         // 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
  19.         // "aaaaaaaaaa\0\0\0\0\0"
  20.         // 注意此时s中有效字符个数已经增加到15个
  21.         s.resize(15);
  22.         cout << s.size() << endl;
  23.         cout << s.capacity() << endl;
  24.         cout << s << endl;
  25.         // 将s中有效字符个数缩小到5个
  26.         s.resize(5);
  27.         cout << s.size() << endl;
  28.         cout << s.capacity() << endl;
  29.         cout << s << endl;
  30. }
复制代码
  1. void Teststring2()
  2. {
  3.         string s;
  4.         // 测试reserve是否会改变string中有效元素个数
  5.         s.reserve(100);
  6.         cout << s.size() << endl;
  7.         cout << s.capacity() << endl;
  8.         // 测试reserve参数小于string的底层空间大小时,是否会将空间缩小
  9.         s.reserve(50);
  10.         cout << s.size() << endl;
  11.         cout << s.capacity() << endl;
  12. }
  13. // 利用reserve提高插入数据的效率,避免增容带来的开销
复制代码
  留意:      1. size()与length()方法底层实现原理完全相同,引入size()的缘故原由是为了与其他容器的接口保持一     致,一般情况下基本都是用size()。      2. clear()只是将string中有效字符清空,不改变底层空间大小。      3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,差别的是当字符个数增多时:resize(n)用0来添补多出的元素空间,resize(size_t n, char c)用字符c来添补多出的元素空间。留意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大     小,如果是将元素个数减少,底层空间总大小不变,但会删除数据。     4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于     string的底层空间总大小时,reserver不会改变容量大小(缩容时,如果有数据就不会改变容量大小,如果clear以后,没有数据就会缩容)。   1.1.3. string类对象的访问及遍历操作


  1. void Teststring4()
  2. {
  3.     string s("hello world");
  4.     // 3种遍历方式:
  5.     // 需要注意的以下三种方式除了遍历string对象,还可以遍历可以是修改string中的字符,
  6.     // 1. for+operator[]
  7.     for (size_t i = 0; i < s.size(); ++i)
  8.         cout << s[i];
  9.     cout << endl;
  10.     // 2.迭代器
  11.     string::iterator it = s.begin();
  12.     while (it != s.end())
  13.     {
  14.         cout << *it ;
  15.         ++it;
  16.     }
  17.     cout << endl;
  18.     //反向迭代器
  19.     // string::reverse_iterator rit = s.rbegin();
  20.     // C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型
  21.     auto rit = s.rbegin();
  22.     while (rit != s.rend())
  23.     {
  24.         cout << *rit;
  25.         ++rit;
  26.     }
  27.       
  28.     cout << endl;
  29.     // 3.范围for
  30.     for (auto ch : s)
  31.         cout << ch ;
  32.     cout << endl;
  33. }
复制代码
  1. const迭代器
  2. 不允许修改字符串的内容
  3. void Func(const string& s)
  4. {
  5.         string::const_iterator it = s.begin();
  6.         while (it != s.end())
  7.         {
  8.                 // *it += 2;  错误
  9.                 cout << *it << " ";
  10.                 ++it;
  11.         }
  12.         cout << endl;
  13.         //string::const_reverse_iterator rit = s.rbegin();
  14.         auto rit = s.rbegin();
  15.         while (rit != s.rend())
  16.         {
  17.                 // (*rit) += 3; 错误
  18.                 cout << *rit << " ";
  19.                 ++rit;
  20.         }
  21. }
复制代码
string还有一个at函数,功能和operator[]基本一致,不过两者对越界的处理不一样,at函数采用抛异常,operator[]则是断言。
  1. void Teststring5()
  2. {
  3. string s("hello world");
  4. char x=s.at(0);//读
  5. cout<<x<<endl;
  6. s.at(0)='a';//写
  7. cout<<s<<endl;
  8. }
复制代码
留意以上的函数在遍历的时间都可以对字符串对象举行修改。
1.1.4. string类对象的修改操作

   
  1. void Teststring6()
  2. {
  3.         string str;
  4.     //push_back一次只能插入一个字符
  5.         str.push_back(' ');   // 在str后插入空格
  6.         str.append("hello");  // 在str后追加一个字符"hello"
  7.         str += 'b';           // 在str后追加一个字符'b'   
  8.         str += "it";          // 在str后追加一个字符串"it"
  9.         cout << str << endl;
  10.     //c_str会返回一个指向以空字符结尾的字符数组的常量指针,此字符数组存储着string 对象中的内容。
  11.     //和c的一些接口函数配合使用
  12.     //以C语言的方式打印字符串(也就是以空字符 '\0' 结尾的字符数组)
  13.         cout << str.c_str() << endl;
  14.         // 获取file的后缀
  15.         string file("string.cpp");
  16.         size_t pos = file.rfind('.');
  17.         string suffix(file.substr(pos, file.size() - pos));
  18.         cout << suffix << endl;
  19.         // npos是string里面的一个静态成员变量
  20.         // static const size_t npos = -1;
  21.         // 取出url中的域名
  22.         string url("http://www.cplusplus.com/reference/string/string/find/");
  23.         cout << url << endl;
  24.     //找不到返回npos
  25.         size_t start = url.find("://");
  26.         if (start == string::npos)
  27.         {
  28.                 cout << "invalid url" << endl;
  29.                 return;
  30.         }
  31.         start += 3;
  32.         size_t finish = url.find('/', start);
  33.         string address = url.substr(start, finish - start);
  34.         cout << address << endl;
  35.         // 删除url的协议前缀
  36.         pos = url.find("://");
  37.         url.erase(0, pos + 3);
  38.         cout << url << endl;
  39. }
复制代码

还有insert(插入),erase(删除),assign(赋值,会覆盖原有的字符串),replace(更换)等函数,用的时间可以查文档举行利用。







字符串匹配函数


读取一行字符串,cin和scanf都有一个特性遇到空格和换行就停止,剩下的放在缓冲区,等待下一次读取,用getline可以读取一行遇到换行符停止。这个函数为非成员函数。

把数据类型转换成字符串

把字符串转化为其他类型


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表