学习C++ Primer 的个人理解(三)

时间:2022-12-27 11:25:53

第三章,主要内容是字符串和数组。感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想。

在我看来,这种内容的难度并不大。

对于编程来说,最重要的应该是思想,类似vector的各种操作,读者仅仅只需要知道vector可以做这些操作,真正用到的时候,能够想起来,再去查就好了。

在看《UNIX环境高级编程》的时候,各种系统调用,不可能每一个都记得熟,所以我认为这种只需要知道“可以这么做“就行了,用到的时候再查,久而久之自然就熟悉了。

然而关键的是为什么,比如为什么要使用迭代器,为什么vector使用push_back操作效率会比插入高。理解这些比死记硬背重要的多。


在之前的代码里,我们为了输入输出往往都会这么做:

  std::cout << "hello,world"<<std::endl;

这里的std是一个命名空间,意义是:编译器将从 :: 左边的作用域寻找右侧的名字。

每次都这样会比较繁琐。

这时候我们可以这么做:

  using std::cout;

这样声明之后,再使用cout的时候就不需要使用作用域操作符了。

其他对象同理。

头文件中,不应包含using声明,会无意间将声明包含到其文件中,从而引发冲突。


标准库string

  string 表示 可变长的字符序列 。 使用string 需要包含头文件 string.h

  默认初始化的strin类型变量的值会是一个 空串。

  

  直接初始化和拷贝初始化

    简单的说,使用 = 号 初始化一个变量,执行的是拷贝初始化。相当于把右侧的值拷贝到新创建的对象中去。

    不使用 = 号执行的是直接初始化。

  string对象上的操作

    输入输出方面基本与基本类型相似,但string是一个字符串。所以需要注意:

    string s;

    cin >> s    //  遇到空白停止

    如果要读取整一行需要使用 getline()

    

    string的empty和size

      empty根据字符串是否为空返回布尔值

      size返回字符串的长度(字符个数)

    string::size_type类型

      这是一个与机器无关的配套类型, 具体使用的时候需要指定作用域,如:

        string::size_type

      string调用size()方法返回的值就是string::size_type类型

    范围for语句

      类似于java中的增强for循环。

      对于序列型的对象特别好用。

      其语法是:

        for ( declaration : expression)

          statement

   类似数组,sring对象也支持下标运算。其中下标运算符接收的参数是 string::size_type类型。并且注意下标不能超过范围。


  标准库类型vector

    如果说string是存放字符的序列,那么vector就是存放对象的序列。(严格来说不能这样理解)

    要使用vector,必须包含 vector头文件

    vector实际上是一个类模板,在第16章才会学习如何自定义模板

    在声明定义vector的时候,我们必须提供vector内存放对象的类型,如:

      vector<int> a;

      vector<string> s;

      vector<vector<int>> b

    由于引用不是对象,所以vector不能包含引用。

  定义与初始化vector  

    这里需要注意的是,如果要使用另一个对象为对象进行初始化。其类型必须完全一致。

    要区分好花括号和括号的区别。

  向vector对象中添加元素

    使用push_back来向其中添加元素。

  其他vector操作

    大多与string类似。

     vector不允许使用下标添加新值,只允许访问已存在的下标。(string也是)

    关于vector更详细的说明会在后面的章节介绍。

迭代器

  迭代器提供了对对象的间接访问。所有的标准库容器都可以使用迭代器,严格来说string并不属于迭代器,但string也可以使用迭代器。

  使用迭代器

    支持迭代器的容器都拥有返回迭代器的成员,名为 begin 和 end

    begin负责返回第一个元素,end负责返回尾元素的下一位置

    在容器为空的时候,begin和end返回的是同一个迭代器。

  迭代器类型

    begin 和 end 的返回具体类型由对象是否是常量决定。

    如果想手动得到const_iterator类型的返回值,可以使用 cbegin  和  cend。

  迭代器运算

    可以使两个迭代器相减。得到的是两个迭代器的距离。其类型是:difference_type

    和指针类似,也能通过解引用获取它所指的元素。

   迭代器类型

     如:

      vector<int> :: iterator it; // 只能读写 vector<int>的元素

      string::iterator it2;        //只能读写string对象昂的字符

      vector<int>::const_iterator it3 // 能读取不能修改。


 数组

    数组也是一种复合类型。

    声明形式如:a[d]

    d是数组的维度,意味着数组中元素的个数。必须大于0。维度必须是一个常量表达式。

    初始化数组可以直接显式的列表初始化。

    

    字符数组的特殊性

      需要注意字符数组必须以‘\0'结尾 。

    数组不允许拷贝和赋值;

      int a[] = {0,1,2};

      int a2[] = a;    错误

      a2 = a;     错误

    复杂的数组声明

      int *ptrs[10]     含有10个整型指针的数组

      int (*parray)[10] = &arr   Parray指向一个含有10个整数的数组

    

    

      

