文章目录

  • 第4章 数组、vector和字符串
    • 第1节 数组
      • 注意事项
      • 数组的复杂声明
      • 数组中元素的访问
      • 数组到指针的隐式转换
      • 获得s指向数组开头和结尾的指针
      • 数组的其他操作
      • C字符串
      • 多维数组
    • 第2节 vector
      • 构造和初始化
      • 元素的索引和遍历
      • 迭代器iterator
      • vector相关其他内容
    • 第3节 string

第4章 数组、vector和字符串

第1节 数组

将一个到多个相同类型的对象串联到一起,所组成的类型

  • int a ; int b[10]; 区分类型,b的类型为int[10]
  • 初始化方式
    • 缺省初始化
    • int a[3] = {1,2}; //第三个元素为0
    • int b[] = {1,2,3} //int[3]

注意事项

  • 不能使用auto声明数组类型

  • 数组不支持复制

  • 数组的长度必须为一个常量表达式

  • 字符串的数组特殊性 (在字符串结尾隐式加上\0表示结束)

    char str[] = "Hello";                 //char[6]
    char srt[] = {'H','e','l','l','o'};    //char[5]
    

数组的复杂声明

  • 指针数组与数组的指针

    int x1,x2,x3;                //指针数组
    int* a[3] = {&x1, &x2, &x3};   //a类型为int*[3]
    
    int a[3] = {1, 2, 3};        //数组的指针
    int (*b)[3] = &a;             //b类型为int(*)[3]
    
  • 声明数组的引用

    int a[3] = {1, 2, 3};
    int (&b)[3] = a;
    

数组中元素的访问

  • 数组对象是一个左值(l-value)

​ (左值:能够放在等号左侧的值(C),C++中 locater-value)

  • 使用时会转换成相应的指针类型
  • x[y]; // 会被解析成*(x+y)

数组到指针的隐式转换

通常会产生转换

隐式转换会丢失一部分信息

int a[3] = {1,2,3};    //a  int[3]
auto b = a;               //b  int*

可以通过声明引用来避免隐式转换

int a[3] = {1,2,3};    //a  int[3]
auto b = a;            //b  int*
auto& c = a;           //c  int(&)[3]

不能使用extern指针来声明数组

获得s指向数组开头和结尾的指针

int a[3] = {1, 2, 3};
a;
&(a[0]);          //开头指针
std::begin(a);    // int*
std::cbegin(a);   // const int*a+3;
&(a[3]);          //结尾指针
std::end(a);
std::cend(a);     //end和cend指向数组最后一个元素的下一个元素

数组的其他操作

求元素个数

  • sizeof 对象的字节数(C语言常用)sizeof(a)/sizeof(int)

  • std::size(a); (推荐方法)

  • std::cend(a) - std::cbegin(a); 运行期操作 (编译器可以解决,不推荐)

数组的遍历

  • int a[3] = {1,2,3};
    size_t index = 0;
    while(index < std::size(a)){index = index + 1;
    }
    
  • int a[3] = {1,2,3};
    auto ptr = std::cbegin(a);
    while(ptr != std::cend(a)){ptr = ptr + 1;
    }
    
  • for(int x:a){//语法塘    c++insight可以查看  简化书写   C++11开始
    }
    

C字符串

字符串本质上也是数组

char str[] = "Hello"; //char[6] null-terminated string

auto ptr = str; //char*

隐式转化为指针类型,对字符串进行操作时寻找'\0'代表字符串结束

返回字符串长度

#include <cstring>
strlen(a);

多维数组

本质:数组的数组

int a[3][4];

聚合初始化

int a[][4] = {{1,2,3},{4,5,6,7}};

多维数组的索引和遍历

int x[3][4] = {1,2,3,4,5};
for(auto& p:x){for(auto q:p){std::cout<< q <<'\0';}
}

指针与多维数组

第2节 vector

C++标准库中定义的类模板

std::vector<int> x;

与内建数组相比,更侧重于易用性(性能差于内建数组)

  • 可复制、可在运行期动态改变个数

构造和初始化

  • 聚合初始化 std::vector<int> a = {1,2,3};
  • 其他 std::vector<int> a(3);

其他方法

  • 获取元素个数,判断是否为空

    std::vector<int> a = {1,2,3};
    a.size();                //输出元素个数
    a.empty();               //输出是否为空
    
  • 插入、删除元素

    a.push_back(2);          //结尾插入一个元素2
    a.pop_back();            //从结尾删除一个元素
    
  • vector的比较

元素的索引和遍历

  • []v.s.at at在索引超出时会报错,更加安全

  • begin/end函数 v.s. begin/end方法

    auto x = a.begin();
    auto y = a.end();         //返回一个iterator
    

迭代器iterator

  • 模拟指针的行为
  • 包含多种类别,每种类别支持的操作不同
  • vector对应随机访问迭代器
    • 解引用与下标访问 (*x) y[1]
    • 移动
    • 两个迭代器相减求距离
    • 两个迭代器比较

vector相关其他内容

添加元素可能使迭代器失效

多维vector

std::vector<std::vector<int>> x;
x.push_back(std::vector<int>());
x[0].push_back(1);
std::cout<<x[0][0]<<std::endl;std::vector<std::vector<int>> y = {{1,2,3},{4,5}};

.->

std::vector<int> x;
std::vector<int>* ptr = &x;
(*ptr).size();
ptr->size();          //语法塘 同上一行相同

