stl之string的详解

一,string定义的方式

,string定义了多种函数重载的方式,常用的构造函数如下:

string();
string(const string& str);
string(const string& str, size_t pos, size_t len = npos);
string(const char* s);
string(const char* s, size_t n);
string(size_t n, char c);

使用示例

int main()
{string s1;string s2("hello wcd");//字符串string s3(s2);//用s2来初始化s3;string s4(s2, 6);//从s2的位置开始,不写长度默认就是npos;string s5("hello world", 5);//拷贝5个字符长度cout << s5 << endl;string s6(10, 'x');//拷贝10个字符return 0;
}

二 string中插入

常见的插入方式有几种:

void push_back (char c)

int main()
{string st("hello linux");st.push_back('w');st.push_back('c');st.push_back('d');return 0;
}

append的插入

string& append (const string& str);
string& append (const char* s);
string& append (size_t n, char c);

void test1()
{string s1("hello string");string s2("wcd");s1.append(s2);//在s1后面追加s2;s1.append("xxxx");//在s1后面插入字符串s1.append(10,'y');//在s1后面插入10个‘y'的字符
}

insert的插入

string& insert (size_t pos, const char* s);
string& insert (size_t pos, const string& str);
iterator insert (iterator p, char c);

void test2()
{
//	string& insert(size_t pos, const char* s);
//> string& insert(size_t pos, const string & str);
//> iterator insert (iterator p, char c);string s1("hello string");string s2("wcd");s1.insert(0, "string");//在pos位置为0的地方插入string相当于头插s1.insert(6, s2);//在下标为6的位置上插入s2对象的值;s1.insert(s1.end(), 'a');//在末尾插入字符'c';
}

+=插入

string (1)
string& operator+= (const string& str);
c-string (2)
string& operator+= (const char* s);
character (3)
string& operator+= (char c);

最好用的最方便的就是+=;运用了运算符重载;

void test11()
{string st1("good night");string st2("good morning");st1 += 'c';st1 += st2;st1 += "xxxxxx";
}

string的迭代器*

正向迭代器与反向迭代器

iterator begin();
const_iterator begin() const;
iterator begin();
const_iterator begin() const;//正向迭代器
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;//反向迭代器
正向迭代器

//const 版本的迭代器
void test4(const string& st1)
{string st1("hello world");string::const_iterator it = st1.begin();while (it != st1.end()){cout << *it << " ";it++;}cout << endl;
}
//普通版本的迭代器
void test3()
{string st1("hello world");string::iterator it = st1.begin();while (it != st1.end()){cout << *it << " ";it++;}cout << endl;
}

反向迭代器
反向打印数据,从后往前打印

//const 版本的迭代器
void test5(const string& st1)
{string st1("hello world");string::const_reverse_iterator rit = st1.rbegin();while (rit != st1.rend()){cout << *rit << " ";rit++;}cout << endl;
}
//普通版本的迭代器
void test6()
{string st1("hello world");string::reverse_iterator rit = st1.rbegin();while (rit != st1.rend()){cout << *rit << " ";rit++;}cout << endl;
}

string的capacity

size_t size() const

void test7()
{string st1("hello world");cout << st1.size() << endl;//计算当前的string对象里面的字符串的大小
}

size_t length() const;

这个跟size()的用法是一样的,我们平常都使用size().

size_t max_size() const;

计算string最大可以返回的字符串的长度,取决于编译器,不同的编译器,大小都不一样,所以不准。
在这里插入图片描述

上面这个是vs的版本,下面我们来看看g++编译器。
在这里插入图片描述

俩个相差太多了,所以不准。

size_t capacity() const;

void test8()
{string st1("hello world");cout <<"初始的容量" << st1.capacity() << endl;size_t old = st1.capacity();for (size_t i = 0; i < 100; i++){st1 += ' ';if (old != st1.capacity()){cout << "扩容后的:" << st1.capacity() << endl;old = st1.capacity();}}}

在这里插入图片描述

void clear()

它的作用是清空string里面的数据,我们也可以观察一下它的容量是不会变化的,而他的size()是变化的。
在这里插入图片描述

void reserve (size_t n = 0);
这个是改变它的容量的

我们可以在开始的时候直接扩容至我们想要的大小。我们可以发现他不是刚刚好扩容至150,而是比150大一点。

在这里插入图片描述

假如我们要缩容呢?我们先clear完之后在缩容就行了。
在这里插入图片描述

void resize (size_t n);
void resize (size_t n, char c);
具有扩容还具初始化的功能

void test9()
{string st1;st1.resize(100);cout << "size:" << st1.size() << " " << "capacity:" << st1.capacity() << endl;
}

在这里插入图片描述
默认就是初始化成\0;
我们也可以指定初始化成字符。
在这里插入图片描述

string 成员的获取

Element access:比较好用的就一种,还有一种迭代器在string中不经常用。

char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
const对象调用const,普通对象调用普通的,普通的可读可写。