学习C++ Primer 的个人理解(三)的更多相关文章

  1. 学习C&plus;&plus; Primer 的个人理解(九)

    这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很 ...

  2. 学习C&plus;&plus; Primer 的个人理解(二)

    本身就一定基础的读者我想变量常量这些概念应该已经不是问题了.但是本章还是有几个重点,需要特别留意一下的: 1.初始化和赋值是不同的操作 2.任何非0值都是true 3.使用新标准列表初始化,在有丢失精 ...

  3. 学习C&plus;&plus; Primer 的个人理解(一)

    <C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐&lt ...

  4. 学习C&plus;&plus; Primer 的个人理解(八)

    结束了第一部分,在最后的第七章,我只简单的总结了一下,因为后面还会更详细的说明有关类的内容.而且说实在的这一张的内容让我很不舒服,验证了本书实际上有许多内容是作者的学生一起拼凑而成的.第七章结构给我感 ...

  5. 学习C&plus;&plus; Primer 的个人理解(零)

    由于自己看书之后经常容易忘记细节,所以写在博客上让我自己的思路更加清晰一些. 我的博客仅仅只是将书中的内容概括一下,有一些不好理解的部分我会用我自己理解的方式使用大白话写出来. 仅此而已.

  6. 学习C&plus;&plus; Primer 的个人理解(十二)

    动态内存与智能指针 在C++中, 动态内存用 new来分配空间并返回一个指向该对象的指针 用delete来销毁. 由于手动的对动态内存进行操作容易出现问题.所以新的标准库提供了两种智能指针. 智能指针 ...

  7. 学习C&plus;&plus; Primer 的个人理解(十一)

    关联容器 就像是个字典, 其元素是 键 - 值 对. 关键字起到索引作用. 有序: map:关联数组:保存 健-值 对 set : 关键字既是值. multimap : 关键字可重复出现的map mu ...

  8. 学习C&plus;&plus; Primer 的个人理解(十)

    标准库没有给每个容器都定义成员函数来实现 查找,替换等操作.而是定义了一组泛型算法,他们可以用于不同类型的元素或多种容器类型. 迭代器令算法不依赖与容器 算法永远不会执行容器的操作 算法本身不会执行容 ...

  9. 学习C&plus;&plus; Primer 的个人理解(七)

    类,后面还有两章是介绍有关于类的内容的.这一张依然只是个概括.但也已经将大致用法介绍完了. 重点如下: 1.成员函数的声明,必须在类的内部. 2.引用const成员函数 我们知道成员函数中有一个名为t ...

随机推荐

  1. WinForm 对Web Api 增 册 改 查 的基本操作

    WebApi代码: public class ValuesController : ApiController { Entities db=new Entities(); // GET api/val ...

  2. Cocos2d-x SpriteFrameCache的使用

    根据官方文档与其他c++属性实现的类似书中示例: 图中的小人是会动的. 首先使用texturepacker制作出一张拼图,导出plist等文件: plist类似: 3.x的cocos似乎不再鼓励使用什 ...

  3. PS要点

    1.通道 意味着我们同过不同的角度来看图像,可以得到不同的图像信息,PS是以灰度图像来表现这种信息的强弱. 我们能看到什么取决于我们的视角.任何灰度图像都可以按照不同的规则来构成彩色图像. 通道除了能 ...

  4. MD5算法-爬虫学习(五)

    在实现爬虫的时候,我们使用Hash结构去存储我们用过的URL的时候,有些URL可能长度很长,为了更加节省空间,我们就要对URL进行压缩,帮它减减肥,这个我们介绍这个MD5算法,可以对URL进行有效的压 ...

  5. mysql 命令备份

    导出要用到MySQL的mysqldump工具,基本用法是:    shell> mysqldump [OPTIONS] database [tables]    如果你不给定任何表,整个数据库将 ...

  6. Laravel笔记目录

    一.MVC 1.路由 2.控制器与视图 3.控制器与路由的绑定 4.中间件 二.模式与数据库 1.数据库迁移 2.填充测试数据 3.ORM入门 4.分页 三.Laravel的生命周期 1.Larave ...

  7. Java并发编程--线程池

    1.ThreadPoolExecutor类 java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,下面我们来看一下ThreadPoolExecuto ...

  8. Java Random介绍

    一.简介 Random类位于java.util包下,此类的实例用于生成伪随机数流.之所以称之为伪随机,是因为真正意义上的随机数(或者称为随机事件)在某次产生过程中是按照实验过程表现的分布概率随机产生的 ...

  9. RedHat 5&period;6 问题简记

    1.XDMCP协议 使用XDMCP协议,需要配置“远程屏幕”(禁用+简介模式+与本地模式相同),注意不是"远程桌面"(这就是VNCServer). XDMCP协议与VNC协议的本质 ...

  10. 【转发】Cookie存储的值大小限制和个数问题

    Cookie以及LocalStorage.SessionStorage的区别 缓存机制对于用户访问网页来说是很方便的.如果将用户名,偏好设定或者其他一些数据存储到客户端,而不必每次访问网页都输入数据, ...