博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3 字符串,向量和数组
阅读量:3975 次
发布时间:2019-05-24

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

3 字符串,向量和数组

3.1 命名空间的using声明

  • 作用符(::):编译器从左侧作用域寻找右侧的名字,如
    std::cin,std::cout
  • using声明:使用命名空间成员的简便方法
    格式:
    在这里插入图片描述
    例子:
    在这里插入图片描述

每个名字都要独立的using声明

在这里插入图片描述
在这里插入图片描述
头文件中不应包含using语句

3.2标准库类型string

3.2.1 定义和初始化string对象

  • string的多种初始化方式:
    在这里插入图片描述
  • 拷贝初始化:带等号赋值。将等号右边的内容拷贝到对象中
  • 直接初始化:括号赋值。
    在这里插入图片描述
    在这里插入图片描述
    等价于
    在这里插入图片描述

3.2.2 string对象上的操作

在这里插入图片描述

读写string对象

  • 使用IO操作符读写string对象:
//输入和输出字符串s#include
using std::cin; using std::cout; using std::endl; using std::string;int main(){
string s; cin >> s; cout << s << endl; return 0;}

执行此程序过程中,string对象会自动忽略开头空白(空格符,换行符,制表符等等),从第一个真正的字符读起,直到下一个空白为止

:如输入“Hello World",则输出"Hello"

  • 输入,输出"Hello World“方法:
//输入输出Hello World#include
using std::cin; using std::cout; using std::endl; using std::string;int main(){
string s1, s2; cin >> s1 >> s2; cout << s1 <<' '<< s2 << endl; return 0;}

在这里插入图片描述

读取未知量的string对象

方法1:

#include
using std::cin; using std::cout; using std::endl; using std::string;int main(){
string word; while (cin >> word) {
cout << word << endl; } return 0;}

运行结果:

在这里插入图片描述
方法2:
想在最终得到的字符串中保留空白符时,使用getline实现

#include
#include
using std::getline;using std::cin; using std::cout; using std::endl; using std::string;int main(){
string line; while (getline(cin, line)) cout << line << endl; return 0;}

在这里插入图片描述

其中,getline属于string库

即开头需添加#include < string >

string的empty和size操作

  • empty:empty是string的一个成员函数,根据string对象是否为空返回一个布尔值
#include
#include
using std::getline;using std::cin; using std::cout; using std::endl; using std::string;int main(){
string line; while (getline(cin, line)) if (!line.empty()) cout << line << endl; return 0;}

在这里插入图片描述

string::size_type类型

  • size_type类型属于string库
  • size_type类型的判断
    在这里插入图片描述

比较string对象

  • string的比较规则:
    长度相同:从字母不一样的位置比较
    长度不同:从不同的字母开始比较,如较短的string与较长的均相同,较长的大
    在这里插入图片描述
    为string对象赋值
  • string类中,允许对象之间的赋值
    在这里插入图片描述
    两个string对象相加
  • 两个string相加相当于将两个string连起来
#include
using std::cout; using std::cin; using std::endl; using std::string;int main(){
string s1("Hello"), s2("world\n"),s3; s3 = s1 + s2; cout << s3 << endl; return 0;}

在这里插入图片描述

字面值和string对象相加

此时必须确保“+”左右至少有一个为string

在这里插入图片描述

#include
using std::cout; using std::cin; using std::endl; using std::string;int main(){
string s1("Hello"),s2; s2 = s1 + '!'; cout << s2 << endl; return 0;}

在这里插入图片描述

在这里插入图片描述

3.2.3处理string对象中的字符

在这里插入图片描述

  • 想对string中的单个字符做出改动时,使用范围for语句
    在这里插入图片描述
    使用for语句单个输出string中的字符:
#include
using std::cin; using std::cout; using std::endl;using std::string;int main(){
string str("some string"); for (auto c : str) cout << c << endl; return 0;}

在这里插入图片描述

其中,通过auto关键字来确定c的类型,此处,c的类型为char

每次迭代,str下一个字符被拷贝给c,实现单个字符的输出

使用 for和 ispunct语句统计string对象中标点的数量

