《C++ primer(第5版)》读书笔记(持续更新)

第三章

  1. string是可变长字符串,vector是可变长集合,标准库定义了这些具有更高级性质的类型,它们尚未直接实现到计算机硬件中。(不像int和char)
  2. 头文件中不应该含有using声明,因为头文件的内容会拷贝到引用了它的文件中去,也许会造成意想不到的命名冲突。

string

  1. string s1 = “hiya”; 拷贝初始化(使用等号初始化一个变量时)string s2(“hiya”);直接初始化(不使用等号时)
  2. 希望保留输入的空白符时,要使用getline替代**>>**
  3. 假如heheda是一个string变量,getline(cin,heheda)会从cin流中读入内容,一直到换行符,同时换行符也读进来了,但是把所读内容存到heheda中时,没有把换行符存进去。(**触发getline返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符)
  4. 使用加号“+”运算符时,要注意两侧的运算对象至少有一个是string的。比如 string s = “hello” + “,”+s1;,这就是错误的,可以改成string s = “hello” +(","+s1);

vector

  1. vector是模板而非类型, string是一种类型
  2. vector能容纳绝大多数类型的对象作为元素,但是引用不是对象,所以不存在包含引用的vector
  3. 注意一些老的编译器,当vector的元素还是vector的时候,需要多加一个空格,示例如下:vector<vector<int> >
  4. vector使用的一般操作是:先定义一个空的vector对象,之后在运行时动态添加元素(比如push_back())
  5. 范围for语句是C++11的一个新特性,常用在遍历一个对象中的所有元素,但是在对vector使用时要注意,如果循环体内包含有向vector对象中添加元素的语句,是不能使用vector的,原因是范围for语句体内不应该改变其遍历序列的大小。
  6. 使用size_type(*.size()的返回值类型),要注意它是由那种类型定义的,string中的是string::size_type,而vector中的要使用如下形式:vector<int>::size_type ,不是 vector::size_type.
  7. vector和string的下标运算符能访问已经存在的元素,不能用于添加元素
  8. 确保下标合法的一种有效手段:尽可能使用范围for语句
  9. 列表初始化vs值初始化
	#include <vector>
	vector<int> ivec1{10,1};//ivec有两个元素,分别是10和1
	vector<int> ivec2(10,1);//ivec2有10个元素,每个元素都是1
	vector<int> ivec3{10}//ivec3有1个元素,是10
	vector<int> ivec4(10)//ivec4有10个元素,每个值默认初始化为0
	

迭代器 iterator

  1. 所有标准库容器都可以使用迭代器(严格来说,string对象不属于容器类型,但是string支持迭代器)
  2. 有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一位置
  3. begin()返回容器中的第一个元素;end()返回尾元素的下一个位置,仅是个标志,表示我们处理完了容器中的所有元素。如果对象为空,则begin()和end()指向相同。
  4. 因为end返回的迭代器并不实际指向某个元素,所以不能对其进行递增和解引用
  5. 泛型编程:C++喜欢用 != 而不是< ,喜欢用迭代器而不是下标, 因为这种编程风格在标准库提供的所有容器上都有效,但是并不是所有容器都有下标和大于、小于号,因此我们养成用 != 和迭代器的习惯,就不用太在意用的到底是哪种容器
  6. 迭代器的类型有两种,iterator(能读能写)和const_iterator(只能读)。如果vector对象或string对象是一个常量,那只能使用const_iterator;如果不是常量,那既能使用iterator也能使用const_iterator.
  7. cbegin()和cend()返回的迭代器类型都是const_iterator,而不会管调用他们的对象是不是常量类型。
  8. **但凡是使用了迭代器的循环体,都不要向容器中添加元素。**这一点和范围for循环很像。

数组

  1. 如果不清楚元素的确切个数,请使用vector。
  2. 数组可以通过标准库的begin和end获得开始指针尾后指针,但是毕竟数组不是类类型,因此这两个函数不是成员函数,不能用点操作符。正确使用方式如下:
