C++——string使用

string的常见构造接口 

string()

构造空的srting类对象,空字符串

string(const char* str)

用字符串初始化

string(const string& str)拷贝构造,使用string类初始化
string(size_t n, char c) 用n个字符c初始化
string s1; 
string s2("hello world");
string s3(s2); 
string s4(10,'*');

string类对象的容量操作

size返回字符串有效长度
capacity返回总空间大小
empty判断对象是否为空
clear清空有效字符
reserve为字符串预留空间
resize修改有效字符个数

size——返回字符串的有效长度

std::string::size
size_t size() const;
int main ()
{std::string str ("Test string");std::cout << "The size of str is " << str.size() << " bytes.\n";return 0;
}
//The size of str is 11 bytes

 capacity——返回空间总大小

std::string::capacity
size_t capacity() const;
int main ()
{std::string str ("Test string");std::cout << "size: " << str.size() << "\n";std::cout << "capacity: " << str.capacity() << "\n";return 0;
}//size: 11
//capacity: 15

 empty——判断对象是否为空

std::string::empty
bool empty() const;

应用:将用户输入的内容逐行读取并存储,直到遇到空行 

#include<iostream>
#include<string>
using namespace std;
int main()
{string line;string content;do{getline(cin, line);content += line + '\n';} while (!line.empty());cout << content;
}

clear——清空有效字符

std::string::clear
void clear();
#include<iostream>
#include<string>
using namespace std;
int main()
{string str("hello world");str.clear();if (str.empty())cout << "string has been deleted" << endl;
}

clear只改清空数据,不改变空间大小 

reserve——为字符串预留空间

std::string::reserve
void reserve (size_t n = 0);
int main()
{string str("hello world");cout << str.capacity() << endl;cout << str.size() << endl;str.reserve(100);cout << str.capacity() << endl;cout << str.size() << endl;
}

 当参数n小于字符串大小时,不会缩小容量

resize——修改有效字符个数

std::string::resize
void resize (size_t n);void resize (size_t n, char c);

当n大于字符串大小时,多的空间会用字符c来填充(\0不会被覆盖) ,如果c缺省会自动补\0;如果n小于字符串大小时,会将多出的字符直接删除,但是不会改变基层空间capacity

int main()
{string str;str.resize(1);cout << str << endl;str.resize(5, '+');cout << str << endl;//字符串是 \0++++ 不同编译器输出可能不同str.resize(1);cout << str << endl;
}

string类对象的访问及遍历

operator[ ]下标方式访问,类似数组
begin,end迭代器顺序遍历
rbegin,rend迭代器逆序遍历
范围for底层还是迭代器
c_str返回c格式字符串

 

operator[ ]——[ ]的运算符重载

std::string::operator[]
char& operator[] (size_t pos);const char& operator[] (size_t pos) const;

使用和数组类似,都是访问[ ]内数字下标位置的字符

int main()
{string str("hello world");for (int i = 0; i < str.size(); i++){cout << str[i];}cout << endl;
}

迭代器begin和end,顺序遍历

iterator begin();const_iterator begin() const;
iterator end();const_iterator end() const;
using namespace std;int main()
{string str("hello world");string::iterator sit = str.begin();while (sit != str.end()){cout << *sit;sit++;}cout << endl;
}

迭代器rbegin和rend,逆序遍历

reverse_iterator rbegin();const_reverse_iterator rbegin() const;
reverse_iterator rend();const_reverse_iterator rend() const;
using namespace std;int main()
{const string str("hello world");string::const_reverse_iterator sit = str.rbegin();while (sit != str.rend()){cout << *sit;sit++;}cout << endl;
}

范围for(底层使用迭代器)

int main()
{const string str("hello world");for (char c : str){cout << c;}cout << endl;
}

c_str——返回c格式字符串

std::string::c_strconst char* c_str() const;
int main()
{string str("hello world");const char* ch = str.c_str();cout << ch << endl;
}

 这个接口是为了和c语言更好兼容


string类对象的修改

append追加字符串
operator+=