#include
using std::cin; using std::cout; using std::endl; using std::string;int main(){
string s("Hello World!!!"); //使punct_cnt类型与s.size类型一致 decltype(s.size()) punct_cnt = 0; //统计s中的标点数 for(auto c: s) if(ispunct(c)) ++punct_cnt; cout<
<<" punctation characters in "<
<

在这里插入图片描述

使用 for语句改变字符串中的字符

  • 想改变string对象中的字符,需将循环变量定义为引用类型

将字符改为大写

#include
using std::cin; using std::cout; using std::endl; using std::string;int main(){
string s("Hello World!!!"); for (auto& c : s) c = toupper(c); cout << s << endl; return 0;}

在这里插入图片描述

其中在这里插入图片描述

变量c引用string s的单个字符,该操作改变了s中的每个字符为大写

只处理一部分字符(使用下标运算符)

  • 下标运算符([ ]):接收的输入参数:string::size_type
    下标运算符从0开始计数

将首字符改为大写:

#include
using std::cin; using std::cout; using std::endl; using std::string;int main(){
string s("some string"); decltype(s.size()) index = 0; for (; index != s.size() && !isspace(s[index]); index++) s[index] = toupper(s[index]); cout << s << endl; return 0;}

在这里插入图片描述

在这里插入图片描述

使用下标执行随机访问

十进制转十六进制:

3.3 标准库类型vector

标准库类型vector(向量)又称为容器,容纳着其他对象

  • 想要使用vector应先声明:
    在这里插入图片描述
  • vector是类模板,使用模板时编译器会将模板实例化
    在这里插入图片描述
    在这里插入图片描述

可理解格式为:模板<类型>

  • vector可容纳绝大多数类型的对象,引用除外。(引用不是对象)

3.3.1 定义和初始化vector

在这里插入图片描述

在这里插入图片描述

  • 相当于定义string类型svec
  • 将一个vector对象的值考贝给另一个对象时,必须保证两个对象的类型相同
    在这里插入图片描述

列表初始化vector

在这里插入图片描述

相当于articles包含3个元素

创建指定数量的元素

  • 格式:vector<类型>名称(数量,内容);

    在这里插入图片描述
    值初始化

  • 根据类型的不同,库会自动对其赋初值(前提是说明了vector对象个数

    在这里插入图片描述
    列表初始化还是元素数量?
    格式
    1) {值}
    2)(元素个数)
    3)(元素个数,每个元素的赋值)
    4){值,值}
    在这里插入图片描述
    在这里插入图片描述

  • { }内表示对象的初值
  • ( )内有表示元素个数的意思
    (10),10代表元素个数
    (3,10),10代表元素初值
  • string中:在这里插入图片描述

3.3.2 向vector对象中添加元素

  • 想向vector对象中添加多个元素时:
    1)先创建一个空vector
    2)使用push_back向其中添加元素
    在这里插入图片描述

3.3.3其他vector操作

在这里插入图片描述

  • 两个vector对象的大小判断:
    == :两个vector对象完全一致
    < :元素少<元素多;相异第一元素值大>相异第一元素值小

计算vector对象内的索引

例:统计各个分数段的人数
如:
在这里插入图片描述