int ia[] = {0,1,2};
int *beg = begin(ia);
int *end = end(ia);//end函数返回的是ia尾元素下一位置的指针
  1. 内置的下标运算符所用的索引值不是无符号类型(比如数组的下标可以是负数),这一点与vector和string不一样。
  2. 使用标准库string要比使用C风格字符串更安全、更高效。
//这段代码就很不安全,如果largeStr的空间不够,将引发严重错误
#include <cstring>
char largeStr[100];
char ca1[] = "abc";
char ca2[] = "def";
strcpy(largeStr,ca1);
strcat(largeStr," ");
strcat(largeStr,ca2);
  1. 混用string和C风格字符串:string的c_str()成员函数
string s("hello world!");
char *str = s;	//错误,不能用string对象初始化char*
const char *str = s.c_str();//正确

6.vector对象不能用来初始化数组,但是反过来是成立的,可以用数组初始化vector对象,比如下面的代码:

int int_arr[] = {0, 1, 2, 3, 4, 5};
vector<int> ivec(begin(int_arr),end(int_arr));//ivec中会有6个元素,分别是int_arr的对应副本
  1. 现代的C++程序应当尽量使用vector和迭代器避免使用内置数组和指针,因为使用数组和指针很容易出错,不论是概念上的还是语法上的。

多维数组

  1. 严格来说,C++语言中没有多维数组,通常说的多维数组其实是数组的数组,谨记这一点,对今后理解和使用多维数组大有益处。比如对下面代码的理解:
int a[3][4];//大小为3的数组,每个元素都是含有4个整数的数组
  1. 要使用范围for循环处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。(好好理解这个知识点)
### LaTeX 入门教程:TexLive 安装配置使用指南 #### 一、简介 LaTeX 是一种高质量的排版系统,特别适合用于生成科学和技术文档。对于希望深入了解并掌握这一工具的新手来说,了解如何安装和配置 TexLive 至关重要[^1]。 #### 二、TexLive 的下载与安装 为了能够顺利运行 LaTeX 文档编译工作流,在个人计算机上部署合适的 TeX 发行版本是非常必要的。推荐初学者采用官方发布的最新稳定版——即 TexLive 年度发行包作为首选方案之一。访问官方网站获取适用于不同操作系统的安装程序链接,并按照提示完成整个过程。 #### 三、编辑器的选择与设置 虽然可以利用记事本或其他纯文本编辑软件编写 .tex 文件,但对于提高工作效率而言,选用专业的 LaTeX 编辑环境会更加理想。例如 TeXstudio 就是一个不错的选择;它不仅界面友好而且功能强大,支持语法高亮显示以及即时预览等功能特性。初次启动应用程序时需确认已正确定位到 texlive 所在路径下各个可执行文件的位置,从而确保后续命令调用无误。 #### 四、基本概念学习 熟悉一些基础术语有助于更好地理解接下来要接触的内容: - **导言区**:位于 `\documentclass{}` 和 `\begin{document}` 之间的部分称为导言区,这里用来加载宏包(packages)、定义新命令等全局设定事项; - **正文区**:从 `\begin{document}` 开始直到结束标记之前的部分则构成了实际可见的文章主体结构。 另外还需注意区分两种主要模式下的输入方式差异: - **内部模式/水平模式**:处理普通段落文字排列; - **外部模式/垂直模式**:负责章节划分、列表项罗列等工作。 #### 五、常用命令介绍 以下是几个经常会被提及的基础指令及其作用说明: | 命令 | 描述 | |------------------|------------------------------------------------------------| | \section{} | 创建新的一级标题 | | \subsection{} | 创建新的二级标题 | | \textbf{} | 设置加粗字体 | | \emph{} | 斜体强调 | 更多高级特性和具体实现细节可以在官方手册或在线资源中进一步查阅。 ```latex \documentclass[a4paper,12pt]{article} % 导入所需宏包 \usepackage[utf8]{inputenc} % 支持UTF-8编码字符集 \usepackage[T1]{fontenc} % 字符编码转换表单 \usepackage{lmodern} % 加载Latin Modern系列字体库 \title{我的第一个LaTeX文档} \author{} \date{} \begin{document} \maketitle \section*{前言} 欢迎来到神奇的LaTeX世界! \end{document} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值