void test10()
{string st1("hello linux");//写的功能for (size_t i = 0; i < st1.size(); i++){st1[i]++;}cout << endl;//读的功能for (size_t i = 0; i < st1.size(); i++){cout << st1[i] << " ";}cout << endl;//注意一点的就是
char st2[3] = { 0 };//本质是*(st2+3)
st1[3];//本质是st1.operator(3);
}

在这里插入图片描述

string类的删除

sequence (1)
string& erase (size_t pos = 0, size_t len = npos);
character (2)
iterator erase (iterator p);
range (3)
iterator erase (iterator first, iterator last);

void test12()
{string s2("hello world");s2.erase(6, 1);//在pos为6的地方删除1个字节的大小;cout << s2 << endl;s2.erase(s2.begin() + 1);;//在首元素+1的位置的元素删掉;cout << s2 << endl;s2.erase(s2.begin()+1, s2.end());//在首元素+1的位置全部删掉cout << s2 << endl;
}

String operations:

const char* c_str() const;为了跟一些C语言的一些库配合可以混着一起使用;

void test13()
{string s = "filename.c";FILE* fout = fopen(s.c_str(), "r");
}

查找相关的

size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;

用于初始化的另一个对象的

tring substr (size_t pos = 0, size_t len = npos) const;

//查找协议,域名,网址;
void test()
{string uri ("https://legacy.cplusplus.com/reference/string/string/substr/");size_t pos1 = uri.find("://");string protocol;if (pos1 != string::npos){protocol = uri.substr(0, pos1);}cout << protocol << endl;string domain;size_t pos2 = uri.find('/', pos1 + 3);if (pos2 != string::npos){domain = uri.substr(pos1 + 3, pos2 - (pos1 + 3));}cout << domain << endl;string URL = uri.substr(pos2+1);cout << URL << endl;}

除了正着查找还有反向查找

size_t rfind (const string& str, size_t pos = npos) const;
size_t rfind (const char* s, size_t pos = npos) const;
size_t rfind (const char* s, size_t pos, size_t n) const;
size_t rfind (char c, size_t pos = npos) const;

用法跟find相似。

string非成员函数

Non-member function overloads

istream& getline (istream& is, string& str, char delim);

stream& getline (istream& is, string& str);

我们知道,使用>>进行输入操作时,当>>读取到空格便会停止读取,基于此,我们将不能用>>将一串含有空格的字符串读入到string对象中。

void test1()
{string st;cin >> st;//hello world;cout << st << endl;//输出hello
}

我们使用getline就可以读取一行了

oid test1()
{string st;cin >> st;//hello world;getline(cin, st);cout << st << endl;//正常输出hello world
}

常用的string基本基本上就这些了,再用到哪些我们去查对应的文档就好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34622.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode-131.Palindrome Partitioning [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-131.Palindrome Partitioninghttps://leetcode.com/problems/palindrome-partitioning/description/131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09;131. 分割回文串 - 给你一个字符串 s&#xff0c;请你…

InternVL:论文阅读 -- 多模态大模型(视觉语言模型)

更多内容&#xff1a;XiaoJ的知识星球 文章目录 InternVL: 扩展视觉基础模型与通用视觉语言任务对齐1.概述2.InternVL整体架构1&#xff09;大型视觉编码器&#xff1a;InternViT-6B2&#xff09;语言中间件&#xff1a;QLLaMA。3&#xff09;训练策略&#xff08;1&#xff09…

【AWS入门】AWS云计算简介

【AWS入门】AWS云计算简介 A Brief Introduction to AWS Cloud Computing By JacksonML 什么是云计算&#xff1f;云计算能干什么&#xff1f;我们如何利用云计算&#xff1f;云计算如何实现&#xff1f; 带着一系列问题&#xff0c;我将做一个普通布道者&#xff0c;引领广…

二分算法刷题

1. 初识 总结&#xff1a;二分算法题的细节非常多&#xff0c;容易写出死循环。使用算法的条件不一定是数组有序&#xff0c;而是具有“二断性”&#xff1b;模板三种后面会讲。 朴素二分二分查找左端点二分查找右端点 2. 朴素二分 题目链接&#xff1a;704. 二分查找 - 力扣…

itsdangerous加解密源码分析|BUG汇总

这是我这两天的思考 早知道密码学的课就不旷那么多了 纯个人见解 如需转载&#xff0c;标记出处 目录 一、官网介绍 二、事例代码 源码分析&#xff1a; 加密函数dump源码使用的函数如下&#xff1a; 解密 ​编辑 ​编辑 关于签名&#xff1a; 为什么这个数字签名没有…

深度解析React Native底层核心架构

React Native 工作原理深度解析 一、核心架构&#xff1a;三层异构协作体系 React Native 的跨平台能力源于其独特的 JS层-Shadow层-Native层 架构设计&#xff0c;三者在不同线程中协同工作&#xff1a; JS层 运行于JavaScriptCore&#xff08;iOS&#xff09;或Hermes&…

前端内存优化实战指南:从内存泄漏到性能巅峰

前端内存优化实战指南&#xff1a;从内存泄漏到性能巅峰 一、内存问题引发的场景 1.1 典型内存灾难现场 // 经典内存泄漏示例 const zombieElements new Set();function createLeak() {const div document.createElement(div);zombieElements.add(div); // 元素永不释放div…

【工作记录】pytest使用总结

1、 fixture夹具 可参考&#xff1a; python3.x中 pytest之fixture - 漂泊的小虎 - 博客园 fixture是指夹具&#xff08;把用例夹在中间&#xff09;&#xff0c;它包括前置工作和后置工作&#xff0c;前置是用例代码的准备阶段&#xff0c;后置是用例执行之后的清理阶段,用…

C++基础笔记

1. C关键字 这个不多说&#xff0c;以后接触得到&#xff0c;但这里做个总结&#xff1a; 2. 命名空间 一般类型&#xff1a; namespace Xianyu {// 命名空间中可以定义变量/函数/类型int rand 10;int Add(int left, int right){return left right;}struct Node{struct No…

生活中的可靠性小案例12:类肤材质老化发粘问题

我一直觉得我买的某品牌车载吸尘器很好用&#xff0c;用了几年&#xff0c;目前性能也是杠杠的。然而它现在有个最大的问题&#xff0c;就是表面发粘了&#xff0c;用起来粘手&#xff0c;非常不舒服。 这一类问题在生活中不少见&#xff0c;尤其是一些用了类肤材质涂层的物件。…

黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)

