C++STL专题-string类

目录

1.标准库中的string类

1.1 string类

2.2 auto和范围for

2.2.1 auto关键字

2.2.2 范围for

2.3 string类的常用接口讲解

1.string类对象的常见构造

2.元素访问

3.迭代器(iterator)

3.1 begin 和 end

3.2 rbegin 和 rend

4.容器

5.修改

5.1 append

5.2 assign

5.3 insert

5.4 erase

5.5 replace

5.字符串操作

5.1 find

6.getline函数

6.1 第一种声明方式是传递三个参数。

6.2 第二种声明方式是传递两个参数


1.标准库中的string类

1.1 string类

头文件:#include<string>

string是管理字符串的类,在使用string类时,必须包含#include头文件以及using namespace std;

string类

其实string是typedef出来的,原型为basic_string<char>

 

2.2 auto和范围for

2.2.1 auto关键字

主要作用:替换长类型

auto错误使用总结:
(1).auto做类型不初始化

int main()
{
	auto e;//错误
	return 0;
}

(2).auto不能定义数组

int main()
{
	auto a[10] = { 1,2,3,4 };//错误
	return 0;
}

(3).auto不能做函数的参数(但是可以做返回值)

int add(auto a, auto b)//错误
{
	return a + b;
}
int main()
{
	int a = 1, b = 2;
	cout << add(a, b);
	return 0;
}

2.2.2 范围for

(1).C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围
内用于迭代的变量
第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。

(2).范围for可以作用到数组和容器对象上进行遍历。

(3).范围for的底层很简单,容器遍历实际就是替换为迭代器。

遍历数组:

int main()
{
	int a[10] = { 1,2,3,4,5 };
	for (auto num : a)
	{
		cout << num << ' ';
	}
	return 0;
}

2.3 string类的常用接口讲解

1.string类对象的常见构造

重点
(constructor)函数名称功能说明
string()   (重点)构造空的string类对象,即空字符串
string(const char* s)   (重点)用C-string来构造string类对象
string(const string&s)   (重点)拷贝构造函数

int main()
{
	string s1;
	string s2("666");
	string s3(s2);

	cout << "string() " << s1 << endl;
	cout << "string(const char* s) " << s2 << endl;
	cout << "string(const string&s) " << s3 << endl;
}

运行结果:

 

了解
(constructor)函数名称功能说明
string(size_t n, char c)开辟n个空间,全部初始化为c
string(const string& str,size_t pos,size_t len=npos)从第pos个位置开始,拷贝len个字符
string(const char* s,size_t n)

去字符串前n个

int main()
{
	string s1("hello world");

	string s2(5, 'a');
	string s3(s1, 5, 6);
	string s4("hello", 4);
	cout << "string(size_t n, char c):" << s2 << endl;
	cout <<"string(const string& str,size_t pos,size_t len=npos):"<<s3 << endl;
	cout <<"string(const char* s,size_t n):"<< s4 << endl;
}

运行结果:

2.元素访问

operator[]重载[]号,可以利用下标直接获取改下标的字符,并且可以修改。
at与[]功能类似,如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。也支持修改。
back获取最后一个字符
front获取第一个字符

 

int main()
{
	string s1("hello world");
	cout << s1.at(1) << endl;
	cout << s1[1] << endl;
	cout << s1.front() << endl;
	cout << s1.back() << endl;

	s1[1] = '8';
	cout << s1 << endl;
	s1.at(1) = '0';
	cout << s1 << endl;
    return 0;
}

  运行结果:

3.迭代器(iterator)

迭代器可用来遍历和访问容器

迭代器有四种

iterator

const_iterator

reverse_iterator

const_reverse_iterator

begin返回第一个位置的迭代器(正向)
end返回最后一个位置的下一个位置的迭代器(正向)
rbegin返回最后一个位置的迭代器(反向)
rend返回第一个位置的迭代器(反向)
cbegin返回(const)第一个位置的迭代器(正向)
cend返回(const)最后一个位置的下一个位置的迭代器(正向)
crbegin返回(const)最后一个位置的迭代器(反向)
crend返回(const)第一个位置的迭代器(反向)

 