追加字符串

find从前寻找字符(串)并返回下标位置
rfind从后寻找字符(串)并返回下标位置
substr从字符串中截取子串

append——追加字符串

std::string::append//追加str
string& append (const string& str);//追加str的子串,字串是从str的subpos下标位置开始,向后的sublen个字符
string& append (const string& str, size_t subpos, size_t sublen);//追加常量字符串s
string& append (const char* s);//追加常量字符串的前n个字符
string& append (const char* s, size_t n);//追加n个字符c
string& append (size_t n, char c);//迭代器追加
template <class InputIterator>   string& append (InputIterator first, InputIterator last);
#include <iostream>
#include <string>int main ()
{std::string str;std::string str2="Writing ";std::string str3="print 10 and then 5 more";// used in the same order as described above:str.append(str2);                       // "Writing "str.append(str3,6,3);                   // "10 "str.append("dots are cool",5);          // "dots "str.append("here: ");                   // "here: "str.append(10,'.');                    // ".........."str.append(str3.begin()+8,str3.end());  // " and then 5 more"str.append(5,'.');                // "....."std::cout << str << '\n';return 0;
}
//Writing 10 dots here: .......... and then 5 more.....

operator+= ——追加字符串

std::string::operator+=string& operator+= (const string& str);string& operator+= (const char* s);string& operator+= (char c);

+=运算符重载和append的功能基本相同,append除此之外可以使用迭代器,插入指定数量的字符,但是+=使用更方便

find——从前寻找字符(串)并返回下标位置

std::string::findsize_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;

rfind——从后寻找字符(串)并返回下标位置

string::npos是一个静态无符号整型变量,大小为-1(即最大的无符号整数)

std::string::rfindsize_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;

rfind如果未给出查找的起始位置,或者起始位置下标越界,会从字符串末尾开始寻找;rfind和find一样,如果未找到目标,就会返回npos

substr——从字符串中截取子串

std::string::substr
string substr (size_t pos = 0, size_t len = npos) const;

如果pos等于字符串大小,就会返回空字符串;如果pos大于字符串大小,就会抛异常

#include <iostream>
#include <string>int main ()
{std::string str="We think in generalities, but we live in details.";std::string str2 = str.substr (3,5);     // "think"std::size_t pos = str.find("live");      // position of "live" in strstd::string str3 = str.substr (pos);     // get from "live" to the endstd::cout << str2 << ' ' << str3 << '\n';return 0;
}

string类的非成员函数

operator+效率低,少用
operator+=追加字符(串)
operator>>,operator<<输入输出运算符重载

getline

获取一行字符串
relational operators大小比较

operator+

std::operator+ (string)string operator+ (const string& lhs, const string& rhs);	string operator+ (const string& lhs, const char*   rhs);
string operator+ (const char*   lhs, const string& rhs);string operator+ (const string& lhs, char          rhs);
string operator+ (char          lhs, const string& rhs);

这个函数是传值返回,需要深拷贝,效率低少用为好

operator+=前面提到过

operator<<和operator>>

输入输出运算符重载,使用很简单,遇到空格或者换行结束

getline——获取一行字符串

std::getline (string)istream& getline (istream& is, string& str, char delim);//读到delim字符结束istream& getline (istream& is, string& str);//读到'\n'结束

relational operators——大小比较

