C++初阶(长期更新)第9讲:string(上)

C++初阶(长期更新)第9讲:string(上)

++跟着潼心走,轻松拿捏C++,困惑通通走,一去不回头~欢迎开始今天的学习内容,++ ++你的支持就是博主最大的动力++ 。博主主页:潼心1412o-CSDN博客

前言

前面学习了一些基础的语法,今天我们正式进入STL的学习,一起学习string的内容,gogogo,出发喽~

8.1 STL

C++标准库提供了许多库,其中STL库中含有许多封装好的数据结构供我们使用

C++ STL的六大组件包括容器、算法、迭代器、函数对象、适配器和分配器,它们协同工作实现高效泛型编程

string就是其中的一个容器

8.2 string

string类文档介绍cplusplus.com/reference/string/string/?kw=string

cpp 复制代码
void Test01()
{
	string s1;
	string s2("Hello world");
	string s3(s2);
	//从下标位置为1开始拷贝6个字符
	//string (const string& str, size_t pos, size_t len = npos);
	//npos == -1,为整型最大值
	string s4(s2, 1, 6);
	//超过字符串长度则拷贝到结束
	string s5(s2, 1, 60);
	//从1位置直接拷贝到结束
	string s6(s2, 1);
	const char* str = "Hello world";
	//拷贝常量字符串的前5个值
	string s7(str, 5);
	string s8(100, '#');

	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	cout << s6 << endl;
	cout << s7 << endl;
	cout << s8 << endl;
}

8.3 遍历和修改string

这里提供了三种方式:

1.用下标遍历 2.迭代器operator 3.范围for

cpp 复制代码
//遍历加修改
//下标size()==length()
//length()其他类通用
void Test02()
{
	string s2("Hello world");
	for (size_t i = 0; i < s2.size(); i++)
	{
		s2[i]++;
	}
	cout << s2 << endl;
}
//迭代器-可近似理解为指针
//所有容器主流遍历方式
//[begin(),end())左闭右开为指针
void Test03()
{
	string s3("Hello world");
	string::iterator it3 = s3.begin();
	while (it3 != s3.end())
	{
		++(*it3);
		++it3;
	}
	cout << s3 << endl;
}
//范围for 语法糖
void Test04()
{
	string s4("Hello world");

	auto x = 1;
	auto y = 1.0;
    auto p1 = &x;
    auto* p2 = &y;
	int& z = x;
	//这里只是赋值给m,想改变z的值必须加&
	//auto m = z;
	auto& m = z;
	m++;
	cout << x << endl;
	cout << z << endl;
	cout << m << endl;
	//同理要改变s4的值这里auto也必须加&
	for (auto& e : s4)
	{
		++e;
	}
	cout << endl;

	for (auto e : s4)
	{
		cout << e << " ";
	}
	cout << endl;
}

迭代器的意义

1.统一类似的方式遍历和修改容器

2.算法脱离具体底层结构,和底层结构解耦。算法独立模板针对多个容器进行处理

cpp 复制代码
void Test05()
{
	string s = "123";
	vector<int>v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	list<int>lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	list<int>::iterator it5 = lt.begin();
	while (it5 != lt.end())
	{
		cout << *it5 << endl;
		++it5;
	}
	reverse(s.begin(), s.end());
	reverse(v.begin(), v.end());
	reverse(lt.begin(), lt.end());
}

8.4 两道小题

917. 仅仅反转字母 - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    bool isLetter(char& ch)
    {
        if(ch>='a'&&ch<='z')
        {
            return true;
        };
        if(ch>='A'&&ch<='Z')
        {
            return true;
        }
        return false;
    }
    string reverseOnlyLetters(string s) 
    {
        int begin=0;
        int end=s.size()-1;
        while(begin<end)
        {
            while(begin<end&&!isLetter(s[begin]))
                ++begin;
            while(begin<end&&!isLetter(s[end]))
                --end;
            swap(s[begin],s[end]);
            ++begin;
            --end;
        }
        return s;
    }

387. 字符串中的第一个唯一字符 - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    
    int firstUniqChar(string s) 
    {
        int arr[26]={0};
        for(auto ch : s)
        {
            arr[ch -'a']++;
        }
        for(size_t i=0;i < s.size();i++)
        {
            if(arr[s[i]-'a']==1)
                return i;
        }
        return -1;
    }
};

++好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~++ ​​

博主主页:潼心1412o-CSDN博客

相关推荐
qq_4017004133 分钟前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构
星夜离尘5635 分钟前
MATLAB 角度解缠遇到丢样:先分段,再说明圈数为什么不可恢复
开发语言·matlab
我命由我1234543 分钟前
6-2.Python 异常处理 - 异常捕获(捕获指定异常、常见异常类型、异常信息)
java·运维·开发语言·python·http·https·java-ee
ZoeLandia1 小时前
React08:自定义 Hook
开发语言·前端·react.js·typescript
C++ 老炮儿的技术栈1 小时前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
zaizai10071 小时前
STL深度剖析2
java·c++·算法
染指11101 小时前
157.Agent-LangGraph-工具(实现ReAct Agent模式)
开发语言·人工智能·python·langchain·agents
幻智星科技1 小时前
FPGA纯硬件UDP桥接:微秒级响应新范式
c++·fpga开发·硬件架构
程序猿乐锅1 小时前
【从0-1学习Python | 第九篇】继承
开发语言·后端·python·学习·fastapi
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:位运算实战——二进制权限与最大异或解析
c++·python·算法·bfs·信息学竞赛