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) (重点) | 拷贝构造函数 |
- void Teststring()
- {
- string s1; // 构造空的string类对象s1
- string s2("hello bit"); // 用C格式字符串构造string类对象s2
- string s3(5,'a');//构造n个字符c的类对象
- string s4(s2); // 拷贝构造s3
- }
复制代码 1.1.2. string类对象的容量操作
- void Teststring1()
- {
- // 注意:string类对象支持直接用cin和cout进行输入和输出
- string s("hello, bit!!!");
- cout << s.size() << endl;
- cout << s.length() << endl;
- cout << s.capacity() << endl;
- cout << s << endl;
- // 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
- s.clear();
- cout << s.size() << endl;
- cout << s.capacity() << endl;
- // 将s中有效字符个数增加到10个,多出位置用'a'进行填充
- // “aaaaaaaaaa”
- s.resize(10, 'a');
- cout << s.size() << endl;
- cout << s.capacity() << endl;
- // 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
- // "aaaaaaaaaa\0\0\0\0\0"
- // 注意此时s中有效字符个数已经增加到15个
- s.resize(15);
- cout << s.size() << endl;
- cout << s.capacity() << endl;
- cout << s << endl;
- // 将s中有效字符个数缩小到5个
- s.resize(5);
- cout << s.size() << endl;
- cout << s.capacity() << endl;
- cout << s << endl;
- }
复制代码- void Teststring2()
- {
- string s;
- // 测试reserve是否会改变string中有效元素个数
- s.reserve(100);
- cout << s.size() << endl;
- cout << s.capacity() << endl;
- // 测试reserve参数小于string的底层空间大小时,是否会将空间缩小
- s.reserve(50);
- cout << s.size() << endl;
- cout << s.capacity() << endl;
- }
- // 利用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类对象的访问及遍历操作
- void Teststring4()
- {
- string s("hello world");
- // 3种遍历方式:
- // 需要注意的以下三种方式除了遍历string对象,还可以遍历可以是修改string中的字符,
- // 1. for+operator[]
- for (size_t i = 0; i < s.size(); ++i)
- cout << s[i];
- cout << endl;
- // 2.迭代器
- string::iterator it = s.begin();
- while (it != s.end())
- {
- cout << *it ;
- ++it;
- }
- cout << endl;
- //反向迭代器
- // string::reverse_iterator rit = s.rbegin();
- // C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型
- auto rit = s.rbegin();
- while (rit != s.rend())
- {
- cout << *rit;
- ++rit;
- }
-
- cout << endl;
- // 3.范围for
- for (auto ch : s)
- cout << ch ;
- cout << endl;
- }
复制代码- const迭代器
- 不允许修改字符串的内容
- void Func(const string& s)
- {
- string::const_iterator it = s.begin();
- while (it != s.end())
- {
- // *it += 2; 错误
- cout << *it << " ";
- ++it;
- }
- cout << endl;
- //string::const_reverse_iterator rit = s.rbegin();
- auto rit = s.rbegin();
- while (rit != s.rend())
- {
- // (*rit) += 3; 错误
- cout << *rit << " ";
- ++rit;
- }
- }
复制代码 string还有一个at函数,功能和operator[]基本一致,不过两者对越界的处理不一样,at函数采用抛异常,operator[]则是断言。
- void Teststring5()
- {
- string s("hello world");
- char x=s.at(0);//读
- cout<<x<<endl;
- s.at(0)='a';//写
- cout<<s<<endl;
- }
复制代码 留意以上的函数在遍历的时间都可以对字符串对象举行修改。
1.1.4. string类对象的修改操作
 - void Teststring6()
- {
- string str;
- //push_back一次只能插入一个字符
- str.push_back(' '); // 在str后插入空格
- str.append("hello"); // 在str后追加一个字符"hello"
- str += 'b'; // 在str后追加一个字符'b'
- str += "it"; // 在str后追加一个字符串"it"
- cout << str << endl;
- //c_str会返回一个指向以空字符结尾的字符数组的常量指针,此字符数组存储着string 对象中的内容。
- //和c的一些接口函数配合使用
- //以C语言的方式打印字符串(也就是以空字符 '\0' 结尾的字符数组)
- cout << str.c_str() << endl;
- // 获取file的后缀
- string file("string.cpp");
- size_t pos = file.rfind('.');
- string suffix(file.substr(pos, file.size() - pos));
- cout << suffix << endl;
- // npos是string里面的一个静态成员变量
- // static const size_t npos = -1;
- // 取出url中的域名
- string url("http://www.cplusplus.com/reference/string/string/find/");
- cout << url << endl;
- //找不到返回npos
- size_t start = url.find("://");
- if (start == string::npos)
- {
- cout << "invalid url" << endl;
- return;
- }
- start += 3;
- size_t finish = url.find('/', start);
- string address = url.substr(start, finish - start);
- cout << address << endl;
- // 删除url的协议前缀
- pos = url.find("://");
- url.erase(0, pos + 3);
- cout << url << endl;
- }
复制代码
还有insert(插入),erase(删除),assign(赋值,会覆盖原有的字符串),replace(更换)等函数,用的时间可以查文档举行利用。
字符串匹配函数
读取一行字符串,cin和scanf都有一个特性遇到空格和换行就停止,剩下的放在缓冲区,等待下一次读取,用getline可以读取一行遇到换行符停止。这个函数为非成员函数。
把数据类型转换成字符串
把字符串转化为其他类型
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |