C++ primer中文版(第五版) 第三章 字符串、向量和数组

C++ primer中文版(第五版)----第三章 字符串、向量和数组

命名空间的using声明

为什么要用命名空间的using声明?

有了using声明就无须专门的前缀(::)也能使用所需的名字了。

//格式 using namespace::name;
using std::cin;//再使用直接用cin就行

注意事项:
一般来说头文件中不应该包含using声明。
每个名字都需要独立的using声明

标准库类型string

怎样才能使用string?

需要包含string头文件。
string的定义在命名空间std中。

#include 
using std::string;

定义和初始化string对象

怎样定义和初始化string对象?

以下内容为常用的方式

string s1;          //默认初始化,s1是一个空串
string s2 = s1;     //s2是s1的副本
string s3 = "hiya"; //s3是该字符串的副本
string s4(10,'C');  //s4的内容是10个c(cccccccccc)

string对象上的操作

C++ primer中文版(第五版) 第三章 字符串、向量和数组_第1张图片
注意事项:在执行读取操作时,string对象将自动忽略开头的空白(空格符,换行符,制表符等)并从
第一个真正的字符开始读起,知道遇见下一处空白为止。

string in_str;
//输入“hello world”
std::cin >> in_str;  //实际存入in_str中的只有hello

怎样将一行包含空白符的字符串输入到string对象中?

使用getline替代“>>”

string str;
getline(std::cin, str);

处理string对象中的字符

头文件cctype中定义了一组标准库函数处理字部份工作。C++ primer中文版(第五版) 第三章 字符串、向量和数组_第2张图片

迭代器介绍

迭代器是什么?

迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如链表或数组上遍访的接口,设计人员无需关心容器对象的内存分配的实现细节。(源自百度百科)

谁支持迭代器?

所有的标准库容器都可以使用迭代器
string支持迭代器。

使用迭代器

有迭代器的类型同时拥有返回迭代器的成员。
begin成员负责返回指向第一个元素(第一个字符)的迭代器。
end成员负责返回指向容器(或string对象)“尾元素的下一个位置”的迭代器。

迭代器运算C++ primer中文版(第五版) 第三章 字符串、向量和数组_第3张图片

补充说明:
所有标准库容器的迭代器都定义了==和!=,但是它们中的大多数都没有定义<运算。

数组

什么是数组?

有序的元素序列
数组是一种复合类型。

定义和初始化内置数组

如何声明一个数组?

int arr[10];//int 代表数组中元素的类型 arr是数组名称 10代表数组中元素的个数

补充说明:
数组中元素的个数也属于数组类型的一部分,编译的时候是已知的。维度必须是一个常量表达式。
如果不清楚元素的个数,请使用vector

数组怎么初始化?

int ia1[3] = {0,1,2}; //共三个元素,分别是0,1,2
int a2[]   = {0,1,2}; //初始化完成后,维度也就确定了
int a3[6]  = {0,1,2}; //部分赋值,未赋值的元素默认为0

补充说明:
字符数组的最后一个元素一定是一个空字符,该字符作为字符数组的结束标志。
不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。

有没有引用数组?

没有,数组中的每一个元素都是对象,引用不是对象,所以没有引用数组。

如何定义数组的指针和数组的引用?

int arr[10] = {1};
int (*Parray)[10] = &arr;    //Parray指向一个含有10个整数的数组
int (&arrRef)[10] = arr;     //arrRef引用一个含有10个整数的数组

补充说明:
要想理解数组声明的含义,最好的办法是从数组名字开始按照由内向外的顺序阅读。

访问数组元素

如何访问数组元素?

与标准库的vector和string一样,数组的元素也能使用范围for语句或下标运算符来访问。
补充说明:数组的索引从0开始。

指针和数组

在使用数组的时候编译器一般会把它转换成指针。
在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。

数组和指针的区别?

1.概念不同
​ 数组是一个有序的元素序列。
​ 指针就是一个存放其他变量地址的变量。
2.赋值方式不同。
​ 数组只能一个元素一个元素的赋值,数组不能相互赋值。
​ 同类型的指针可以相互赋值。

C风格字符串

C语言标准库提供了以一些函数,可以用来操作C风格字符串。
需要包含头文件cstring
C++ primer中文版(第五版) 第三章 字符串、向量和数组_第4张图片

与旧代码的接口

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

允许用以空字符结束的字符数组来初始化string对象或为string对象赋值

string str("hello world");

C在string对象的复合赋值运算中允许使用以空字符结束的字符数组作为右侧的运算对象

string str("hello ");
str += "world";

string对象转换成C风格字符串,调用其成员函数c_str()在这里插入图片描述

string str("CSDN");
const char *s = str.c_str(); 

使用数组初始化vector对象

不允许使用一个数组为另一个内置类型的数组赋初值,也不允许使用vector对象初始化数组。
允许使用数组来初始化vector对象

int int_arr[] = {0,1,2,3,4,5};
vector ivec(begin(int_arr),end(int_arr));

补充说明:
现代的C++程序应当尽量使用vector和迭代器,避免使用内置数组和指针;
应当尽量使用string,避免使用C风格的基于数组的字符串。

多维数组

严格来说C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。

//一个数组的元素是数组,由此套娃下去。。。。
//int a[3];
//如果a中的元素是一个有四个元素的数组
//int a[3][4];
//如果那四个元素的数组的元素是一个有五个元素的数组
//int a[3][4][5];

如何初始化多维数组?

全部初始化

//带花括号
int ia[2][2] = {{1,1},{2,2}};
//不带花括号
int ib[2][2] = {1,1,2,2};

部分初始化

//带花括号
int ia[2][2] = {{1},{2}}; //每行的第一个元素被初始化,其余值都是零
//不带花括号
int ib[2][2] = {1,2};     //第一行完成了初始化,其余行的所有元素均为零

如何处理多维数组?

1.多维数组的下标引用:如果表达式中的下标运算符数量等于数组的维度,那么就是访问一个元素。如果表达式中的下标运算符的数量少于数组的维度,那就是获取的一个内层数组。

int ia[3][4] = {1,2,3,4};
//访问一个元素
ia[1][3] = 1;
//设置一个内层数组的引用(数组的引用)
int (&row)[4] = ia[2];

2.使用for/C++11范围for

int ia[3][4] = {1,2};
//普通for
for(int i = 0; i < 3; i++)
	for(int j = 0; j < 4;j++)
		std::cout << ia[i][j] << std::endl;
		
//C++11 范围for
for( auto &row : ia)      
    for(auto &col : row)  
        std::cout << col << std::endl;
//补充说明:要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型




你可能感兴趣的:(C/C++学习笔记,c++,开发语言)