第3章 字符串、向量和数组

本文介绍了C++标准库中string对象的操作,包括输出、输入、长度检查、字符访问以及连接等。同时,讲解了vector的定义、初始化方法,如值初始化和列表初始化,并阐述了vector的操作如大小检查、元素添加和遍历。此外,还提到了迭代器的使用,强调了基于范围的for循环和迭代器在访问容器元素时的注意事项。
摘要由CSDN通过智能技术生成

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> v1v1为一个空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<int> ivec(10);     //10个元素,每个都初始化为10
    vector<string> 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 == v2v1和v2相等且仅当它们的元素数量相同且对应位置的元素都相同
v1 != v2
<, <=, >, >=以字典顺序进行比较

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

vertor<int> 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<int>::iterator it;        //it能读写vertor<int>的元素
vector<int>::const_iterator it2  //it只能读元素,不能写元素
string::iterator it3;
string::const_iterator it4;

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

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

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

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值