3.1 begin 和 end

迭代器实现遍历

方法一:

int main()
{
	string s1("hello world");

	string::iterator t = s1.begin();
	while (t != s1.end())
	{
		cout << *t;
		t++;
	}
	return 0;
}

运行结果:

方法二:

C++11支持

int main()
{
	string s1("hello world");

	for (auto c : s1)
	{
		cout << c;
	}
	return 0;
}

运行结果:

迭代器实现修改

int main()
{
	string s1("hello world");
	string s2("hello world");
	string::iterator t = s2.begin();
	while (t != s2.end())
	{
		(*t)++;
		cout << *t;
		t++;
	}
	cout << endl;
	for (auto& c : s1)//要加引用
	{
		c += 1;
		cout << c;
	}

	return 0;
}

运行结果:

3.2 rbegin 和 rend

反向遍历string

int main()
{
	string s("hello world");
	string::reverse_iterator t = s.rbegin();
	while (t != s.rend())
	{
		cout << *t;
		*t++;
	}
	return 0;
}

注意:尽管是反向迭代器,仍然是 *t++。

4.容器

size返回string的大小,与length无区别
length返回string的长度,与size无区别
max_size返回string可容纳的最大长度
resize

重新开辟空间

capacity返回当前string的容量
reserve可以提前开辟空间,扩大空间,可最小缩小空间到当前字符串的大小。
clear清除所有字符,但不修改容量
empty判断字符串是否为空

 

5.修改

operator+=在字符串后面添加字符或者字符串
append在字符串后面添加字符或者字符串
push_back将字符附加到字符串
assign将一个字符串分配给此字符串,覆盖赋值,会覆盖原先的字符串。
insert插入字符串
erase从字符串中删除字符串
replace替换字符串的一部分
swap交换字符串值
pop_back删除最后一个字符

 

5.1 append

int main()
{
	string s("hello world");
	s.append("6");
	cout << s << endl;
	s.append("999");
	cout << s << endl;
	return 0;
}

运行结果:

5.2 assign

int main()
{
	string s("hello world");
	s.assign("231");
	cout << s << endl;
	return 0;
}

运行结果:

5.3 insert

在pos之前位置插入字符串

实现头插:

int main()
{
	string s("hello world");
	s.insert(0, "hello mike");
	cout << s << endl;
	return 0;
}

运行结果:

5.4 erase

实现头删:
 

int main()
{
	string s("hello world");

	s.erase(0, 1);//在第0个位置删除1个字符
	cout << s << endl;
	return 0;
}

运行结果:

5.5 replace

int main()
{
	string s("hello world");

	s.replace(5, 1, "##");//从第5个开始的1个长度,替换为##
	cout << s << endl;
	return 0;
}

运行结果:

5.字符串操作

5.1 find

若成功找到,则返回所在字符串中的第一个位置,若没有找到,则返回string::npos

int main()
{
	string s("hello world");
	cout << s.find(" ") << endl;
	return 0;
}

运行结果:

int main()
{
	string s("hello world");
	if (s.find("asd") == string::npos)
	{
		cout << "string::npos" << endl;
	}
	return 0;
}

运行结果:

6.getline函数

6.1 第一种声明方式是传递三个参数。

istream& getline( istream& is, string& strs, char delim );

is:istream类的对象,定义从哪里读取输入流。

strs:存储字符串的string字符串。

delim:规定遇到什么字符停止。

int main()
{
	string s;
	getline(cin, s, '*');
	cout << s << endl;
	return 0;
}

 遇到*时停止输入。

运行结果:

 

6.2 第二种声明方式是传递两个参数

istream& getline( istream& is, string& str );

is:istream类的对象,定义从哪里读取输入流。

strs:存储字符串的string字符串。

两个参数时,默认遇到换行符时停止。


本篇完

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值