首页 > 编程语言 >初探c++:string类的进阶运用

初探c++:string类的进阶运用

时间:2024-04-01 18:31:59浏览次数:10  
标签:good cout 迭代 c++ str find string 进阶

1.begin()和end(),前一个指向字符串的第一个字符,第二个指向字符串的\0

		string s=("hello world");
		string::iterator it = s.begin();
		while (it != s.end())
		{
			cout << *it << " ";
			++it;
		}
		cout << endl;

这是正向迭代器的经典应用

如果要实现反向迭代器,就要使用以下的格式

		string s=("hello world");
		string::reverse_iterator reit = s.rbegin();
		while (reit != s.rend())
		{
			cout << *reit << ' ';
			reit++;
		}

如果string是const类型的,使用const迭代器const_reverse_iterator,此迭代器与普通迭代器的区别是这个不能写只能读,另一个都行,特别的,反向读取不能使用正向迭代器--实现,会报错,

而且auto reit可以代替上文迭代器的代码

	string s=("hello world");
	cout<<s.at(2);

s.at()与s[]是一样的效果

在某位置前插入字符串

	string s=("world");
	s.insert(0, "hello ");
	cout << s;

		string s=("world");
		s.insert(0, 5,'!');
		cout << s;

也可以插入一定数量的字符

将0替换为迭代器s.begin()代替0也可以

删除字符第几个位置删除几个字符

	string s=("world");
	s.erase(3,1);
	cout << s;

string s=("world");
s.erase(s.begin()+3);
cout << s;

此代码和上面代码效果一样,默认删除一个

如果删除数据大于字符串长度,则默认从起始字符开始删完,插入删除数据的迭代器不建议使用,效率低,需要挪动数据

修改迭代器

string s=("world");
s.replace(3,2,"%%d");
cout << s;

(起始修改位置,覆盖位置数量,修改内容)

寻找迭代器:

	string s=("world");
	size_t good = s.find('r');
	cout << good<<endl;
	size_t good1 = s.find('b');
	cout << good1;

找到返回下标,找不到返回npos,也就是最大的整数

	string s=("roroor");
	size_t good = s.find('r');
	while (good != string::npos)
	{
		s.replace(good, 1, "!");
		good = s.find('r');
	}
	cout << s;

循环会一直往下找

	string s=("roroor");
	size_t good = s.find('r');
	while (good != string::npos)
	{
		s.replace(good, 1, "!");
		good = s.find('r',good+1);
	}
	cout << s;

改进算法,不需要从头找,也可以统计r的数量,先用reseve开足够的空间,以免replace不断开空间,下面是效率最高的方法

	string s=("roroor");
	string s1;
	for (auto ch : s)
	{
		if (ch != 'r')
		{
			s1 += ch;
		}
		else
		{
			s1 += '!';
		}
	}
	cout << s1;

swap(string元素),表示交换两个字符串

c_str:返回c形式的字符串,以‘'\0'为终止,作用是与c语言的接口相匹配

寻找文件后缀:

	string file("string.cpp");
	size_t good = file.find('.');
	if (good != string::npos)
	{
		string suffix = file.substr(good, file.size() - good);
		cout << suffix;
	}

substr的用法为从前者下标复制字符串到后者下标

使用find_first_of来实现字符串中多个字符的替换

		std::string str("please replace the letters signed");
		std::size_t found = str.find_first_of("abcd");
		while (found !=std:: string::npos)
		{
			str[found] = '*';
			found = str.find_first_of("abcd", found + 1);

		}
		cout << str;

相比于find_first_of正着找,find_last_of为倒着找

		std::string str("please replace the letters signed");
		std::size_t found = str.find_last_of("abcd");
		while (found !=std:: string::npos)
		{
			str[found] = '*';
			found = str.find_first_of("abcd");

		}
		cout << str;

此代码效果与上面的相同

题目

#include <iostream>
#include<string>
using namespace std;

int main() {
string str;
getline(cin,str);
size_t pos=str.rfind(' ');
if(pos!=std::string::npos)
{
cout<<str.size()-pos-1;
}
else {
{
    cout<<str.size();
}
}
}

