C++ primer三章二节标准库类型string

标准库类型string

  • 标准库类型string表示可变长的字符序列,使用#include<string>引入头文件,string定义在命名空间std中。

定义和初始化string对象

  • 如何初始化类的对象是由类的本身决定的,类可以定义很多初始化对象的方式,但是这些方式之间必须有所不同,不同体现在初始值的数量、类型。
  • 常用的初始化的例子
string s1;           //空字符串
string s2(s1);       //将s1作为s2的初始值
string s2 = s1;      //和上面的一致string s3("Value");  //给s3赋value值
string s3 = "value"; //和上面一致string s4(n,'c');    //s4 = n个c

直接初始化和拷贝初始化

  • = 拷贝初始化,将等号右侧的初始值拷贝到新创建的对象中去
  • 不使用等号,则执行的是直接初始化

string对象上的操作

  • 一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。
  • 类既可以定义通过函数名字调用的操作,还可以定义<<、+等各种运算符在此类的对象上的新的含义。
  1. os<<s   将s写到输出流os中,返回s
  2. is>>s    从is中读取字符串赋值给s,字符串以空白分割,返回is
  3. getline(is,s)  从is中读取一行赋值给s,返回is
  4. s.empty() s为空返回true。否则返回false
  5. s.size()   返回s中的字符的个数
  6. s[n]      返回s中第n个字符的引用,位置n从0开始计算
  7. s1+s2  返回字符串s1和s2拼接的效果
  8. s1 = s2  使用s2的副本代替s1中原来的字符
  9. s1 == s2  如果s1和s2的字符完全一致,则他们相等
  10. s1 != s2
  11. <、<=、>、>=  按照字典顺序比较大小,且大小写比较敏感

读写string对象

  • 读取操作的时候,string对象会自动忽略开头的空白(空格符、换行符、指标符),并从第一个真正的字符开始读起,直到遇见下一处的空白为止。例如输入“     Hello       ”,接收的却是“Hello”,输出的结果中没有空格。
  • 多个输入或者输出可以连写在一起。

读写未知数量的string对象

int main(int argc,char **argv){string word;while(cin >> word){cout << word << endl;}return 0;
}

使用getline读取一行

  • 保留输入的时候的空白符号,使用getline()替代先前的>>运算符号
  • getline只要一遇到换行符号就会结束读取操作并且返回结果,即使一开始输入的就是换行符号,那么返回的就是空字符串。
int main(int argc,char **argv){string word;while(getline(cin,word)){cout << word << endl;}return 0;
}

string的size操作

  • size函数返回的是一个string::size_type类型的值,这是一个无符号类型的数值,而且可以存放下任何string对象的大小。在C++11中允许使用auto或者decltype来判断变量的类型。
  • 如果表达式已经有了size()函数既不要使用int了,可以避免混用int和unsigned可能带来的问题。

比较string对象

  • ==和!=分别校验两个对象相等还是不相等。相等是指两个对象的长度和所蕴含的字符完全一致。
  • < <= >= > 和先前的认知是一致的,比较区分大小写,按照字典序来比
  • 如果两个字符一短一长,短的所有位数和长的先前位数是一致的,那么小的小于长的
  • 如果在某些位置上面元素不一致,以第一对相异字符比较结果作为整体比较结果。

两个string对象相加

  • 这个 + 符号和Java是一样的,默认是字符串的拼接
  • 如果将string对象、字符字面值和字符串字面值混在一起使用,需要保障每一个加法运算符 + 的两侧的运算符对象至少有一个是string。
    string s1 = "Hello";string s2 = "World";string s3 = s1 + "," + s2 + '\n';string s4 = s1 + ",";string s5 = "Hello" + "\n";//错误,两个运算对象都不是stringstring s6 = s1 + "," + "World";string s7 = "Hello " + "," + s2;//错误,不能把字面值直接相加

处理string对象中的字符

引入cctype头文件就可以引入一些标准库函数来处理字符

