string类的各个接口以及用法

string类

string的接口

#include<stdio.h>
#include<iostream>
using namespace std;
void test()
{
	string str;//创建一个空的字符串
	string copy(str);//复制一个字符串
	string str2("abc");//创建一个字符串
	string substr(str2, 1, 2);//从1位置取出str2的2个字符
	string str3("12345678", 5);//取出字符串的前5个字符
	string str4(10, 'a');//创建一个字符有10个a
	string str5 = "abcde";//单参构造的隐式类型转换
}
int main()
{
	test();
	return 0;
}

在这里插入图片描述

void test1()
{
	const string str = "12345";
	//const对象,调用的接口为:const char& operator[](size_t pos)const
	string str2 = "12345";
	//非const对象调用的接口为:char& operator[](size_t pos)
	char ch = str[3];
	//str[3] = 'a';//错误,因为str是const对象,只能读不能写
	char ch2 = str2[3];
	str2[3] = '1';//也可写为str2.at(3) = '1';
}

在这里插入图片描述
迭代器:
是一种设计模式,如果要访问元素可以通过迭代器来进行访问。优点:所有容器都需要遵循相同的设计规范,所有容器迭代器的使用方式都是相同的。
迭代器的使用方式:
和指针类似。
设计规范:
1.begin迭代器:指向第一个元素的位置,通过解引用这个迭代器即可得到第一个元素
2.end迭代器:指向最后一个元素的后一个位置(注意不是指向最后一个元素)即左闭右开
3.访问数据:通过解引用完成 “*” 或者“->”
4.迭代器移动:++移动到下一个元素的位置,–移动到上一个元素的位置
5.位置的判断:支持!=,==
有些容器具有反向迭代器,在反向迭代器中有以下操作
6.rbegin迭代器:指向最后一个元素的位置
7.rend迭代器:指向第一个元素的前一个位置(注意不是指向第一个元素)即左闭右开
正向迭代器的演示

void testiterator()
{
	string str = "12345";
	string::iterator it = str.begin();//设置起始位置的迭代器为it
	for (; it != str.end(); it++)//当it没有移动到最后一个元素的后一个位置时
	{
		cout << *it << endl;//对迭代器进行解引用获取元素
	}
}

在这里插入图片描述

void testiterator()
{
	string str = "12345";
	string::iterator it = str.begin();//设置起始位置的迭代器为it
	for (; it != str.end(); it++)//当it没有移动到最后一个元素的后一个位置时
	{
		cout << *it << endl;//对迭代器进行解引用获取元素
		*it = 'a';//通过迭代器进行内容的修改,但如果是const string str,则不能修改
	}
	const string str2 = "abcd";
	string::const_iterator it2 = str2.begin();//str2的内容不能被修改
}

在这里插入图片描述
反向迭代器

void testriterator()
{
	string str = "12345";
	string::reverse_iterator it = str.rbegin();
	while (it != str.rend())
	{
		cout << *it << endl;
		++it;//反向移动,向前移动
	}
}

在这里插入图片描述

void test()
{
	//范围for循环:可以访问范围确定的序列
	//int arr[] = { 1,2,3,4,5 };
	//for (const auto&e : arr)
	//{
	//	cout << e << "";
	//}
	//cout << endl;
	//范围for实际上是通过迭代器来实现的
	//支持迭代器访问的自定义类型都可以支持范围for
	string str = "12345";
	for (auto& ch : str)
	{
		cout << ch << " ";
	}
}

在这里插入图片描述
总结:
string的访问方式有三种:
1.for循环+operator[]
2.迭代器
3.范围for
这三种方式都可以修改内容
resize接口

void testresize()
{
	string str;
	cout << str.size() << endl;
	str.resize(10);//resize,修改有效字符的个数
	cout << str.size() << endl;
}

在这里插入图片描述

void testresize()
{
	string str = "123";
	str.resize(2);//str = "12"
	str.resize(4, 'a');//str = "12aa"
}

总结:
resize(n):如果有效字符的个数增加,则新增的位置填充’\0’
resize(n,ch):如果有效字符的个数增加,则新增的位置填充ch
如果有效字符的个数减小,不会进行填充
capacity接口

void testcapacity()
{
	string str = "123";
	int cap = str.capacity();//当前str中可以存放元素的个数
}

在这里插入图片描述

void testcapacity()
{
	string str = "123";
	int cap = str.capacity();//当前str中可以存放元素的个数
	str.resize(20);//size大于capacity时,capacity也发生变换
	cap = str.capacity();
}

在这里插入图片描述

void testcapacity()
{
	string str = "123";
	int cap = str.capacity();//当前str中可以存放元素的个数
	str.resize(20);
	cap = str.capacity();
	//reserve,修改容量,只能增加容量,不影响size
	str.reserve(40);
	cap = str.capacity();
}

在这里插入图片描述
一开始capacity是15是因为底层有16个空间,最后一个空间要放’\0’;
增容的规则是按1.5倍增长。
clear接口

void testcapacity()
{
	string str = "123";
	int cap = str.capacity();//当前str中可以存放元素的个数
	str.resize(20);
	cap = str.capacity();
	//reserve,修改容量,只能增加容量,不影响size
	str.reserve(40);
	cap = str.capacity();
	//clear:清空有效字符,只影响size
	str.clear();
	int sz = str.size();
	cap = str.capacity();
}

在这里插入图片描述

void testcz()
{
	string str = "123";
	int sz = str.size();
	int cap = str.capacity();
	str.reserve(100);
	str.shrink_to_fit();//将capacity与size相匹配,不一定是一样的值,量级匹配即可
    sz = str.size();
	cap = str.capacity();
}

在这里插入图片描述
+=接口