relational operators (string)bool operator== (const string& lhs, const string& rhs);
bool operator== (const char*   lhs, const string& rhs);
bool operator== (const string& lhs, const char*   rhs);bool operator!= (const string& lhs, const string& rhs);
bool operator!= (const char*   lhs, const string& rhs);
bool operator!= (const string& lhs, const char*   rhs);bool operator<  (const string& lhs, const string& rhs);
bool operator<  (const char*   lhs, const string& rhs);
bool operator<  (const string& lhs, const char*   rhs);bool operator<= (const string& lhs, const string& rhs);
bool operator<= (const char*   lhs, const string& rhs);
bool operator<= (const string& lhs, const char*   rhs);bool operator>  (const string& lhs, const string& rhs);
bool operator>  (const char*   lhs, const string& rhs);
bool operator>  (const string& lhs, const char*   rhs);bool operator>= (const string& lhs, const string& rhs);
bool operator>= (const char*   lhs, const string& rhs);
bool operator>= (const string& lhs, const char*   rhs);
#include <iostream>
#include <vector>int main ()
{std::string foo = "alpha";std::string bar = "beta";if (foo==bar) std::cout << "foo and bar are equal\n";if (foo!=bar) std::cout << "foo and bar are not equal\n";if (foo< bar) std::cout << "foo is less than bar\n";if (foo> bar) std::cout << "foo is greater than bar\n";if (foo<=bar) std::cout << "foo is less than or equal to bar\n";if (foo>=bar) std::cout << "foo is greater than or equal to bar\n";return 0;
}

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

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

相关文章