第3节 string

C++标准库中定义的类模板,用于内建字符串的代替品

std::stringstd::basic_string<char>的别名

与内建字符串相比,更侧重于易用性

  • 可复制、在运行期动态改变字符串的个数

构造与初始化

#include <string>
std::string str = "Hello";
str = str + "!";
std::string str2 = "World";
std::string str3;
str3 = str + str2;

其他方法

  • 尺寸相关(size,empty)
  • 比较
  • 赋值
  • 拼接 (直接加)
  • 索引 str[2]
  • 转换为C字符串

auto ptr = str.c_str(); //返回一个char*类型的指针,指向null-terminated的字符数组的首元素地址

C++基础:第四章 数组、vector和字符串相关推荐

  1. 大学计算机ppt操作表格,大学计算机应用基础第四章 电子表格软件Exc.ppt

    大学计算机应用基础第四章 电子表格软件Exc.ppt (47页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 第四章电子表格Excel 20 ...

  2. 大学计算机基础第四章ppt,大学计算机基础第四章.ppt

    <大学计算机基础第四章.ppt>由会员分享,可在线阅读,更多相关<大学计算机基础第四章.ppt(38页珍藏版)>请在装配图网上搜索. 1.大学计算机基础 (第2版),第4章 数 ...

  3. 计算机软件基础第四章答案,计算机应用基础第四章

    <计算机应用基础第四章>由会员分享,可在线阅读,更多相关<计算机应用基础第四章(3页珍藏版)>请在人人文库网上搜索. 1.1[单选题]使图片按比例缩放应选用().窗体顶端A.拖 ...

  4. 第四章计算机基础,大学计算机基础第四章.ppt

    <大学计算机基础第四章.ppt>由会员分享,可在线阅读,更多相关<大学计算机基础第四章.ppt(38页珍藏版)>请在人人文库网上搜索. 1.大学电脑基础(版本2).第4章数据库 ...

  5. 二进制除法教程计算机基础,计算机应用基础第四章《二进制的学习》课件.ppt...

    <计算机应用基础第四章<二进制的学习>课件.ppt>由会员分享,可在线阅读,更多相关<计算机应用基础第四章<二进制的学习>课件.ppt(26页珍藏版)> ...

  6. JAVA基础第四章-集合框架Collection篇

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  7. Python学习入门基础 -- 第四章 列表、元组、字典、字符串变量使用、变量进阶

    Python基础入门知识点总结传送门 第一章 认识Python.Python常用集成开发环境PyCharm 第二章 注释.变量基本使用.变量的命名 第三章 运算符.判断if语句.while和for循环 ...

  8. Python基础——第四章:Python循环语句

    前言 本文是根据黑马程序员Python教程所作之笔记,目的是为了方便我本人以及广大同学们查漏补缺. 不想做笔记直接来我的频道.当然啦,自己的笔记才是最好的哦! PS:感谢黑马程序员! 教程链接:黑马程 ...

  9. 计算机硬件技术基础第四章ppt,管理N计算机硬件技术基础第4章.ppt

    资料来自网络,请保护知识产权,请您下载后勿作商用,只可学习交流使用.第4章 五.DVD驱动器 DVD光盘( Digital Video Disk) ①用于存放MPEG-2格式的数字视盘而诞生. ②DV ...

  10. 计算机软件基础第四章答案,2017计算机应用基础第四章word文字处理软件附答案.doc...

    第四章 word文字处理软件 一.判断题?共10题,20分 12分在打开的最近文档中,可以把常用文档进行固定而不被后续文档替换.( ) A对 B错 正确答案:?A?学生答案:?A 22分在word20 ...

最新文章

  1. is_uploaded_file函数引发的问题
  2. 云时代服务器端工程师必备 CDN 技能包
  3. 怎样去除excel表中的虚线_Excel教程:F1键强大的功能,你会用吗?
  4. ubuntu命令创建用户无法登入问题
  5. MySQL- SQL执行计划 统计SQL执行每阶段的耗时
  6. Intel Edision开发工具简介
  7. 软件设计模式之适配器模式(JAVA)
  8. iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例
  9. 备战蓝桥杯—枚举——[USACO Nov08]成交
  10. HTML基础知识点(1)
  11. Static 静态内部类
  12. 0302 GDB调试走起【给PHP写插件】
  13. flexsim怎么设置传送带方向_Flexsim仿真教程学习(六)-分拣系统
  14. 读书笔记-干法-永不言弃绝不妥协埋头苦干
  15. 自动化运维工具-ansible入门(一)
  16. Make sure that `gem install sqlite3 -v '*.*.*'`succeeds before bundling Error: 问题解决
  17. 【Java设计模式】组合模式
  18. 『矩阵论笔记』详解最小二乘法(矩阵形式求导)+Python实战
  19. 微交易平台搭建开发-盘内实时K线对接
  20. mysqlbug日记

热门文章

  1. JAVA JDK 、Maven、IDEA安装
  2. (Sublime Text 3)自动跳转到MATLAB运行程序
  3. Android:Toolbar的图标尺寸问题
  4. MORMOT的数据序列
  5. .net中序列化读写xml方法的总结
  6. 读懂金融危机必看的十四本书
  7. 微软面试4、在二元树中找出和为某一值的所有路径
  8. 程序员应该学会自我学习
  9. 因果推断综述及基础方法介绍(一)
  10. 五分钟快速了解EM算法