文章目录 代码示例效果 代码示例 axiosTest.html <!DOCTYPE html> <!-- 文档类型声明&#xff0c;告诉浏览器这是一个HTML5文档 --> <html lang"en"> <!-- HTML根元素&#xff0c;设置文档语言为英语 --><head> <!-- 头部区域&am…

Ollama+OpenWebUI本地部署大模型

OllamaOpenWebUI本地部署大模型 前言Ollama使用Ollama安装Ollama修改配置Ollama 拉取远程大模型Ollama 构建本地大模型Ollama 运行本地模型&#xff1a;命令行交互Api调用Web 端调用 总结 前言 Ollama是一个开源项目&#xff0c;用于在本地计算机上运行大型语言模型&#xff0…

【NeurIPS 2024】LLM-ESR:用大语言模型破解序列推荐的长尾难题

标题期刊年份关键词LLM-ESR: Large Language Models Enhancement for Long-tailed Sequential RecommendationNeurIPS2024Large Language Models, Sequential Recommendation, Long-tailed &#x1f4da;研究背景 在电商和社交媒体的世界里&#xff0c;序列推荐系统&#xff…

C语言_数据结构总结9:树的基础知识介绍

1. 树的基本术语 - 祖先&#xff1a;考虑结点K&#xff0c;从根A到结点K的唯一路径上的所有其它结点&#xff0c;称为结点K的祖先。 - 子孙&#xff1a;结点B是结点K的祖先&#xff0c;结点K是B的子孙。结点B的子孙包括&#xff1a;E,F,K,L。 - 双亲&#xff1a;路径上…

Android 14 Telephony 网络选择功能介绍

一、总体介绍 (一)功能 手动搜网的流程:用户通过UI触发,调用TelephonyManager的API,比如startNetworkScan,然后这个请求会传递到RIL层,通过AT命令与基带通信,进行网络扫描。结果返回后,经过TelephonyRegistry通知应用层。中间可能涉及IPC,比如Binder通信,因为应用和…

系统思考全球化落地

感谢加密货币公司Bybit的再次邀请&#xff0c;为全球团队分享系统思考课程&#xff01;虽然大家来自不同国家&#xff0c;线上学习的形式依然让大家充满热情与互动&#xff0c;思维的碰撞不断激发新的灵感。 尽管时间存在挑战&#xff0c;但我看到大家的讨论异常积极&#xff…

位运算(基础算法)

按位与AND&#xff08; & &#xff09; 只有当两个位都为1时&#xff0c;结果才为1,否则为0。结果不会变大 按位或 OR&#xff08; | &#xff09; 只有当两个位中有一个为1时&#xff0c;结果才为1,否则为0。结果不会变小 按位异或 XOR &#xff08; ^ &#xff09; 只…

规模效应的三重边界:大白话解读-deepseek为例

前言&#xff1a;当Scaling Laws遇见边际递减效应 在人工智能的狂飙突进中&#xff0c;大语言模型如同不断膨胀的星体&#xff0c;吞噬着海量算力与数据。OpenAI于2020年揭开的Scaling Laws&#xff0c;曾为这场盛宴指明方向&#xff1a;模型性能随参数规模&#xff08;N&…

力扣143重排链表

143. 重排链表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的…

wow-rag:task3-初步体验问答引擎

做RAG需要自己准备一个txt文档&#xff0c;新建一个docs文件夹&#xff0c;放进去。例如&#xff0c;这里放了一个./docs/问答手册.txt # 从指定文件读取&#xff0c;输入为List from llama_index.core import SimpleDirectoryReader,Document documents SimpleDirectoryRead…