【STL】String详解

目录

  • 1.头文件:#include < string >
  • 2.string的定义及初始化
    • 练习代码
  • 3.string类对象的容量操作
    • 总结
    • 练习代码
  • 3.string类对象的访问及遍历操作
    • 三种遍历方法
  • 4.string类对象的修改操作
    • 练习代码
    • 总结

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 
#include 

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得到:
【STL】String详解_第1张图片

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 
#include 

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;
}

输出:
【STL】String详解_第2张图片

3.string类对象的访问及遍历操作

1operator[size_t pos]  //返回pos位置的字符,const string类对象调用
2begin(), end()  //begin获取第一个字符的迭代器,end获取最后一个字符下一个位置的迭
代器
3rbegin(), rend()  //rbegin获取第一个字符的前一个位置的迭代器 ,rend获取最后一个字符的迭
代器	

三种遍历方法

#include 
#include 

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
#include

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类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。

你可能感兴趣的:(c++,stl,string,字符串)