【Terraform学习】使用 Terraform创建DynamoDB添加项目(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

4.1 链式栈StackT

C关键词&#xff1a;内部类/模板类/头插 C自学精简教程 目录(必读) C数据结构与算法实现&#xff08;目录&#xff09; 栈的内存结构 空栈&#xff1a; 有一个元素的栈&#xff1a; 多个元素的栈&#xff1a; 成员函数说明 0 clear 清空栈 clear 函数负责将栈的对内存释放…

使用Go env命令设置Go的环境

文章目录 前言Linux的设置Windlows设置Go version > 1.13 当你的GO的版本大于1.13的时候 Set environment variable allow bypassing the proxy for selected modules 前言 在进行Go开发的时候&#xff0c;设置Go的环境变量信息是必须的。下面介绍windows和Linux&#xff0…

mysql怎么查包含指定字段的所有表

查找包含特定字段的所有表&#xff0c;你可以使用 INFORMATION_SCHEMA.COLUMNS 表。以下是一个查询示例&#xff0c;用于在 MySQL 中找到所有包含名为 column_name 的字段的表&#xff1a; SELECT table_schema, table_name FROM INFORMATION_SCHEMA.COLUMNS WHERE column_na…

pybind11学习

2023.9.1 参考pybind11官方文档&#xff1a;https://pybind11.readthedocs.io/en/stable/index.html 参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/123022405 Installing the library 我是在wsl-ubuntu中进行测试&#xff1b;在python虚拟环境中安装…

智能推荐系统的秘密武器:揭秘K最近邻算法

文章首发地址 K最近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;是一种经典的机器学习算法&#xff0c;用于分类和回归问题。该算法基于实例之间的距离度量&#xff0c;通过找到最近的K个邻居对未知样本进行预测。 KNN算法的步骤如下&#xff1a; …

CCF HPC China2023|澎峰科技:使能先进计算,赋能行业应用

CCF HPC China2023圆满落幕&#xff01; 桂秋八月&#xff0c;为期三天的中国高性能计算领域最高规格盛会——2023CCF全球高性能计算学术年会&#xff08;HPC China&#xff09;在青岛红岛国际展览中心圆满落幕。行业超算大咖、顶级学界精英、先锋企业领袖参会者齐聚山东青岛&a…

flask-smorest 库

flask-smorest 简介 flask-smorest: 基于Flask/Marshmallow的REST API框架 flask-smorest 是一个用于创建于数据库无关的REST API的架库。 它使用Flask作为Web服务器&#xff0c;并使用marsmallow对数据进行序列化和反序列化。(类似于drf) 快速入门 flask-smorest对代码应…

修改文件名后Git仓上面并没有修改

场景&#xff1a; 我在本地将文件夹名称由Group → group ,执行git push 后&#xff0c;远程分支上的文件名称并没有修改。 原因&#xff1a; 是我绕过了git 直接使用了系统的重命名操作。 在 Git 中&#xff0c;对于已经存在的文件或文件夹进行大小写重命名是一个敏感的操作…

联邦学习FedAvg-基于去中心化数据的深度网络高效通信学习

随着计算机算力的提升&#xff0c;机器学习作为海量数据的分析处理技术&#xff0c;已经广泛服务于人类社会。 然而&#xff0c;机器学习技术的发展过程中面临两大挑战&#xff1a;一是数据安全难以得到保障&#xff0c;隐私泄露问题亟待解决&#xff1b;二是网络安全隔离和行业…

linux rpm 离线安装 nginx 自用,仅供参考

检查是否安装nginx ps -ef|grep nginx 检查rpm是否安装nginx rpm -qa|grep nginx 查看linux centos 发行版本 cat /etc/centos-release (查看其它发现版本 就把centos替换为别的 比如 红旗的 redflag ) 查看cpu信息 x86_64 lscpu 检查nginx所需依赖 …

uniapp 配置网络请求并使用请求轮播图

由于平台的限制&#xff0c;小程序项目中不支持 axios&#xff0c;而且原生的 wx.request() API 功能较为简单&#xff0c;不支持拦截器等全局定制的功能。因此&#xff0c;建议在 uni-app 项目中使用 escook/request-miniprogram 第三方包发起网络数据请求。 官方文档&#xf…

【C++入门】命名空间、缺省参数、函数重载、引用、内联函数

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C入门学习必备语法 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.3 前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加…

股票行情处理:不复权,前复权,后复权

不复权的话&#xff0c;K线图能真实反应股价历史的除权信息&#xff0c;缺点是会留有大缺口&#xff0c;股价走势不连续&#xff0c;不能直观感受股价的涨跌波动。 前复权是以目前股价为基准复权&#xff0c;可以很清楚的看到股价的历史高点、低点&#xff0c;以及目前股价所处…

大数据-玩转数据-Flink窗口函数

一、Flink窗口函数 前面指定了窗口的分配器, 接着我们需要来指定如何计算, 这事由window function来负责. 一旦窗口关闭, window function 去计算处理窗口中的每个元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一种. Reduc…

打包个七夕exe玩玩

前段时间七夕 当别的哥们都在酒店不要不要的时候 身为程序员的我 还在单位群收到收到 正好后来看到大佬些的这个 https://www.52pojie.cn/thread-1823963-1-1.html 这个贱 我必须要犯&#xff0c;可是我也不能直接给他装个python吧 多麻烦 就这几个弹窗 好low 加上bgm 再打包成…

Nexus仓库介绍以及maven deploy配置

一 、Nexus仓库介绍 首先介绍一下Nexus的四个仓库的结构&#xff1a; maven-central 代理仓库&#xff0c;代理了maven的中央仓库&#xff1a;https://repo1.maven.org/maven2/&#xff1b; maven-public 仓库组&#xff0c;另外三个仓库都归属于这个组&#xff0c;所以我们的…

贝叶斯神经网络 - 捕捉现实世界的不确定性

贝叶斯神经网络 - 捕捉现实世界的不确定性 Bayesian Neural Networks 生活本质上是不确定性和概率性的&#xff0c;贝叶斯神经网络 (BNN) 旨在捕获和量化这种不确定性 在许多现实世界的应用中&#xff0c;仅仅做出预测是不够的&#xff1b;您还想知道您对该预测的信心有多大。例…

第2章 Linux多进程开发 2.18 内存映射

内存映射&#xff1a;可以进行进程间的通信 1.如果对mmap的返回值(ptr)做操作(ptr), munmap是否能够成功? void * ptr mmap(…); ptr; 可以对其进行操作 munmap(ptr, len); // 错误,要保存地址 2.如果open时O_RDONLY, mmap时prot参数指定PROT_READ | PROT_WRITE会怎样? 错…

二进制安全虚拟机Protostar靶场 安装,基础知识讲解,破解STACK ZERO

简介 pwn是ctf比赛的方向之一&#xff0c;也是门槛最高的&#xff0c;学pwn前需要很多知识&#xff0c;这里建议先去在某宝上买一本汇编语言第四版&#xff0c;看完之后学一下python和c语言&#xff0c;python推荐看油管FreeCodeCamp的教程&#xff0c;c语言也是 pwn题目大部…