首页 > 编程语言 >[C++ Primer] 字符串、向量和数组

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

时间:2024-06-13 12:43:48浏览次数:22  
标签:10 string int C++ 数组 ia Primer 向量 指针

[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时会自动将其转换为指向该数组内首元素的指针
    

标签:10,string,int,C++,数组,ia,Primer,向量,指针
From: https://www.cnblogs.com/Invinc-Z/p/18245668

相关文章

  • [C++ Primer] 变量和基本类型
    [C++Primer]变量和基本类型变量默认初始化如果定义变量时没有指定初值,则变量默认初始化,此时变量被赋予“默认值”。默认值到底是什么由变量类型决定,同时定义变量的位置也会对此有影响。内置类型:其默认值由定义的位置决定。定义于任何函数之外的变量被初始化为0。绝大多数......
  • 【C++面向对象】重载操作符
    C++将运算符重载扩展到自定义的数据类型,它可以让对象操作更美观。例如字符串string用加号(+)拼接、cout用两个左尖括号(<<)输出。运算符重载函数的语法:返回值operator运算符(参数列表);运算符重载函数的返回值类型要与运算符本身的含义一致。非成员函数版本的重载运算符函数:形......
  • 2024年华为OD机试真题-围棋的气-C++-OD统一考试(C卷D卷)
     2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19x19=361个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。“气”是围棋中很重要的一个概念,某个棋子有几口气,是指......
  • c++ 实现优先队列
    优先队列底层是堆,下面给出大根堆代码Push是在新节点到根节点的路径上寻找合适的插入位置;Pop是删除根节点之后维护大根堆,顺便为最后一个元素寻找合适的位置;1#include<bits/stdc++.h>23usingnamespacestd;45template<classT>6classp_queue{7pri......
  • c++在什么情况下会发生拷贝?
    在C++中,对象拷贝通常会在以下情况下发生:传递参数给函数:当你将对象作为参数传递给函数时,如果参数是按值传递的,那么会发生拷贝。例如:voidfunc(MyClassobj);//obj会被拷贝从函数返回对象:当函数返回一个对象时,如果函数返回的是对象本身而不是引用或指针,会发生拷贝。例......
  • C++中的流
    目录字节流(ByteStreams)字符流(CharacterStreams)主要区别在C++中,字节流和字符流是两种处理输入输出(I/O)的操作方式,它们都属于iostream库的一部分。它们的主要区别在于处理数据的基本单元和适用场景。字节流(ByteStreams)字节流以字节(byte)为基本处理单位,每个字节包含......
  • C/C++ 使用宏时应注意的问题总结
    使用C/C++宏时,为了确保代码的正确性、可读性和可维护性,现总结一些注意事项和最佳实践:1.定义常量使用#define定义常量时,要注意其类型不安全性。虽然它使用方便快捷,但缺乏类型检查可能导致问题。如果需要类型安全的常量,可以考虑使用const或constexpr。2.多重包含防范当宏......
  • 红黑树/红黑树迭代器封装(C++)
        本篇将会较为全面的讲解有关红黑树的特点,插入操作,然后使用代码模拟实现红黑树,同时还会封装出红黑树的迭代器。    在STL库中的set和map都是使用红黑树封装的,在前文中我们讲解了AVL树,对于红黑树和AVL树来说,这两种树都是效率很高的搜索二叉树,但是......
  • AVL树 ---(C++)
        本篇讲全面的讲解AVL树的插入,旋转以及验证AVL树的性能(本篇未实现删除代码)。至于为什么会有AVL树,这是因为简单的二叉搜索树并不能直接的保证搜索的效率,因为当我们在二叉搜索树中插入一段有序的序列的时候,二叉搜索树就会退化为单枝树,这个时候进行搜索的时候,时......
  • c++ 游戏:俄罗斯方块
    ​​​​​​​#include<iostream>#include<string>#include<cstdlib>#include<windows.h>#include<ctime>#include<conio.h>#include<cstdio>usingnamespacestd;classTetris{private:intrank;//游戏难度等级intscore;//得分intid;/......