void testp()
{
	string str;
	string str2 = "123";
	str += str2;//123
	str += str2;//123123
	str += '4';//1231234,简写
	str.operator+=('5');//12312345,标准形式
}

append接口

void test()
{
	string str;
	string str2 = "123";
	str.append(str2);//123
	str.append(str2, 1, 1);//1232
	str.append("abc");//1232abc
	str.append("123456", 4);//1232abc1234
	str.append(5, 'n');//1232abc1234nnnnn
	char arr[] = "abcde";
	str.append(arr, arr + sizeof(arr) / sizeof(arr[0]));//1232abc1234nnnnnabcde\0
	str.append(str2.begin(), str2.end());//1232abc1234nnnnnabcde\0123
	str.append("12345", 1, 2);//1232abc1234nnnnnabcde\012323
}

assign接口
赋值

void test1()
{
	string str;
	string str2 = "123";
	str.assign(str2);//123
	str.assign(str2, 1, 1);//2
	str.assign("abc");//abc
	str.assign("abcde", 2);//ab
	str.assign(5, 'a');//aaaaa
	str.assign(++str2.begin(), str2.end());//23
	str.assign("abcd", 1, 2);//bc
}

insert接口

void test2()
{
	string str = "123";
	string str2 = "abc";
	str.insert(0, str2);//在第0个位置前面插入str2,abc123
	str.insert(4, str2, 1, 2);//从第4个位置开始插入str2的第1个位置开始的2个字符,abc1bc23
	str.insert(str.size(), "abc");//abc1bc23abc
	str.insert(5, "12345", 4);//abc1b1234c23abc
	str.insert(str.begin(), 2, '0');//00abc1b1234c23abc
	str.insert(str.end(), str2.begin(), str2.end());
}

push_back接口

void test()
{
	string str;
	str.push_back('1');//在str后插1
}

pop_back接口

void test2()
{
	string str = "1234";
	str.pop_back();
}

在这里插入图片描述
c_str接口

void test2()
{
	const char* A;
	string str = "1234";
	A = str.c_str();//c_str:返回一个const char类型的指针,该指针指向str
	cout << A << endl;
	str = "abcd";
	cout << A << endl;
}

在这里插入图片描述

find接口

void test()
{
	string str = "123";
	size_t pos = str.find('2');//从头开始向后找字符2,找到后返回字符2所在的位置
}

在这里插入图片描述

void test()
{
	string str = "123456";
	size_t pos = str.find('3',3);//从3位置开始向后找字符3,找到后返回字符3所在的位置,找不到则返回4G
}

在这里插入图片描述

rfind接口

void test()
{
	string str = "123456";
	size_t pos = str.rfind('3',3);//从3位置开始,向前找字符3,找到后返回字符3所在的位置
}

在这里插入图片描述

substr接口

void test()
{
	string str = "123456";
	string str2 = str.substr(2, 2);//从str的2位置开始,复制两个元素,返回一个string类。
	//当第二个参数为负数时,默认从2位置开始取所有字符
}

在这里插入图片描述

将substr接口,find接口联合使用可以获得文件的后缀以及域名

void test()
{
	string str = "string.cpp";
	size_t pos = str.find('.');
	string str2 = str.substr(pos, str.size() - pos);
}

在这里插入图片描述

void test()
{
	string str = "https://editor.csdn.net/md?articleId=117331259";
	size_t pos = str.find("://");
	size_t end = str.find("/", pos + 3);//找到下一个'/'
	string str2 = str.substr(pos+3, end - pos-3);//复制pos和end之间的域名
}

在这里插入图片描述
find_first_of接口

void test()
{
	string str = "abcdefgbc";
	size_t pos = str.find_first_of("bc",0);//从0位置开始在str内找和bc匹配的字符串,找到后返回该子串的起始位置
}

在这里插入图片描述

find_last_of接口

void test()
{
	string str = "abcdefgbc";
	size_t pos = str.find_first_of("bc",0);
	size_t end = str.find_last_of("bc");//从后往前找和bc匹配的字符串,找到后返回该子串的最后一个字符的位置
}

在这里插入图片描述

find_first_not_of接口

void test()
{
	string str = "abcdefgbc";
	size_t pos = str.find_first_not_of("bc",0);//找到str中不和bc匹配的字符的第一个位置
	size_t pos1 = str.find_first_not_of("bc", 1);//从位置1开始找到str中不和bc匹配的字符的第一个位置
}

在这里插入图片描述

find_last_not_of接口

void test()
{
	string str = "abcdefgbc";
	size_t end = str.find_last_not_of("bc");//找到str中不和bc匹配的字符串的最后一个字符位置
	string str2 = "abcderbcjj";
	size_t end1 = str2.find_last_not_of("bc");
}

在这里插入图片描述
+接口

void test1()
{
	string str = "123";
	string str2 = "456";
	string str3 = str + str2;
}

在这里插入图片描述
cin:遇到空格/换行结束

cin>>str2;

getline:遇到换行结束

getline(cin,str2);
void test1()
{
	string str = "123";
	string str2 = "abc";
	cin >> str2;
	getline(cin, str);
}

在这里插入图片描述

在这里插入图片描述
可以看到第一次输入abc空格后cin就结束了,后面的字符是输入str的值,遇到空格不会结束。
还可以自己提供一个结束符

void test1()
{
	string str = "123";
	string str2 = "abc";
	cin >> str2;
	getline(cin, str, ',');//此时遇到,才结束
}

在这里插入图片描述
在这里插入图片描述
可以看到换行也会被输入进str内,‘,’后的a没有被输入进去
比较接口

void test()
{
	string str = "123445";
	string str2 = "ab";
	//比较:按照每一个字符的ASCII码值进行比较
	bool ret = str == str2;
	ret = str > str2;
	ret = str2 > str;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值