#include
#include
using std::cout; using std::cin; using std::endl; using std::vector;int main(){
vector
scores(11, 0);//初始化各个分数层的人数 unsigned grade; while (cin >> grade) ++scores[grade/10]; for (auto i:scores) cout <
<

不能用下标形式添加元素

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 迭代器介绍

  • 通过迭代器,可访问string对象或vector对象中的元素
  • 类似于指针类型,迭代器可从一个元素移动到另一个元素

3.4.1 使用迭代器

  • 迭代器拥有名为beginend(尾后迭代器)的成员
    在这里插入图片描述

end指向的是元素的下一元素,没有实际含义,仅是一个标记

迭代器运算符

在这里插入图片描述

  • 与指针类似,迭代器使用“ * ”来获取它所指向的元素
    在这里插入图片描述

将迭代器从一个元素移动到另一个元素

  • 迭代器使用递增运算符(++)来从一个元素移动到下一个运算符
    在这里插入图片描述

迭代器类型

  • 一般来说,我们不知道(也无需知道)迭代器精确类型,实际上,用迭代器标准库类型使用iteratorconst_iterator(常量,不能改变其值)来表示迭代器的类型
    在这里插入图片描述

begin和end运算符

  • begin和end的返回类型(常量/非常量)由对象绝定

    在这里插入图片描述
    在这里插入图片描述

  • cbegin和cend函数:

    在这里插入图片描述

结合解引用和成员访问操作

  • 通过解引用,迭代器可直接访问成员
  • 检查it字符串是否为空:
    在这里插入图片描述

:(*it)中的()不能省略,()关系到运算的顺序

在这里插入图片描述

  • 为简化上述表达式,可用==箭头运算符 ==把解引用和成员运算符两个操作结合在一起

3.4.2 迭代器运算

  • string和vector的迭代器提供的额外运算符可使迭代器一次跨过多个元素
    在这里插入图片描述

迭代器的算数运算

使迭代器指向vector的中间元素:

在这里插入图片描述

  • 两迭代器进行运算后的返回值是名为difference_type的带符号型整数

使用迭代器运算

使用迭代器进行二分搜索:

在这里插入图片描述

3.5 数组

数组与vector用法相似,与vector不同的是,数组大小不变,不能随意向数组中添加元素

3.5.1 定义和初始化内置数组

  • 格式:数组名[ 维度(个数) ],其中,维度必须为常量表达式
    在这里插入图片描述

显示初始化数组元素

  • 进行列表初始化化时,允许忽略数组维度
    在这里插入图片描述

字符数组的特殊性

  • 字符数组结尾处需添加一个空字符(\0),所以其实际长度比字面长度长1
    在这里插入图片描述

不允许拷贝和赋值

  • 数组之间不允许拷贝
    在这里插入图片描述

理解复杂的数组声明

  • 默认条件下,从右往左依次绑定
    在这里插入图片描述
    在这里插入图片描述

3.5.2 访问数组元素

  • 数组下标属于size_t类型,包含于头文件cstddf
    记录各分数段成绩人数:
    在这里插入图片描述
    在这里插入图片描述

注意保证数组下标值不能越界

3.5.3 指针和数组

  • 通常情况下,数组名代表数组元素的首地址

    在这里插入图片描述
    在这里插入图片描述

  • 使用auto判断依旧为指针类型

    在这里插入图片描述
    在这里插入图片描述

  • 使用decltype关键字判断的类型则为数组本身

    在这里插入图片描述

指针也是迭代器

  • 数组的指针也支持string和vector迭代器的运算
    在这里插入图片描述

标准库begin和end

  • 格式:begin(数组名) end(数组名)
    在这里插入图片描述
    找出整型数组中的负数
    在这里插入图片描述

指针运算

  • 指针加(减)一个整数,相当于指针的位置向后(前)移动整数个单位

    在这里插入图片描述

  • 指针间加减相当于计算指针间的距离(仅限同一数组中的指针),运行结果得到的是ptrdiff_t类型

    在这里插入图片描述
    在这里插入图片描述

解引用和指针运算的交互

在这里插入图片描述
在这里插入图片描述

下标和指针

在这里插入图片描述
在这里插入图片描述

3.5.4 C风格字符串

在这里插入图片描述

3.5.5 与旧代码的接口

混用string对象和C风格字符串

  • 运行使用字符数组初始化string对象
  • string对象的加减运算中允许出现一个字符数组(不能两个都是)
  • 用string对象初始化字符数组方法:
    在这里插入图片描述

使用数组初始化vector对象

  • 允许使用数组初始化vector对象
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.6 多维数组

转载地址:http://efmki.baihongyu.com/

你可能感兴趣的文章
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
ksh 命令分隔符
查看>>
sed 精萃
查看>>
awk 精萃
查看>>
awk 注释
查看>>
GROUPING SETS、ROLLUP、CUBE
查看>>
数据类型和变量
查看>>
表连接(JOIN)
查看>>
游标(Cursor)
查看>>
复合语句(compound statement)
查看>>
DB2 物化查询表
查看>>
IF 语句
查看>>
循环语句
查看>>
DB2 临时表
查看>>
ITERATE、LEAVE、GOTO和RETURN
查看>>
异常处理
查看>>
存储过程
查看>>