第3章 字符串、向量和数组
发布日期:2021-06-23 03:28:54 浏览次数:3 分类:技术文章

本文共 3062 字,大约阅读时间需要 10 分钟。

3.2 标准库类型 string

3.2.2 string对象上的操作

string支持的操作

cout<<s

将s写到输出流cout中,返回cout
cin>>s 从cin中读取字符串赋给s,字符串以空格分隔,返回cin,string对象会自动忽略开头的空白(空格符、制表符、换行符等)
getline(is, s) 从is中读取一行给s,返回is(以换行符为准读取一行,但换行符被丢弃掉了)
s.empty() s为空返回true,否则为false
s.size() 返回s中字符的个数,返回的类型为string::size_type类型
s[n] 下标访问s中的字符,从0开始
s1+s2 返回s1和s2连接后的结果
s1=s2 用s2的内容代替s1的内容
s1==s2 如果s1和s2所含字符完全相同则相等,且对字母大小写敏感
s1!=s2
<、<=、>、>= 利用字符在字典中的顺序比较,且对字母大小写敏感

1、比较string对象

  • 如果俩string对象的长度不同,且较短的string对象每个字符都与较长string对象对应位置都字符相同,则判定较短对象小于较长对象
  • 如果俩string对象在某些对应位置不一致,则比较的是第一对相异字符比较的结果。

2、字面值和string对象相加

  • 必须确保每个加法运算符的两侧运算对象至少有一个是string对象
  • 加号运算符为从左向右结合,下面使用方式为非法的,前两个运算对象为字面值直接相加
string s2 = "world";string s7 = ("hello" + ", ") + s2;

3.2.3 处理string对象中的字符

cctype头文件中的函数
isalnum(c) 当c是数字或字母时为真
isalpha(c) 当c是字母时为真
iscntrl(c) 当c是控制字符时为真
isdigit(c) 当c是数字时为真
isgraph(c) 当c不是空格但可打印时为真
islower(c) 当c是小写字母时为真
ispunct(c) 当c是标点符号时为真
isspace(c) 当c是空白时为真(空格、制表符、回车换行符)
isupper(c) 当c是大写字母时为真
tolower(c) 如果c是大写字母,则转为小写,否则原样输出
toupper(c) 如果c是小写字母,则转为大写,否则原样输出

1、使用基于范围的for语句

string s = "hello world";for (auto &c : s) {    c = toupper(c);}cout << c << endl;

3.3 标准库类型vector

3.3.1 定义和初始化vector对象

初始化vector对象的方法
vertor<T> v1 v1为一个空vector,执行默认初始化
vertor<T> v2(v1) v2中包含v1所有元素的副本
vector<T> v2 = v1 等价于v2(v1)
vertor<T> v3(n, val) v3包含了n个重复的元素,每个元素都是val
vertor<T> v4(n) v4包含了n个重复地执行了值初始化的对象
vector<T> v5{a, b, c...} 包含了初始值个数的元素,每个元素被赋予相应的值
vertor<T> v5 = {a, b, c...} 等加于v5{a, b, c...}

1、(默认)值初始化

  • 通常情况下可以只提供vector容纳元素数量而省略初始值,此时会执行值初始化,将初始值赋值给容器中的所有元素,初始值由元素类型决定。如果元素类型为int,则初始化为0;如果为某中类类型,则元素由类默认初始化,比如string默认初始化为空
  • vertor
    ivec(10); //10个元素,每个都初始化为10vector
    svec(10); //10个元素,每个都是空string对象

     

  • 如果定义变量时没有指定初始值,则变量会默认初始化,此时变量被赋予默认值,默认值由变量类型决定,同时定义变量的位置也会对此有影响

1、每个类各自决定初始化对象的方式

2、内置类型的变量取决于定义的位置,定义在函数体外被初始化为0,定义在函数体内将不被初始化,其值未定义

2、列表初始化

  • 列表初始化尽量使用花括号
  • 如果用的是圆括号,可以说提供的值是用来构造vector对象的
  • 如果用的是花括号,初始化过程会尽量地将花括号的值当成元素初始值的列表来处理,只有无法执行列表初始化才会考虑其他初始化方式

3.3.3 其他vector操作

vector支持的操作
v.empty() 如果v不含有任何元素返回真,否则返回假
v.size() 返回v中元素的个数,返回类型为vector<T>::size_type
v.push_back(t) 向v的尾端添加一个值为t的元素
v[n] 返回v中第n个位置上元素的引用,从0开始
v1 = v2 用v2中的元素的拷贝替换v1中的元素
v1 = {a, b, c...} 用列表中元素的拷贝替换v1中的元素
v1 == v2 v1和v2相等且仅当它们的元素数量相同且对应位置的元素都相同
v1 != v2
<, <=, >, >= 以字典顺序进行比较

1、使用基于范围的for语句

vertor
v{1, 2, 3, 4, 5};for (auto &i : v) { i *= I;}

2、不能用下标形式添加元素

vector以及string对象的下标运算符可用于访问已存在的元素,而不能用于添加元素。

3.4 迭代器

所有标准容器都可以使用迭代器,但是其中只有少数几种才支持下标运算符

3.4.1 使用迭代器

//b表示v的第一个元素,e表示v尾元素的下一位置,即一个不存在的“尾后”auto b = v.begin(), e = v.end();for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it) {    *it = toupper(*it);}
标准容器迭代器的运算符
*iter 返回迭代器iter所指元素的引用
iter->mem 解引用iter并获取该元素名为mem的成员,等价(*iter).mem
++iter 令iter指向容器的下一个元素
--iter 令iter指向容器的上一个元素
iter1 == iter2 判断两个迭代器是否相等(不想等),如果两个迭代器指的是同一个元素或者它们是同一个容器的尾后迭代器,则相等,反之不相等
iter1 != iter2

1、迭代器类型

vertor
::iterator it; //it能读写vertor
的元素vector
::const_iterator it2 //it只能读元素,不能写元素string::iterator it3;string::const_iterator it4;

2、组合解引用和成员访问操作

当用迭代器访问string对象时,可通过解引用对象访问string对象的成员,例如(*it).empty

3、但凡是使用了迭代器的循环器,都不要向迭代器所属的容器添加元素,会导致迭代器失效

 

 

 

 

 

 

 

转载地址:https://blog.csdn.net/RachleMa/article/details/117306066 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Python】第3章-8 字符串逆序 (15分)
下一篇:[GYCTF2020]FlaskApp

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月24日 17时12分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章