[C++ Primer] 字符串、向量和数组

news/2024/10/2 3:34:06

[C++ Primer] 字符串、向量和数组

标准库类型 string

  1. 标准库类型string表示可变长的字符序列,使用该类型需包含string头文件。

    作为标准库的i一部分,string定义在命名空间std中。

  2. 拷贝初始化:使用等号(=)初始化一个变量

    直接初始化:不使用等号

    string s5 = "hiya";		// 拷贝初始化
    string s6("hiya");		// 直接初始化
    string s7(10,'c');		// 直接初始化
    
  3. getline()函数

参数:输入流,string对象

功能:函数从给定的输入流中读入内容,直到遇到换行符为止(换行符也被读进来了),然后把所读的内容存到string对象中(不存换行符,丢弃)

  1. 因为某些历史原因,也为了与C兼容,所以C++语言中的字符串字面值并不是标准库类型string的对象。字符串字面值与string是不同的类型。

  2. 范围for语句

    遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是:

    for (declaration : expression)statement
    

    其中,expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。

标准库类型 vector

  1. 标准库类型vector表示对象的集合,其中所有对象的类型相同。集合中每个对象都有一个与之对应的索引,索引用于访问对象。
    编译器根据模板创建类或函数的过程称为实例化(instantiaton)。
  2. 范围for语句体内不应改变其所遍历序列的大小。
  3. vector对象(以及string对象)的下标运算符可用于访问已存在的元素,不能用于添加元素。

迭代器介绍

数组

  1. 数组是一种复合类型,数组中元素的个数也属于数组类型的一部分,编译时维度应该已知。

  2. 复杂的数组声明

    int *ptrs[10];				// ptrs是含有10个整型指针的数组
    int &refs[10] = /*?*/;		// 错误,不存在引用的数组
    int (*Parray)[10] = &arr;	// Parray指向一个含有10个整数的数组
    int (&arrRef)[10] = arr;	// arrRef引用一个含有10个整数的数组
    int *(&array)[10] = ptrs;	// array是数组的引用,该数组含有10个int型指针
    

    要想理解数组声明的含义,最好的方法是从数组的名字开始按照从内到外的顺序阅读。

  3. 使用数组下标时,通常将其定义为size_t类型。size_t是一种机器相关的无符号类型。

  4. 在很多用到数组名字的地方,编译器都会自动地将其转换为一个指向数组首元素的指针:

    string nums[] = {"one","two","three"};
    string *p2 = nums; 			// 等价于p2 = &nums[0];
    

    当使用数组作为一个auto变量的初始值时,推断得到的类型是指针而非数组:

    int ia[] = {0,1,2,3,4,5,6,7,8,9};
    auto ia2(ia);			// ia2是一个整型指针,指向ia第一个元素
    

    当使用decltype关键字时上述转换不会发生,decltype(ia)返回的类型是由10个整数构成的数组:

    decltype(ia) ia3 = {0,1,2,3,4,5,6,7,8,9};
    ia3[4] = i;			// 正确:把i的值赋给ia3的一个元素
    
  5. 标准库函数begin和end

    这两个函数与容器中的两个同名成员函数功能类似,不过数组毕竟不是类类型,因此这两个函数不是成员函数。正确使用形式是将数组作为它们的参数:

    int ia = {0,1,2,3,4,5,6,7,8,9};
    int *beg = begin(ia);		// 指向ia首元素的指针
    int *last = end(ia);		// 指向ia尾元素的下一位置的指针
    
  6. 两个指针相减的结果的类型是一种名为ptrdiff_t的标准库类型,因为差值可能为负值,所以ptrdiff_t是一种带符号类型。

  7. C风格字符串

    C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定而成的写法。按此习惯书写的字符串存放在字符数组中并以空字符结束,即在字符串最后一个字符后面跟着一个空字符('\0')。一般利用指针来操作这些字符串。

    strlen(p)
    strcmp(p1,p2)
    strcat(p1,p2)
    strcpy(p1,p2)
    

    传入此类函数的指针必须指向以空字符作为结束的数组:

    char ca[] = {'C','+','+'};		// 不以空字符结束
    cout << strlen(ca) << endl;		// 严重错误:ca没有以空字符结束
    
  8. 不能用string对象直接初始化指向字符的指针,需使用string的c_str成员函数:

    string s("Hello World!");
    char *str = s;					// 错误:不能用string对象初始化char*
    const char *str = s.c_str();	// 正确
    

    c_str函数的返回值是一个C风格的字符串。即函数的返回结果是一个指针,该指针指向一个以空字符结束的字符数组,这个数组所存的数据恰好与那个string对象一样。

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

多维数组

  1. 要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。

    int ia[3][4];
    for(auto row : ia)              // 错误for(auto col : row)	// row不是引用类型,编译器初始化row时会自动将其转换为指向该数组内首元素的指针
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

manim边学边做--Integer

Integer是Mobjects分类中专门用来显示整数的一个class。它与上一篇介绍的DecimalNumber类不同之处在于,它只专注于整数的显示。Integer在manim各个模块中的位置如上图中所示。 1. 主要参数 Integer是继承自DecimalNumber的,所以使用Integer的地方,也可以使用DecimalNumber。…

[C++ Primer] 变量和基本类型

总结记录了C++ Primer书中重要的C++相关知识[C++ Primer] 变量和基本类型 变量默认初始化 如果定义变量时没有指定初值,则变量默认初始化,此时变量被赋予“默认值”。默认值到底是什么由变量类型决定,同时定义变量的位置也会对此有影响。 内置类型:其默认值由定义的位置决定…

jmeter【配置元件】-【用户定义的变量】与【前置处理器】-【用户参数】变量重复时,引用哪个值?

引用前置处理器中的【用户参数】 原因: 1.线程组下的用户参数优先级>测试计划中的用户定义的变量 2.取样器(http请求)下的用户参数优先级>线程组下的用户参数优先级 当某个取样器设置了用户参数时,会优先使用该取样器下的用户参数,因为配置元件一般在测试计划开始之…

D365 onebox 开发环境证书到期处理过程

到期证书指纹 76338006924d8bbb7f2f28638ec5d41eb5d21a70克隆命令 此处需使用Windows PowerShell Set-Location -Path "cert:\LocalMachine\My" $OldCert = (Get-ChildItem -Path 76338006924d8bbb7f2f28638ec5d41eb5d21a70) New-SelfSignedCertificate -CloneCert $…

vue3 ref()和reactive()

vue3 ref()和reactive() 能在改变时触发更新的状态被称作是响应式的。 reactive()与ref() reactive() 只适用于对象 (包括数组和内置类型,如 Map 和 Set)。而另一个 API ref() 则可以接受任何值类型。ref 会返回一个包裹对象,并在 .value 属性下暴露内部值。 <script set…

前端微服务架构qiankun初体验

一、背景‘熵增’问题一直是所有软件开发中都会遇到的问题,不管是前端还是后端都会遇到,老的系统在需求不断变更或者迭代,代码量会越来越大,最终都会形成一座‘屎山’, 今天主要讨论前端对于这种情况的解决方案。目前前端的解决方案有比较古老的iframe,但是iframe是完全隔…

网络世界的脊柱——OSI七层模型

简介 OSI代表开放系统互联(Open Systems Interconnection),这是国际标准化组织(ISO)提出的一个概念模型,用于描述网络通信的功能划分。简单来说,OSI模型把复杂的网络通信过程分成了七个不同的层次,每一层都有其特定的功能和角色。每一层都有自己的头数据,在封装和解封…