STLString详解
Posted 久病成良医
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STLString详解相关的知识,希望对你有一定的参考价值。
目录
1.头文件:#include < string >
2.string的定义及初始化
1)string s1; //默认构造函数,s1为空串
cin>>s1; //写入有效字符到遇到空格
2)string s2(“abcdef”) //将字符串abcdef作为s2的初值
3)string s3(s2); //将s3初始化为s2的一个副本(拷贝构造函数生成s1的复制品)
4)string s4(n,'c'); //将s4初始化为字符'c'的n个副本
5)string s5(str,index) //将字符串str内“始于位置index”的部分当作字符串s5的初值
6)string s6(str,index, n) //将字符串str内“始于index且长度顶多n”的部分作为字符串s6的初值
7)string s7(“abcdef”,n) //将字符串abcdef前n个字符作为字符串s7的初值
8)string s8(str.begin(),str.end()) //以字符串str区间begin():end() (不包含end())内的字符作为字符串s8的初值
练习代码
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1;
cin >> s1;
string s2("abcde");
string s3(s2);
string s4(10, 'x');
string s5(s2, 2);
string s6(s2, 2, 1);
string s7("abcdefg", 4);
string s8(s7.begin(), s7.end());
cout << "s1:" << s1 << endl;
cout << "s2:" << s2 << endl;
cout << "s3:" << s3 << endl;
cout << "s4:" << s4 << endl;
cout << "s5:" << s5 << endl;
cout << "s6:" << s6 << endl;
cout << "s7:" << s7 << endl;
cout << "s8:" << s8 << endl;
return 0;
}
输入123456得到:
3.string类对象的容量操作
1) size(), length() //返回字符串的有效长度,一般用size()
2) capacity() //返回空间总大小
3) empty() //检测字符串是否为空串,是返回true,否则返回false
4) clear() //清空有效字符
5) reserve() //为字符串预留空间
6) resize() //将有效字符串的个数改为n个,多出的空间用字符c填充
总结
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不会改变容量大小。
练习代码
#include <iostream>
#include <string>
using namespace std;
int main(){
string s("abcdef");
cout << s.size() << endl;
cout << s.length() << endl;
cout << s.capacity() << endl; //capacity为什么是15?
s.clear(); // 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
s.resize(10, '1'); //将s中有效字符个数增加到10个,多出位置用'1'进行填充
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
s.resize(20); //将s中有效字符个数增加到20个,多出位置用缺省值'\\0'进行填充
cout << s.size() << endl;
cout << s.capacity() << endl; //resize变大,capacity变为原来的2倍
cout << s << endl;
s.resize(2); //将s中有效字符个数缩小到5个
cout << s.size() << endl;
cout << s.capacity() << endl; //resize变小,不改变capacity空间大小。capacity可大不可小
cout << s << endl;
s.reserve(50); //为字符串预留空间
cout << s.size() << endl;
cout << s.capacity() << endl;
s.reserve(20);
cout << s.size() << endl;
cout << s.capacity() << endl; //reserve缩小空间,capacity并不会缩小。capacity可大不可小
return 0;
}
输出:
3.string类对象的访问及遍历操作
1)operator[size_t pos] //返回pos位置的字符,const string类对象调用
2)begin(), end() //begin获取第一个字符的迭代器,end获取最后一个字符下一个位置的迭
代器
3)rbegin(), rend() //rbegin获取第一个字符的前一个位置的迭代器 ,rend获取最后一个字符的迭
代器
三种遍历方法
#include <iostream>
#include <string>
using namespace std;
int main(){
string s("abcdef");
//方法1.for+operator
for (int i = 0; i < s.size(); ++i){
cout << s[i] << ' ';
}
cout << endl;
//方法2.迭代器
string::iterator it = s.begin(); //容器名::iterator 名字
while (it != s.end()){
cout << *it << ' '; //it是迭代器,*it是迭代器指向的内容
++it; //最好使用前置++
}
cout << endl;
//方法3.范围for
for (auto ch : s)
cout << ch <<' ';
cout << endl;
return 0;
}
结果:
4.string类对象的修改操作
1) push_back() //在字符串后尾插字符c(加字符)
2) append() //在字符串后追加一个字符串(加字符串)
3) operator+= //在字符串后追加字符串str
4) c_str() //返回C格式字符串
5) find + npos //从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
6) rfind //从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
7) substr //在str中从pos位置开始,截取n个字符,然后将其返回
练习代码
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
s.push_back('1'); //push_back只能添加单个字符
s.push_back('2');
s.push_back('3');
s.append("abcd"); //append可以添加字符串
s.append("w"); //append也可以添加单个字符,但是单个字符必须用双引号"w",不能用单引号'w'
s += 'q';
s += "xyz"; // += 可以添加单个字符也可以添加字符串
cout << s << endl;
cout << s.c_str() << endl; //以C语言的方式打印字符串
return 0;
}
总结
在string尾部追加字符时,s.push_back() / s.append() / s += 'c’三种的实现方式差不多,一般
情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
以上是关于STLString详解的主要内容,如果未能解决你的问题,请参考以下文章