【C++初阶】STL之学习string的用法

这篇具有很好参考价值的文章主要介绍了【C++初阶】STL之学习string的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

STL是C++的标准模板库,里面包含了许多算法和数据结构,例如我们熟悉的顺序表、链表、栈和队列以及一些常见的算法等等,编程者想使用这些就可以直接从库中调用,不必再自己造轮子了。

下面为STL内容的一张图:
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
接下来,我们要学习STL中的string。

一、认识下string

1.1 什么是string

string 是C++的一个类模板,字符串的类模板。要定义一个对象为字符串,就可以用string类型,说明它是一个字符串,相当于字符数组。

int main()
{
	string s1("hello yss");
	return 0;
}

1.2 为什么要有string

以前我们用C语言写代码的时候,假如字符串如果要计算它的长度,必须要调用C标准库中的函数才行。但是这些函数与字符串本身是分开的,与C++面向对象的思想不契合,而且很容易出现越界等错误,所以C++提供了string类,类里就有我们想使用的函数来操作字符串,我们只需要调用类的接口(函数)即可,更加简洁。

二、string 类的接口使用

string类有许多接口,这里只介绍一些常见的

2.1 初始化与析构

2.1.1 初始化

1️⃣无参与有参
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

int main()
{
	string s1();//无参 空字符串

	string s2("hello yss");//有参
	cout << s2 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

注意:括号里字符串也可以是一个字符,但是必须要 " y " 这样写,不能 ’ y ’ 这种写法,否则会报错。

2️⃣字符填充
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
前面的参数表示字符串的长度,后面的参数是要填充的字符。

int main()
{
	string s1(5, 'y');
	cout << s1 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

3️⃣拷贝构造
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

int main()
{
	string s1("hello yss");
	string s2(s1);
	cout << s2 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
另一种写法:

int main()
{
	string s1("hello yss");
	string s2 = s1;//用已经存在的对象去拷贝构造刚未存在的对象
	cout << s2 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

4️⃣拷贝子字符串
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
pos是从这位置开始拷贝,len是拷贝的个数

int main()
{
	string s1("hello yss");
	string s2(s1, 3, 5);//如果最后一个参数的值大于后面的
	  //长度,那么就直接把从pos位置开始的字符串全部拷贝构造
	cout << s2 << endl;
	return 0;
}

一个空格也算一个字符
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
我们发现len=npos,说明这是一个半缺省,也就是说最后的参数可以不写。

string s2(s1, 3);

npos表示size_t的最大值,作用是返回一个字符串中不存在的位置,可以判断某个子字符串是否存在。

2.1.2 析构

了解下即可
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
作用就是清理。

2.2 容量操作

2.2.1 长度大小——size和length

有两个操作函数,都可以计算字符串的有效长度
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

int main()
{
	string s1("hello yss");
	cout << s1.size() << endl;
	cout << s1.length() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
一般计算大小使用size更好,因为size表示大小即长度,length表示长度,链表、顺序表有长度的说法,但是后面要学习到的树就没有所谓的长度了,只有大小,所以,为了方便且统一,计算的大小都使用size更好些。

2.2.2 空间总大小——capacity

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
给对象预分配好一定大小的空间。如果字符串的有效长度小于预分配的空间,空间大小不变;否则再次分配一定大小的空间

int main()
{
	string s1("hello yss");
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	string s2("hello yssxxxxxxxxxxxxxxxx");
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.2.3 判空——empty

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

int main()
{
	string s1("hello yss");
	cout << s1.empty() << endl;
	string s2;
	cout << s2.empty() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.2.4 清空——clear

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
清空的是有效字符,总空间大小不变

int main()
{
	string s1("hello yss");
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.clear();
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.2.5 预留空间——reserve

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
1️⃣参数是缺省值,所以参数可写可不写,不写默认缺省值为0,小于空间大小(capacity()的预留空间大小),空间大小不变,不改变字符串中的内容。

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.reserve();
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2️⃣参数的值大于0,小于有效字符的个数

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.reserve(6);
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
小于空间总大小,所以空间总大小不变,不影响字符串的内容。

3️⃣参数的值大于等于有效字符个数,小于空间总大小

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.reserve(12);
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
还是因为预留的空间小于空间总大小,所以空间总大小不变,且不影响字符串的内容。

4️⃣参数的值大于空间总大小

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.reserve(20);
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
当预留空间大于空间总大小时,就会再分配新的空间大小,字符串的内容还是不受影响。

5️⃣调用两次,第二次参数比第一次小

int main()
{
	string s1("hello yss");
	s1.reserve(111);
	cout << s1.capacity() << endl;
	s1.reserve(6);
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
第一次调用预留空间的大小扩容后,第二次比第一次要小,不会改变,说明reserve没有缩容的功能。

总结:
1.当reserve预留的空间小于等于空间总大小时,空间总大小不变;
2.reserve预留空间不影响字符串的内容
3.reserve不能缩容。

reserve预留的空间大于空间总大小就会重新分配新的空间总大小,那么这空间总大小的增长规律是怎样的呢,看一下代码:

int main()
{
	string s1("hello yss");
	size_t len = s1.capacity();
	for (int i = 0; i < 100; i++)
	{
		s1.push_back('x');
		while (len != s1.capacity())
		{
			len = s1.capacity();
			cout << len << endl;
		}
	}
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
大概是以1.5倍的大小增长,不同的编译器可能不同。

2.2.6 改变有效字符个数、填充多余空间——resize

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
可支持两种写法,一个参数的表示有效字符个数,两个参数的分别为有效字符个数和要填充的字符。

1.先来一个参数的写法:
1️⃣参数的值小于有效字符个数

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.resize(3);
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
有效字符个数改变,字符串的内容也改变,空间总大小不变。

2️⃣参数的值大于有效字符个数、小于空间总大小

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.resize(12);
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
有效字符个数改变,字符串内容不变(没有填充字符),空间总大小不变。

3️⃣参数的值大于空间总大小

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.resize(20);
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
有效字符个数改变,字符串内容不变(没有填充字符),空间总大小改变。

2.有第二个参数(填充字符)的写法:
1️⃣参数的值小于有效字符个数

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.resize(3, 'a');
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
有效字符个数改变,字符串内容受影响,空间总大小不变。

2️⃣参数的值大于有效字符个数、小于空间总大小

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.resize(12, 'a');
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
有效字符个数改变,字符串增加的空间填充字符,空间总大小不变。

3️⃣参数的值大于空间总大小

int main()
{
	string s1("hello yss");
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	s1.resize(20, 'a');
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
有效字符个数改变,字符串增加的空间填充字符,空间总大小增加。

总结:
1.resize影响有效字符个数,小于原来有效字符个数时,字符串内容随之改变;
2.当n的值(第一个参数)大于原来的有效字符个数会在后面填充字符;
3.n小于空间总大小,空间总大小不变;否则会扩容。

2.3 遍历访问

2.3.1 下标遍历——operator[]

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
有两种写法,一个是operator关键字+运算符,另一个是直接方括号下标。

int main()
{
	string s1("hello yss");
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1.operator[](i) << " ";
		//cout << s1[i] << " ";
	}
	cout << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.3.2 范围for

int main()
{
	string s1("hello yss");
	for (auto e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.3.3 迭代器遍历——iterator

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
它是可以检查容器内的元素并遍历元素的数据类型,写法先看以下代码:

int main()
{
	string s1("hello yss");
	string::iterator s = s1.begin();
	while (s != s1.end())
	{
		cout << *s << " ";
		s++;
	}
	cout << endl;
	return 0;
}

s相当于一个指针,首先得到的是字符串的第一个字符,只要它不等于斜杠0,循环打印出每个字符,等于斜杠0跳出。

那么begin()和end()又是什么呢?
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
begin返回容器的首元素,end返回容器的最后一个元素的下一个地址。
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
还有加const的写法,用于函数调用时为了不改变字符串的内容形参加const,对应的迭代器也要加const

void Func(const string& ss)
{
	string::const_iterator s = ss.begin();
	while (s != ss.end())
	{
		cout << *s << " ";
		s++;
	}
	cout << endl;
}
int main()
{
	string s1("hello yss");
	Func(s1);
	return 0;
}

注意:是const_iterator,中间是下划线,与const iterator是不同的。const_iterator限制的指针指向的内容,所以指针指向的内容不能修改const iterator限制的是指针本身,也就是说地址不能修改。

如果要逆置字符串该怎样操作呢
1️⃣先用以前的方法:

int main()
{
	string s1("hello yss");
	string::iterator s = s1.begin();
	while (s != s1.end())
	{
		cout << *s << " ";
		s++;
	}
	cout << endl;
	size_t begin = 0;
	size_t end = s1.size() - 1;
	while (begin < end)
	{
		char tmp = s1[begin];
		s1[begin] = s1[end];
		s1[end] = tmp;
		begin++;
		end--;
	}
	s = s1.begin();
	while (s != s1.end())
	{
		cout << *s << " ";
		s++;
	}
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
这里交换两个元素时要自己写,感觉有点麻烦,可以使用模板

2️⃣交换模板:

template<class T>
void Swap(T& a, T& b)
{
	T t = a;
	a = b;
	b = t;
}
int main()
{
	string s1("hello yss");
	string::iterator s = s1.begin();
	while (s != s1.end())
	{
		cout << *s << " ";
		s++;
	}
	cout << endl;
	size_t begin = 0;
	size_t end = s1.size() - 1;
	while (begin < end)
	{
		Swap(s1[begin], s1[end]);
		begin++;
		end--;
	}
	s = s1.begin();
	while (s != s1.end())
	{
		cout << *s << " ";
		s++;
	}
	return 0;
}

不看顶上的交换模板函数,循环里的代码比前面简洁了一些,但是还是感觉挺繁琐的

3️⃣逆置算法函数:
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

int main()
{
	string s1("hello yss");
	string::iterator s = s1.begin();
	while (s != s1.end())
	{
		cout << *s << " ";
		s++;
	}
	cout << endl;
	reverse(s1.begin(), s1.end());
	s = s1.begin();
	while (s != s1.end())
	{
		cout << *s << " ";
		s++;
	}
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

不用逆置算法函数,也可以逆序遍历
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

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

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
这两个接口的也有const,与前面的同理

void Func(const string& ss)
{
	string::const_reverse_iterator s = ss.rbegin();///
	while (s != ss.rend())
	{
		cout << *s << " ";
		s++;
	}
	cout << endl;
}
int main()
{
	string s1("hello yss");
	Func(s1);
	return 0;
}

有没有发现其中一段代码太长了,所以这里就就可以用以前学过的auto来简化代码

auto s = ss.rbegin();//自动推导类型

2.4 修改操作

2.4.1 尾插字符——push_back

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

int main()
{
	string s1("hello yss");
	s1.push_back('x');
	cout << s1 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.4.2 尾插字符串——append

这个接口的可实现方式比较多,所以这里只介绍常见的
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

int main()
{
	string s1("hello yss");
	s1.append("a");
	cout << s1 << endl;
	s1.append("vvvv");
	cout << s1 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
因为是字符串,所以要双引号,但是双引号里也可以是一个字符。

2.4.3 字符串追加字符串——operator+=

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
这个比前面两个都要实用得多了,既可以尾插字符串,也可以尾插字符。而且写起来也方便。

int main()
{
	string s1("hello yss");
	s1 += "vvvv";
	cout << s1 << endl;
	string s2("hello yss");
	s2 += 'd';
	cout << s2 << endl;
	string s3("hello yss");
	s3 += s1;
	cout << s3 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.4.4 赋值——assign

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
1️⃣用一个字符串赋给另一个字符串

int main()
{
	string s1("hello yss");
	string s2 = s1.assign(s1);
	cout << s2 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2️⃣从一个字符串中提取子字符串赋给另一个字符串

int main()
{
	string s1("hello yss");
	string s2;
	s2.assign(s1,2,5);
	cout << s2 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

3️⃣一个字符串赋给另一个字符串

int main()
{
	string s2;
	s2.assign("yyyyyyyy");
	cout << s2 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

4️⃣一个字符串赋给另一个字符串,限定个数

int main()
{
	string s2;
	s2.assign("yyyyyyyy", 3);
	cout << s2 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

5️⃣字符赋给一个字符串,有个数控制

int main()
{
	string s3;
	s3.assign(10, 'x');
	cout << s3 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.4.5 插入——insert

1️⃣
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
从pos位置插入一个字符串,和可以限制插入字符串的个数。

int main()
{
	string s1("hello yss");
	s1.insert(1, "ccc");
	cout << s1 << endl;

	string s2("hello yss");
	s2.insert(3, "cccccc",3);
	cout << s2 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
2️⃣
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
从pos位置插入一个字符串。第二个有点长,在第一个的基础上可以选择要插入的字符串的起始的位置,并且限制插入的个数。

int main()
{
	string s3("hello yss");
	string s4("hello world");
	s4.insert(5, s3);
	cout << s4 << endl;

	string s5("hello yss");
	string s6("hello world");
	s6.insert(5, s5,2, 3);
	cout << s6 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
3️⃣
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
插入字符,可以控制个数

int main()
{
	string s7("hello yss");
	s7.insert(5, 4, 'x');
	cout << s7 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.4.6 删除——erase

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
1️⃣从pos位置开始删除len个字符,这两个参数都是缺省值,如果不写参数,就是一个字符串全部删除;
2️⃣删除某个位置的字符;
3️⃣删除从一个位置到另一个位置的字符串。

int main()
{
	string s1("hello yss");
	s1.erase();
	cout << s1 << endl;

	string s2("hello yss");
	s2.erase(3,5);
	cout << s2 << endl;

	string s3("hello yss");
	s3.erase(s3.begin());
	cout << s3 << endl;

	string s4("hello yss");
	s4.erase(s4.begin() + 1, s4.end() - 1);
	cout << s4 << endl;

	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.4.7 查找——find

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
查找有一个字符串或者字符,后面没有参数就默认从字符串的起始位置开始找,有写参数从pos位置开始找

int main()
{
	string s1("hello yss");
	size_t pos = s1.find(" ");
	cout << pos << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.4.8 替换——replace

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
用len个90#替换pos位置的字符

int main()
{
	string s1("hello yss");
	s1.replace(5, 1, "90#");
	cout << s1 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

小练习:把一个字符串内的所有空格替换成20%
1️⃣做法1:

int main()
{
	string s1("hello yss hello world");
	size_t pos = s1.find(" ");
	while (pos != string::npos)
	{
		s1.replace(pos, 1, "20%");
		pos = s1.find(" ", pos + 3);
	}
	cout << s1 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

假如一个字符串内有多个空格,先用pos记录第一个空格的位置,当pos不等于npos成立,说明在字符串中找到了这个pos位置,然后在这个位置替换成20%。因为前面的pos已经用过一次了,所以这里要重新定义新的pos位置找后面的空格。参数为pos+3是因为20%有3个字符,所以要跳过这3个字符开始查找。直到后面没有空格,找不到,返回整型的最大值,为-1,然后跳出循环。

find()接口的一个说明:找不到返回npos
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

这里再介绍下npos:
【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
它是静态成员常量,值为-1,是无符号类型的,所以也是整型的最大值。

2️⃣做法2:

int main()
{
	string s1("hello yss hello world");
	string s2;
	for (auto e : s1)
	{
		if (e == ' ')
		{
			s2 += "20%";
		}
		else
		{
			s2 += e;
		}
	}
	s1.swap(s2);//交换
	cout << s1 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
创建一个临时字符串,遍历原来的字符串,如果是空格,在临时的字符串+=空格,否则+=原来字符串中的字符。如果不想用临时字符串打印出来,可以交换。

2.4.9 返回C格式字符串——c_str

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
可以将 const string* 类型 转化为 const char* 类型,因为在c语言中没有string,所以要把它转变成C语言中字符串的形式。

在文件操作中C语言和C++混着用:

int main()
{
	string filename("test.cpp");
	FILE* pf = fopen(filename.c_str(), "r");
	char ch = fgetc(pf);
	while (ch != EOF)
	{
		cout << ch;
		ch = fgetc(pf);
	}
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2.4.10 截取字符串——substr

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
因为两个参数都有缺省值,两个都不写,就相当于直接取整个字符串了;后面的参数不写,从pos位置开始截取剩下的全部字符串。

1️⃣截取 . 和它后面的字符串

int main()
{
	string s1("test.cpp");
	size_t pos = s1.find('.');
	if (pos != string::npos)
	{
		string s2 = s1.substr(pos);
		cout << s2 << endl;
	}
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2️⃣如果一个字符串内有多个点,要截取最后一个点以及后面的字符串

int main()
{
	string s1("test.cpp.xxx");
	size_t pos = s1.rfind('.');
	if (pos != string::npos)
	{
		string s2 = s1.substr(pos);
		cout << s2 << endl;
	}
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
用原来的find()要从头开始找,比较麻烦。所以string还提供了另一个查找的函数——rfind(),可以逆向查找,即从后向前。

3️⃣分割网址

int main()
{
	string s("https://cplusplus.com/reference/string/string/substr/");
	string s1, s2, s3;
	size_t pos1 = s.find(':');
	if (pos1 != string::npos)
	{
		s1 = s.substr(0, pos1);
		cout << s1 << endl;
	}
	size_t pos2 = s.find('/', pos1 + 3);
	if (pos2 != string::npos)
	{
		s2 = s.substr(pos1 + 3, pos2 - pos1 - 3);
		cout << s2 << endl;
	}
	s3 = s.substr(pos2 + 1);
	cout << s3 << endl;

	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

网址的格式:
<协议>://<服务器名称>.<域名>/<目录>/<文件名>

我们是想分割成3个部分,所以定义3个string 对象,一个一个分割。首先分割出协议,先要找到冒号的位置,冒号的位置的pos1的值即为前面字符串的有效个数,所以截取字符串从起始位置开始截取pos1个。第二个分割出服务器名称和域名,要找的截至位置是 / ,但是要注意从pos1+3的位置开始找,找到后也是从pos1+3的位置开始截取,截取pos2 - pos1 - 3个。最后一个不必多说。

2.5 输入操作

2.5.1 获取一行字符串——getline

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
istream& is表示一个输入流,例如cin;char delim表示终止符,例如回车,或者别的符号。

1️⃣自己定义终止符

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

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言

2️⃣自己没有定义终止符

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

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
自己没有写终止符,默认的终止符为回车

那么这个有什么用呢?在输入一行字符串的时候,如果我们使用的是cin,它的默认终止符为空格或者换行,所以如果我们输入的字符串中有空格,打印出来的结果就不会是一行。

看以下代码:

int main()
{
	string s1;
	cin >> s1;
	cout << s1 << endl;
	return 0;
}

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言
所以如果在做题中还是在其他写代码的场景要求输出一整行字符串,getline就是一个好的选择。

【C++初阶】STL之学习string的用法,C++初阶,c++,学习,开发语言,数据结构,c语言文章来源地址https://www.toymoban.com/news/detail-759911.html

到了这里,关于【C++初阶】STL之学习string的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++STL学习第一篇(什么是STL以及string的各种功能用法)

    STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器、空间配置器。 数据结构和容器管理:STL 提供了多种数据结构和容器,如向量(vector)、链表(list)、集合(set)、映射(map)等。这些容器可以帮助程序员方便地存储和

    2024年03月09日
    浏览(34)
  • 【C++初阶】string 类的认识与学习

      在学习string类之前,先在这里推荐2个好用的网站,可以用来查阅C++的相关知识 https://cplusplus.com https://en.cppreference.com/w/ 上面的是非官方的,下面的官方的,但是个人感觉还是上面的好用。 简单来说, string 是C++中用来管理字符串的类。 他有很多接口,大致分为: 1.string类

    2024年02月09日
    浏览(47)
  • 【C++初阶】学习string类的模拟实现

    前面已经学习了string类的用法,这篇文章将更深入的学习string类,了解string类的底层是怎么实现的。当然,这里只是模拟一些常用的,不常用的可以看文档学习。 我们一共创建两个文件,一个是test.cpp文件,用于测试;另一个是string.h文件,用于声明和定义要模拟的string类。

    2024年02月03日
    浏览(52)
  • c++学习:STL之string类初识

    目录 1.关于STL 1.什么是STL 2.STL的六的组件 2.关于string类的学习 1.为何学习string类 2.何为string类 3.string类对象的构造 4.容量操作  5.元素访问的操作 6.迭代器(Iterators) 7.修改类的操作  8.字符串操作 STL(standard template library-标准模板库):是c++标准库的重要组成部分,不仅是一

    2024年02月03日
    浏览(65)
  • 第一百一十六天学习记录:C++提高:STL-string(黑马教学视频)

    string是C++风格的字符串,而string本质上是一个类 string和char 区别 1、char 是一个指针 2、string是一个类,类内部封装了char*,管理这个字符串,是一个char 型的容器。 特点: string类内部封装了很多成员方法 例如:查找find,拷贝copy,删除delete替换replace,插入insert string管理char

    2024年02月15日
    浏览(44)
  • 【C++初阶】:string类

    文档里 一般使用 string里重载了一种非常厉害的运算符[ ] 这个运算符本质上是解引用,是数组用来访问数据的运算符。所以我们可以用这个运算符对每个字符进行操作。补充个小知识:string是一个类,类里有许多的成员函数,这些成员函数下面会讲,这里先用一个size,代表字

    2024年02月08日
    浏览(35)
  • C++——模板(初阶) + string

    作者:几冬雪来 时间:2023年5月19日 内容:C++模板 + string讲解 目录 前言: 1.模板:  1.函数模板的隐/显示实例化:  2.类模板: 2.STL:  1.  什么是STL:  2.STL六大组件:  3.string类:  结尾:  在上一篇博客我们结束了动态管理的讲解,并且在最后的时候我们引出了下一个学

    2024年02月05日
    浏览(55)
  • [C++]模板初阶与STL简介

    目录 模板初阶与STL简介::                                         1.泛型编程                                         2.函数模板                                         3.类模板                                         4.什么是STL                  

    2023年04月25日
    浏览(32)
  • 【c++】STL--string

            最开始我们学习c语言的时候,我们发现刷题或者写代码都是比较麻烦的,如果说用c语言造一辆车,那么我需要用c语言先把轮子造好--各个零件,当我们造好之后再组装。那么c++则是造好了轮子,只需要我们组装就好了。这里的的STL里有各个组件,我只要熟悉的掌握

    2024年02月03日
    浏览(46)
  • C++初阶—string类(1)

      目录 1. 为什么要学习string类 1.1 C语言中的字符串 1.2 两个面试题 2. 标准库中的string类 3. string类对象的常见构造  string常见构造类的使用代码演示 4. string类对象的容量操作 string容量相关方法使用代码演示 5. string类对象的访问及遍历操作 string中元素访问及遍历代码演示 6.

    2023年04月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包