diff --git a/book/0-preface.md b/book/00-preface.md similarity index 99% rename from book/0-preface.md rename to book/00-preface.md index 0a0a3d1..c2929fd 100644 --- a/book/0-preface.md +++ b/book/00-preface.md @@ -1,4 +1,4 @@ -# 高速上手 C++ 11/14/17 +# 序言 ## 引言 @@ -36,4 +36,4 @@ C++17 则是近三年依赖 C++ 社区一致推进的方向,也指出了**现 知识共享许可协议 -本书系[欧长坤](https://github.com/changkun)著,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)。 \ No newline at end of file +本书系[欧长坤](https://github.com/changkun)著,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)。 diff --git a/book/01-intro.md b/book/01-intro.md index 830720d..eef1661 100644 --- a/book/01-intro.md +++ b/book/01-intro.md @@ -126,7 +126,7 @@ clean: 不必担心,本书的后续章节将为你介绍这一切。 -[返回目录](./toc.md) | [上一章](./0-preface.md) | [下一章:语言可用性强化](./02-usability.md) +[返回目录](./toc.md) | [上一章](./00-preface.md) | [下一章:语言可用性强化](./02-usability.md) ## 进一步阅读的参考文献 diff --git a/book/02-usability.md b/book/02-usability.md index b8cb441..1115302 100644 --- a/book/02-usability.md +++ b/book/02-usability.md @@ -1,4 +1,4 @@ -# 第二章 语言可用性的强化 +# 第 2 章 语言可用性的强化 [TOC] @@ -743,7 +743,7 @@ int main() { > 事实上,有时候我们虽然使用了变参模板,却不一定需要对参数做逐个遍历,我们可以利用 `std::bind` 及完美转发等特性实现对函数和参数的绑定,从而达到成功调用的目的。 -> 关于这方面的使用技巧,请参考习题。~~可以通过项目课:[100 行 C++ 代码实现线程池](https://www.shiyanlou.com/teacher/courses/565) 进行进一步巩固学习。~~ +> 关于这方面的使用技巧,请参考习题,TODO ### 折叠表达式 diff --git a/book/03-runtime.md b/book/03-runtime.md index defad48..f4bc48f 100644 --- a/book/03-runtime.md +++ b/book/03-runtime.md @@ -1,4 +1,4 @@ -# 第三章 语言运行期的强化 +# 第 3 章 语言运行期的强化 > 内容修订中 diff --git a/book/04-containers.md b/book/04-containers.md index d6a52f5..9c4504a 100644 --- a/book/04-containers.md +++ b/book/04-containers.md @@ -1,4 +1,4 @@ -# 第四章 对标准库的扩充:新增容器 +# 第 4 章 对标准库的扩充:新增容器 > 内容修订中 diff --git a/book/05-pointers.md b/book/05-pointers.md index da200b8..4e24691 100644 --- a/book/05-pointers.md +++ b/book/05-pointers.md @@ -1,4 +1,4 @@ -# 第五章 对标准库的扩充:引用计数与智能指针 +# 第 5 章 对标准库的扩充:引用计数与智能指针 > 内容修订中 diff --git a/book/06-regex.md b/book/06-regex.md index 538a697..bbae63c 100644 --- a/book/06-regex.md +++ b/book/06-regex.md @@ -1,4 +1,4 @@ -# 第六章 正则表达式库 +# 第 6 章 正则表达式库 > 内容修订中 @@ -38,18 +38,18 @@ 特殊字符是正则表达式里有特殊含义的字符,也是正则表达式的核心匹配语法。参见下表: |特别字符|描述| -|:--:|:--| -|`$`| 匹配输入字符串的结尾位置。| -|`(`,`)`| 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。| -|`*`| 匹配前面的子表达式零次或多次。| -|`+`| 匹配前面的子表达式一次或多次。| -|`.`| 匹配除换行符 `\n` 之外的任何单字符。| -|`[`| 标记一个中括号表达式的开始。| -|`?`| 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。| -| `\`| 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, `n` 匹配字符 `n`。`\n` 匹配换行符。序列 `\\` 匹配 `'\'` 字符,而 `\(` 则匹配 `'('` 字符。| -|`^`| 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。| -|`{`| 标记限定符表达式的开始。| -|`\`| 指明两项之间的一个选择。| +|:---:|:------------------------------------------------------| +|`$`| 匹配输入字符串的结尾位置。| +|`(`,`)`| 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。| +|`*`| 匹配前面的子表达式零次或多次。| +|`+`| 匹配前面的子表达式一次或多次。| +|`.`| 匹配除换行符 `\n` 之外的任何单字符。| +|`[`| 标记一个中括号表达式的开始。| +|`?`| 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。| +| `\`| 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, `n` 匹配字符 `n`。`\n` 匹配换行符。序列 `\\` 匹配 `'\'` 字符,而 `\(` 则匹配 `'('` 字符。| +|`^`| 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。| +|`{`| 标记限定符表达式的开始。| +|`\`| 指明两项之间的一个选择。| ### 限定符 @@ -57,7 +57,7 @@ |字符|描述| -|:--:|:--| +|:---:|:------------------------------------------------------| |`*`|匹配前面的子表达式零次或多次。例如,`foo*` 能匹配 `fo` 以及 `foooo`。`*` 等价于`{0,}`。| |`+`|匹配前面的子表达式一次或多次。例如,`foo+` 能匹配 `foo` 以及 `foooo`,但不能匹配 `fo`。`+` 等价于 `{1,}`。| |`?`|匹配前面的子表达式零次或一次。例如,`Your(s)?` 可以匹配 `Your` 或 `Yours` 中的`Your` 。`?` 等价于 `{0,1}`。| @@ -79,7 +79,7 @@ C++11 提供的正则表达式库操作 `std::string` 对象,模式 `std::rege - `[a-z]+\.txt`: 在这个正则表达式中, `[a-z]` 表示匹配一个小写字母, `+` 可以使前面的表达式匹配多次,因此 `[a-z]+` 能够匹配一个小写字母组成的字符串。在正则表达式中一个 `.` 表示匹配任意字符,而 `\.` 则表示匹配字符 `.`,最后的 `txt` 表示严格匹配 `txt` 则三个字母。因此这个正则表达式的所要匹配的内容就是由纯小写字母组成的文本文件。 -`std::regex_match` 用于匹配字符串和正则表达式,有很多不同的重载形式。最简单的一个形式就是传入`std::string` 以及一个 `std::regex` 进行匹配,当匹配成功时,会返回 `true`,否则返回 `false`。例如: +`std::regex_match` 用于匹配字符串和正则表达式,有很多不同的重载形式。最简单的一个形式就是传入 `std::string` 以及一个 `std::regex` 进行匹配,当匹配成功时,会返回 `true`,否则返回 `false`。例如: ```cpp #include @@ -132,9 +132,7 @@ bar.txt sub-match[1]: bar 本节简单介绍了正则表达式本身,然后根据使用正则表达式的主要需求,通过一个实际的例子介绍了正则表达式库的使用。 -> 本节提到的内容足以让我们开发编写一个简单的 Web 框架中关于URL匹配的功能。 - -> ~~关于这方面的开发和细节,可以通过项目课:[C++ 开发 Web 服务框架](https://www.shiyanlou.com/courses/568) 进行进一步学习。~~ TODO: 将这部分内容补充为习题 +> 本节提到的内容足以让我们开发编写一个简单的 Web 框架中关于URL匹配的功能,请参考习题 TODO ## 进一步阅读的参考资料 diff --git a/book/07-thread.md b/book/07-thread.md index acab395..abbbdcb 100644 --- a/book/07-thread.md +++ b/book/07-thread.md @@ -1,4 +1,4 @@ -# 第七章 语言级线程支持 +# 第 7 章 语言级线程支持 > 内容修订中 @@ -171,9 +171,7 @@ consumer.join(); C++11 语言层提供了并发编程的相关支持,本节简单的介绍了 `std::thread`/`std::mutex`/`std::future` 这些并发编程中不可回避的重要工具。 -> 本节提到的内容足以让我们使用不超过 100 行代码编写一个简单的线程池库 -> -> ~~关于这方面的使用技巧,可以通过项目课:[100 行 C++ 代码实现线程池](https://www.shiyanlou.com/teacher/courses/565) 进行进一步巩固学习。~~ TODO: 将这部分内容补充为习题 +> 本节提到的内容足以让我们使用不超过 100 行代码编写一个简单的线程池库,请参考习题 TODO ## 进一步阅读的参考资料 diff --git a/book/08-filesystem.md b/book/08-filesystem.md index a01ec2f..12d4865 100644 --- a/book/08-filesystem.md +++ b/book/08-filesystem.md @@ -1,3 +1,3 @@ -# 第八章 标准库: 文件系统 +# 第 8 章 标准库: 文件系统 -> TODO: 这部分内容为 C++17 新增 \ No newline at end of file +> TODO: 这部分内容为 C++17 新增 diff --git a/book/09-others.md b/book/09-others.md index b88001e..0e79abd 100644 --- a/book/09-others.md +++ b/book/09-others.md @@ -1,4 +1,4 @@ -# 第九章 其他杂项 +# 第 9 章 其他杂项 > 内容修订中 diff --git a/book/10-cpp20.md b/book/10-cpp20.md index 5ec6c8e..7f424e2 100644 --- a/book/10-cpp20.md +++ b/book/10-cpp20.md @@ -1,4 +1,4 @@ -# 第九章 展望: C++20 简介 +# 第 10 章 展望: C++20 简介 > 内容修订中, 目前内容为第一版中对 C++17 的展望 diff --git a/book/appendix.md b/book/appendix.md index 2e33861..a31811b 100644 --- a/book/appendix.md +++ b/book/appendix.md @@ -8,3 +8,9 @@ - [CppCon YouTube 频道](https://www.youtube.com/user/CppCon/videos) - [每位程序员都需要知道的内存知识](https://people.freebsd.org/~lstewart/articles/cpumemory.pdf) - 待补充 + +## 许可 + +知识共享许可协议 + +本书系[欧长坤](https://github.com/changkun)著,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)。 \ No newline at end of file diff --git a/book/toc.md b/book/toc.md index 9744b22..cbffc5c 100644 --- a/book/toc.md +++ b/book/toc.md @@ -4,7 +4,7 @@ ## 目录 -- [**序言**](./0-preface.md) +- [**序言**](./00-preface.md) - [**第 1 章 迈向 C++11/14/17**](./01-intro.md) + 1.1 被弃用的特性 + 1.2 与 C 的兼容性 diff --git a/pdf/Makefile b/pdf/Makefile new file mode 100644 index 0000000..040959f --- /dev/null +++ b/pdf/Makefile @@ -0,0 +1,28 @@ +title = '高速上手 C++11/14/17' +filename = 'modern-cpp-tutorial' +outputname='modern-cpp-tutorial' + +all: pdf + +pdf: markdown + @echo "Compiling PDF file..." + @pandoc -s $(filename).md -o $(filename).pdf \ + --title-prefix $(title) \ + --listings -H meta/cpp-listings.tex \ + --template=meta/template.tex \ + --normalize \ + --smart \ + --latex-engine=`which xelatex` + @echo "Done." + @rm *.md + +markdown: + @echo "Copy markdown files..." + @cp -r ../book/* . + @echo "Aggregating markdown files..." + @python3 aggregator.py + +clean: + rm -rf *.md *.pdf + +.PHONY: markdown pdf clean \ No newline at end of file diff --git a/pdf/aggregator.py b/pdf/aggregator.py new file mode 100755 index 0000000..39cec9a --- /dev/null +++ b/pdf/aggregator.py @@ -0,0 +1,22 @@ +# !/usr/bin/env python3 +# author: changkun + +chapters = ['00-preface.md', '01-intro.md', '02-usability.md', '03-runtime.md', '04-containers.md', '05-pointers.md', '06-regex.md', '07-thread.md', '08-filesystem.md', '09-others.md', '10-cpp20.md', 'appendix.md'] + +ignores = ['TOC', '返回目录', '许可', 'license'] + +with open('modern-cpp-tutorial.md', 'w') as outfile: + outfile.write("""--- +title: "高速上手 C++11/14/17" +author: 欧长坤 +copyright: cc-by-nc-nd 4.0 +--- +""") + for chapter in chapters: + with open(chapter) as ch: + outfile.write('\n') + for line in ch: + if any(keyword in line for keyword in ignores): + continue + else: + outfile.write(line) \ No newline at end of file diff --git a/pdf/meta/cpp-listings.tex b/pdf/meta/cpp-listings.tex new file mode 100644 index 0000000..c57fcda --- /dev/null +++ b/pdf/meta/cpp-listings.tex @@ -0,0 +1,26 @@ + +\usepackage{xcolor} + +\definecolor{keyword}{HTML}{BA2CA3} +\definecolor{string}{HTML}{D12F1B} +\definecolor{comment}{HTML}{008400} + +\lstset{ + basicstyle={\small\ttfamily}, + keywordstyle={\color[rgb]{0.13,0.29,0.53}\bfseries}, + breaklines=true, + emphstyle={\bfseries\color{Rhodamine}}, + commentstyle={\color[rgb]{0.56,0.35,0.01}\itshape}, + stringstyle={\color[rgb]{0.31,0.60,0.02}}, + showstringspaces=false, + frame=shadowbox, + breakatwhitespace=false, + captionpos=b, + extendedchars=true, + keepspaces=true, + numbers=left, + numberstyle=\tiny, + rulecolor=\color{black}, + rulesepcolor={\color{blue!20!white}}, + showspaces=false, +} diff --git a/pdf/meta/template.tex b/pdf/meta/template.tex new file mode 100644 index 0000000..9026a6e --- /dev/null +++ b/pdf/meta/template.tex @@ -0,0 +1,218 @@ +\documentclass[a4paper, 10pt]{ctexart} +\usepackage{geometry} +\geometry{ + top=1in, + inner=1in, + outer=1in, + bottom=1in, + headheight=3ex, + headsep=2ex +} +\usepackage{tabu} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{booktabs} +\usepackage{amssymb,amsmath} +\usepackage{ifxetex,ifluatex} + +\linespread{1.2}\selectfont % 行距 +\XeTeXlinebreaklocale "zh" % 针对中文自动换行 +\XeTeXlinebreakskip = 0pt plus 1pt % 字与字之间加入 0pt 至 1pt 的间距,确保左右对齐 +\parindent 0em % 段落缩进 +\setlength{\parskip}{20pt} % 段落间距 +\ifxetex + \usepackage{xltxtra,xunicode} +\fi +$if(mainfont)$ + \setmainfont{$mainfont$} +$endif$ +$if(sansfont)$ + \setsansfont{$sansfont$} +$endif$ +$if(monofont)$ + \setmonofont{$monofont$} +$endif$ +$if(mathfont)$ + \setmathfont{$mathfont$} +$endif$ + +% use microtype if available +\IfFileExists{microtype.sty}{\usepackage{microtype}}{} +$if(geometry)$ +\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} +$endif$ +$if(natbib)$ +\usepackage{natbib} +\bibliographystyle{plainnat} +$endif$ +$if(biblatex)$ +\usepackage{biblatex} +$if(biblio-files)$ +\bibliography{$biblio-files$} +$endif$ +$endif$ +$if(listings)$ +\usepackage{listings} +$endif$ +$if(lhs)$ +\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{} +$endif$ +$if(highlighting-macros)$ +$highlighting-macros$ +$endif$ +$if(verbatim-in-note)$ +\usepackage{fancyvrb} +$endif$ +$if(tables)$ +\usepackage{longtable} +$endif$ + +\usepackage{graphicx} +\usepackage{caption} + +% We will generate all images so they have a width \maxwidth. This means +% that they will get their normal width if they fit onto the page, but +% are scaled down if they would overflow the margins. +\makeatletter +\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth +\else\Gin@nat@width\fi} +\makeatother +\let\Oldincludegraphics\includegraphics +\renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=0.7\maxwidth]{#1}} +\ifxetex + \usepackage[setpagesize=false, % page size defined by xetex + unicode=false, % unicode breaks when used with xetex + xetex]{hyperref} +\else + \usepackage[unicode=true]{hyperref} +\fi +\hypersetup{breaklinks=true, + bookmarks=true, + pdfauthor={$author-meta$}, + pdftitle={$title-meta$}, + colorlinks=true, + urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$, + linkcolor=$if(linkcolor)$$linkcolor$$else$magenta$endif$, + pdfborder={0 0 0}} +\urlstyle{same} % don't use monospace font for urls +$if(links-as-notes)$ +% Make links footnotes instead of hotlinks: +\renewcommand{\href}[2]{#2\footnote{\url{#1}}} +$endif$ +$if(strikeout)$ +\usepackage[normalem]{ulem} +% avoid problems with \sout in headers with hyperref: +\pdfstringdefDisableCommands{\renewcommand{\sout}{}} +$endif$ +\setlength{\parindent}{10pt} +%\setlength{\parskip}{6pt plus 2pt minus 1pt} +\setlength{\emergencystretch}{3em} % prevent overfull lines +\usepackage{titling} +%\setlength{\droptitle}{-8em} % 将标题移动至页面上方 + +\usepackage{fancyhdr} +\usepackage{lastpage} +\pagestyle{fancyplain} + +$if(numbersections)$ +\setcounter{secnumdepth}{5} +$else$ +\setcounter{secnumdepth}{0} +$endif$ +$if(verbatim-in-note)$ +\VerbatimFootnotes % allows verbatim text in footnotes +$endif$ +$if(lang)$ +\ifxetex + \usepackage{polyglossia} + \setmainlanguage{$mainlang$} +\else + \usepackage[$lang$]{babel} +\fi +$endif$ +$for(header-includes)$ +$header-includes$ +$endfor$ + +$if(title)$ +\title{$title$} +$endif$ +\author{$for(author)$$author$$sep$ \and $endfor$} +\date{$date$} + +%%%% 段落首行缩进两个字 %%%% +\makeatletter +\let\@afterindentfalse\@afterindenttrue +\@afterindenttrue +\makeatother +\setlength{\parindent}{2em} %中文缩进两个汉字位 + +%%%% 下面的命令设置行间距与段落间距 %%%% +\linespread{1.4} +\setlength{\parskip}{1ex} +\setlength{\parskip}{0.5\baselineskip} + + +\begin{document} + +\newcommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} + +\thispagestyle{plain} +\begin{center} + + {\LARGE\textbf{高速上手 C++11/14/17}} + + \vspace{1em} + {\large 欧长坤 (hi@changkun.us)} + + \vspace{1ex} + 最后更新 \today + + \vspace{1em} + \textbf{\large 版权声明} + + \noindent 本书系\href{https://github.com/changkun}{欧长坤}著,采用“知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (cc by-nc-sa)”进行许可。\texttt{\small http://creativecommons.org/licenses/by-nc-nd/4.0/} + + \vspace{8em} + \includegraphics{../assets/cover-2nd.png} + +\end{center} + +$for(include-before)$ +$include-before$ + +$endfor$ + +{ +\newpage +\hypersetup{linkcolor=black} +\setcounter{tocdepth}{3} +\tableofcontents +} +\newpage + +$body$ + +$if(natbib)$ +$if(biblio-files)$ +$if(biblio-title)$ +$if(book-class)$ +\renewcommand\bibname{$biblio-title$} +$else$ +\renewcommand\refname{$biblio-title$} +$endif$ +$endif$ +\bibliography{$biblio-files$} + +$endif$ +$endif$ +$if(biblatex)$ +\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ + +$endif$ +$for(include-after)$ +$include-after$ + +$endfor$ +\end{document} \ No newline at end of file diff --git a/pdf/modern-cpp-tutorial.pdf b/pdf/modern-cpp-tutorial.pdf new file mode 100644 index 0000000..f466f8c Binary files /dev/null and b/pdf/modern-cpp-tutorial.pdf differ