当前位置: 首页 > news >正文

string

string

string其实不属于STL,而是属于C++标准库,这是历史原因。

使用string类需要包string头文件

文档介绍 string - C++ Reference (cplusplus.com)

构造函数

在这里插入图片描述

string() 默认构造,构造一个空的string类对象,即空字符串
string(const string& str) 拷贝构造
string(const char s)* 用C-string 字符串构造 string 类对象

常用接口

遍历

//重载 operator[] 使得string像数组一样访问
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;

返回string字符串的字节个数(就是字符数)
size_t size() const;

  1. string str("hello world");
    for(int i = 0;i < str.size();i++){cout << str[i] << " ";
    }
    
  2. 迭代器 iterator

    • STL普遍提供了iterator对象的接口,比如string的begin和end函数,可以返回string对象的第一个位置和最后一个位置下一个位置的迭代器。

    • iterator begin();

    • iterator end();

    • string str("hello world");
      string::iterator it = str.begin();
      while(it != str.end()){cout << *it << " ";++it;
      }
      
    • 迭代器不是指针,但是和指针很类似,*it是运算符重载的结果。

    • 迭代器it可以改变string本身内容

  3. 范围for

    • string str("hello world");
      for(auto ch : s){cout << ch << " ";
      }
      
    • auto 自动推导类型

    • 实际上底层是迭代器

    • 范围for 取到的ch只是拷贝,写成auto是不能修改string本身内容的

    • 使用auto&就可以改变string本身内容了

        string str("hello world");for(auto& ch : s){cout << ch << " ";} 
      

迭代器类型

iterator 				正向迭代器
reverse_iterator 		反向迭代器
const_iterator 			常限定正向迭代器
const_reverse_iterator 	常限定反向迭代器

string容量操作接口

size_t size() const;
size_t capacity() const;
bool empty() const; 		//判空
void clear();				//清除有效字符,size置零,capacity不变,不会缩容
void reserve(size_t n = 0);

reserve介绍

reserve是储存的意思,对于string这样动态的数据结构,频繁的扩容会有很多消耗(异地扩,释放,拷贝),因此如果一开始就知道初始时有多少空间,直接就给好空间,效率就会提高很多。

string s1;
s1.reserve(100);

注意:当参数n大于当前capacity时毫无疑问会扩容,但是当n小于capacity时,是否会缩容其实是不确定的,由不同的编译器来决定,比如vs下不会缩容,但是g++下会缩容。

要注意的是reserve的行为不会对size以及字符串内容造成影响。

练习:415. 字符串相加 - 力扣(LeetCode)


增删查改接口

尾插

void push_back(char c); //尾插一个字符
string& append(字符串);  //尾插字符串,返回操作后的字符串引用
string& operator+=(字符串对象/C字符串、单字符均可);

(头)插入

string& insert(size_t pos,const string& str);	//pos位置插入string对象
string& insert(size_t pos,const char* s);		//pos位置插入c字符数组
string& insert(size_t pos,size_t n,char c);		//pos位置插入n个单字符
iterator insert(iterator p,char c);				//迭代器位置插入单字符

删除

string& erase(size_t pos = 0;size_t len = npos); //默认清除
iterator erase(iterator p);						//删除迭代器位置单字符
iterator erase(iterator first,iterator last);						//删除迭代器位置字符串

替换,查找 replace,find

//find系列
rfind 			//倒着找
find_first_of	//在字符串里查找传入字符串里面的任何字符
find_last_of	//倒着的find_first_of
find_first_not_of
find_last_not_of    

兼容C语言

const char* c_str()const;
//这个函数的作用其实时为了C++对C语言的兼容
//作用: 获取C字符串的等效项
//返回一个指向数组的指针,该数组包含以 null('\0') 结尾的字符序列即C字符串,此数组包含构成字符串对象值的相同字符序列,以及末尾的附加终止'\0'字符.

非成员函数接口

string operator+(,)//字符串与字符串相加,字符串与C字符数组/字符相加,C字符数组/字符与字符串相加
//重载成全局原因在于参数位置可以互换(加法交换律。。)

string还实现了各种运算符重载

在这里插入图片描述

//getline 解决了cin接收字符串遇到' '结束的问题
//getline 默认遇到\n结束
istream& getline (istream& is, string& str, char delim);//可以传入参数自定义终止字符为delim
istream& getline (istream& is, string& str);			//默认种植字符为'\n'	

字符串最后一个单词的长度_牛客题霸_牛客网


string substr(size_t pos,size_t len);
返回原字符串从pos位置开始的len个字符的子串

实现string重载流插入和流提取

inline ostream& operator<<(ostream& cout, const string& str)
{for (auto ch : str){cout << ch;}return cout;
}inline istream& operator>>(istream& cin, string& str)
{str.clear();char ch = cin.get();while (ch != ' ' && ch != '\n'){str += ch;ch = cin.get();}return cin;
}

重载operator>>中涉及到C++中cin默认以‘ ’和’\n’为分隔符,提取不到’ ‘和’\n’,故不能使用cin,应当调用istream对象的get()函数(可以取到任何字符),用法和getc()类似。

http://www.dtcms.com/a/304959.html

相关文章:

  • 如何进行项目复盘?核心要点分析
  • 从线下到线上:解析足浴按摩平台如何实现成本降低80%的技术方案
  • java基础面试题(5)
  • 高精度惯性导航IMU传感器价格供应商
  • 数据处理和统计分析——04 Pandas DataFrame
  • Python的‌魔法方法‌
  • Java学习第八十七部分——四次挥手
  • Java设计模式之《备忘录模式》
  • 80V降5V,输出电流4A,应用于车载充电器
  • 工厂方法模式 Factory Method Pattern
  • 监控场景视频质量异常修复:陌讯动态增强算法实战解析
  • 深入浅出设计模式——创建型模式之建造者模式 Builder
  • LangChain API 功能介绍和使用示例
  • 单卡10分钟部署MiniCPM4-0.5B:轻量级大模型本地运行指南
  • ESP8266 AT 固件
  • Linux信号量:进程同步与互斥的核心机制
  • 人形机器人指南(十四)集成
  • 248°视野里的温柔革命:当清洁成为治愈城市的艺术
  • Qt 移动应用界面设计原则
  • 智能Agent场景实战指南 Day 23 : Agent安全与隐私保护
  • C++异常捕获:为何推荐按引用(by reference)捕获?
  • 【LeetCode 热题 100】(二)双指针
  • 基于Java+SQLServer2017实现(Web)酒店客房管理系统
  • MongoDB系列教程-教程概述
  • 系统选择菜单(ubuntu grub)介绍
  • 标量子查询 外表有多少重复值决定filter次数 转化 left join
  • Python三大Web框架:FastAPI vs Flask vs Django 详解与快速入门指南
  • BreachForums 黑客论坛强势回归
  • windows软件ARM64和AMD64(x64)区别,如何查看电脑支持哪种
  • JVM易混淆名称