isalnum(c)c是字母或者数字为真
isalpha(c)c是字母为真
iscntrl(c)c是控制字符为真
isdigit(c)c是数字为真
isgraph(c)c不是空格但是可以打印的时候为真
islower(c)c是小写字母为真
isprint(c)c可打印为真(c是空格或者c具有可见的形式)
ispunct(c)c标点符号为真
isspace(c)c空白为真
issupper(c)c大写字母为真
isxdigit(c)c是十六进制为真
tolower(c)若c大写,则转化为小写字母
toupper(c)若c小写,则转化为大写字母
  • C++在兼容C语言的库,去掉.h,在头文件的名字前面增加字母c即可。

使用for来处理每一个字符

  • 将每一个字符改成小写
int main(int argc,char **argv){string s = "HELLO WORLD!!!";for(auto &c : s) {  //对于s中的每一个字符,其中&表示引用c = tolower(c); //c是一个引用,因此赋值语句将会改变c的数值}cout << s << endl;return 0;
}
  •  处理特定位置的字符:1,使用下标;2,使用迭代器
  • 下标运算符号[] 接收的输入值是string::size_type类型的数值,这个参数表示的是访问字符的位置,返回的是该位置上字符的引用。字符对象的下标从0开始计算,最大的下标是s[s.size()-1]

补充知识

  • decltype关键字用于查询表达式的类型
  • 详细的参考链接地址 https://blog.csdn.net/caoshangpa/article/details/79129258

 

 

 

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

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

相关文章

vim 不常见但好用的命令

● 跳跃 ○ 向前跳跃是 f ○ 向后跳跃是 F ● 继续 ○ 保持方向是 ; ○ 改变方向是 , ● 可以加上 [count] 来加速 ● ^ 是到本行第一个非空字符 ● 0 是到本行第一个字符&#xff0c;不管是不是空格 ● g_ 是到本行最后一个非空字符 ● 两个按键要依次按下 ● $ 跳到本行最后…

加密机组会 会议纪要

2020年9月28日 1&#xff0c;使用基类继承的机制&#xff0c;调用写好的函数接口 1&#xff0c;不要 使用Content&#xff08;封装数据&#xff0c;本质是一个json字符串&#xff09;&#xff0c;1&#xff0c;因为每次使用这个需要对里面的内容进行序列化&#xff0c;转化成…

c++为什么没有垃圾回收

垃圾回收 内存清理的另一个方面是垃圾回收。在支持垃圾回收的环境中&#xff0c;程序员几乎不必显式地释放与对象关联的 内存。运行时库会在某时刻自动清理没有任何引用的对象。 与C#和Java不一样&#xff0c;在C语言中没有内建垃圾回收。在现代C中&#xff0c;使用智能指针管理…

C++ Vecctor容器浅析

Vector的定义 向量&#xff08;Vector&#xff09;是一个封装了动态大小数组的顺序容器&#xff08;Sequence Container&#xff09;。跟任意其它类型容器一样&#xff0c;它能够存放各种类型的对象。可以简单的认为&#xff0c;向量是一个能够存放任意类型的动态数组。vector…

C++primer第二章2.4节对于const限定符相关内容进行详解

const限定符 const对象一旦创建后其数值就不会被再次改变&#xff0c;因此const对象必须初始化。const对象只在文件中有效在不同的文件中使用不同的const来定义不同的常量&#xff0c;那么每个文件定义的变量只会在自己所属的文件中有效。如果想让多个文件共享同一个const变量…

二分法的常见问题

mid(leftright)/2; mid (high - low) / 2 low; 这样写可以防止left right溢出 ,不过数足够大是时候该溢还是溢 为什么要取右边中间数呢&#xff1f;这是因为在区间里 只有 2 个元素的时候&#xff0c;把[left…right]划分成[left…mid - 1]和[mid…right]这两个区间&#x…

演示IPFS的一个完整的流程以及针对部分概念的详解

整体的流程 1&#xff0c;创建ipfs节点 通过ipfs init在本地计算机建立一个IPFS节点本文有些命令已经执行过了&#xff0c;就没有重新初始化。部分图片拷贝自先前文档&#xff0c;具体信息应以实物为准 $ ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2…

c++ 算法的时间复杂度

一般ACM或者笔试题的时间限制是1秒或2秒。 在这种情況下&#xff0c;C代码中的操作次数控制在 10^7为最佳。 下面给出在不同数据范国下&#xff0c;代码的时间复杂度和算法该如何选择&#xff1a; 1.n≤ 30,指数级别&#xff0c;dis剪枝&#xff0c;状态压缩dp 2.n < 100 &g…

简单工厂模式实现计算器

#include <iostream> #include <vector> #include <string> #include <iostream> #include <map> using namespace std; #define __THROW_ZERO do {cerr << "The dividend is 0" << endl; exit(1);}while(0);/* 简单工厂处…

TDengine安装教程

TDengine安装教程 前言 TDengine的安装十分简单&#xff0c;可以有以下三种安装方式&#xff0c;源码安装、通过Docker容器进行安装、通过安装包进行安装。但是使用源码安装较为复杂&#xff0c;通过docker的方式最为简单&#xff0c;但是需要一定docker相关的知识&#xff0…

C++中size_t的学习

size_t的定义 size_t是一种数据相关的无符号类型&#xff0c;它被设计得足够大以便能够存储内存中任意对象的大小。设计 size_t 就是为了适应多个平台&#xff0c;size_t等效于unsigned short int 或者 unsigned long int 类型&#xff0c;这个过程是动态匹配的。在需要通过数…

策略模式解决商店打折问题

#include <bits/stdc.h> using namespace std; /*策略模式解决商店打折问题*/class Cashsuper { private:/* data */ public:virtual double addcash(double cash) 0;double Getresult(double money){return addcash(money);} };class Cashnormal : public Cashsuper {p…

android 软件首次运行时引导页左右滑动效果

很多手机软件在安装后首次运行都会进入到引导页面&#xff0c;再次运行时会进入到主页面。 多了不说了&#xff0c;先看效果图&#xff1a; 代码如下&#xff1a; main.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:an…

C++中size_type类型详解

介绍 是和string类类型和vector类类型定义相关的类型&#xff0c;用以保存任意string对象或vector对象的长度&#xff0c;标准库类型将size_type定义为unsigned类型string抽象意义是字符串&#xff0c; size&#xff08;&#xff09;的抽象意义是字符串的尺寸&#xff0c; str…

单一职责原则 实现贪吃蛇代码的封装

单一职责原则(SRP),就一个类而言&#xff0c;应该仅有一个引起它 变化的原因。 一个c语言的贪吃蛇代码 如何使用单一职责原则封装成c面向对象呢 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include <wi…

android ProgressBar实现扫描SD卡文件 + SimpleAdapter绑定ListView

代码 activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"to…

C++标准库函数begin和end函数

主要的目的 为了让指针更加简单、安全&#xff0c;引入了begin和end函数&#xff0c;这两个函数和容器中两个同名的成员函数类似。但是由于数组毕竟不是类类型&#xff0c;因此这两个函数不是成员函数。正确的使用形式就是将数组作为他们的参数int ia[] {0,1,2,3,4,5,6,7,8,9…

dex分包之--------multidex包的配置使用

目录&#xff1a;一、前言二、产生原因三、MultiDex的简要原理四、MultiDex的使用 一、前言 首先说一下我遇到的情况&#xff0c;最近接手了一个项目是在已有的项目里进行更新添加一些功能&#xff0c;然后该项目导了N多的包&#xff0c;在我使用Android Studio的run”App”直…

C++ primer第六章函数的学习

介绍 首先介绍函数的定义和声明&#xff0c;包括如何传入参数以及函数如何返回结果。C语言允许使用重载函数&#xff0c;即几个不同的函数可以使用向同一个名字。所以接下来介绍重载函数的方法&#xff0c;以及编译器选择如何从函数的若干重载的形式中选取一个与调用模板相互匹…