getline(cin,字符串)与cin不同前者结束符为换行符,后者为空格

标签:good,cout,迭代,c++,str,find,string,进阶
From: https://blog.csdn.net/whcwhc111111/article/details/137177810

相关文章

  • C++基础——选择结构与循环结构
    基础:选择语句☑️❌if语句if(a){//a判断表达式,如果a为真那就执行语句}if语句还可以与else结合使用if(a){//a判断表达式,如果a为真那就执行语句}elseif(b){//如果a为假,b为真那就执行语句}else{如果a和b都为假,那就执行该语句}swi......
  • 从基础入门到学穿C++(类和对象篇)【超详细】【一站式速通】
    类和对象C语言是一种面向过程的语言,C++和python、java一样都是一种面向对象的语言。面向对象编程(Object-OrientedProgramming,OOP)和面向过程编程(ProceduralProgramming)是两种不同的编程范式面向对象编程:强调的是将现实世界中的事物抽象成对象,并通过对象之间的交互来实现......
  • day08-函数进阶
    1.参数的补充在函数基础部分,我们掌握函数和参数基础知识,掌握这些其实完全就可以进行项目的开发。今天的补充内容属于进阶知识,包含:内存地址相关、面试题相关等,在特定情况下也可以让代码更加简洁,提升开发效率。1.1参数内存地址相关【面试题】在开始讲参数内存地址相关之前,我们......
  • 利用IT++搭建通信仿真平台(C++)
     IT++isaC++libraryofmathematical,signalprocessingandcommunicationclassesandfunctions。也就是说有了这个库,用C++编写通信仿真程序的方便程度接近于matlab。具体介绍和文件下载可以上官方网站。“由于Matlab效率太低(除了可以验证算法外),所以需要更快......
  • Spark进阶(一)高级概念和架构
    Spark是一种快速、可扩展的大数据处理引擎,具有高级概念和架构。一、Spark的高级概念弹性分布式数据集(ResilientDistributedDatasets,简称RDD):RDD是Spark中的核心数据抽象,它是一个可分区、可并行操作的不可变分布式对象集合。RDD可以从存储系统中读取数据,也可以通过转换操作......
  • C++:取模运算符(15)
    取模运算也就是取余数取模10%319余1 简单的取模取模运算 可以看到他的本质就是先将数进行除法运算后的余数#include<iostream>usingnamespacestd;intmain(){ inta1=10; intb1=3; cout<<a1%b1<<endl; system("pause"); return0;} 被除数......
  • C++格式化输入和输出
    格式化输入与输出除了条件状态外,每个iostream对象还维护一个格式状态来控制IO如何格式化的细节。格式状态控制格式化的某些方面,如整型值是几进制、浮点值的精度、一个输出元素的宽度等。标准库定义了一组操纵符来修改流的格式状态。一个操纵符是一个函数或是一个对象,会影响......
  • C++类基础8——嵌套类
    嵌套类一个类可以定义在另一个类的内部,前者称为嵌套类或嵌套类型。下面是一个使用C++嵌套类的示例:#include<iostream>classOuterClass{public:classInnerClass{public:voidprintMessage(){std::cout<<"HellofromInnerClass!......
  • 【华为OD机试C++】提取不重复的整数
    《最新华为OD机试题目带答案解析》:最新华为OD机试题目带答案解析,语言包括C、C++、Python、Java、JavaScript等。订阅专栏,获取专栏内所有文章阅读权限,持续同步更新!文章目录描述输入描述输出描述示例代码描述输入一个int型整数,按照从右向左的阅读顺序,返回......
  • MySQL数据库报错:ERROR 1364 (HY000): Field ‘authentication_string‘ doesn‘t have
    在MySQL安装和配置的过程中,遇到错误可能会让人感到困惑,尤其是当错误信息不够清晰时。本文将详细探讨一个在MySQL安装过程中较少见但可能会遇到的错误,提供一个全面的解决方案指南。错误描述在MySQL安装过程中,可能会遇到以下错误信息:ERROR1364(HY000):Field'authentica......