时习之

学而时习之,不亦说乎


  • 首页

  • 标签

  • 归档

  • 搜索

C++11 中的 emplace

发表于 2016-03-16 | 阅读次数:

最近读《C++ 标准库》这本书,发现C++11中大部分的容器对于添加元素除了传统的 insert 或者 pusb_back/push_front 之外都提供一个新的函数叫做 emplace。 比如如果你想要向 std::vector 的末尾添加一个数据,你可以:

1
2
std::vector<int> nums;
nums.push_back(1);

你也可以使用:

1
2
std::vector<int> nums;
nums.empace_back(1);

那么这两种方式的区别到底是什么呢?在《C++标准库》一书中没有给出解释,我查了一 下相关的资料,在此做一个总结。

阅读全文 »

C++中的聚合初始化

发表于 2016-03-13 | 阅读次数:

C++标准库中提供两个容器表示数组这个概念:array表示静态数组,vector表示动态数组 。这两个类型都可以使用列表初始化(list initilization)来初始化。

1
2
std::array<int, 5> = {1, 2, 3, 4, 5};
std::vector<int> = {1, 2, 3, 4, 5};

乍看上去没什么好奇怪的,毕竟都是 STL 中的容器,提供类似的初始化接口没有什么特 别的,而且 C++11 中提供的 initilizer_list 也让上面这种语法变得非常的普遍,接 受一个 initilizer_list 参数的构造函数甚至有一个专有术语 initializer-list constructor,比如vector就有这样一个构造函数:

1
2
vector( std::initializer_list<T> init,
const Allocator& alloc = Allocator() );

这一切看上去都合情合理,直到我发现,array 没有显式定义任何的构造函数。也就是 说它的这种初始化根本就没有用到 C++11 中的任何特性,你甚至可以在 C++98 中使用这 样的语法初始化它。

那么这一切又是如何做到的呢?答案是它使用了 C++ 的另一个特性:聚合初始化( aggregate initialization)。

阅读全文 »

C++中实现简单的Python风格字符串格式化函数

发表于 2016-03-10 | 阅读次数:

前一段时间学习 Python,被这门语言的便利性惊艳到了,比如你可以这样产生一个字 符串:

1
2
# output "hello world, PI is 3.14"
"{} world, PI is {}".format("hello", 3.14)

最近学习C++标准库,看到C++11新的变参模板,发现它可以用来实现一个简单的类似 Python 风格字符串格式化函数[^1],语法如下:。

1
2
// output "hello world, PI is 3.14"
FormateString("{} world, PI is {}", "hello", 3.14)

本文讲解一个非常简单的实现版本,不处理下面这样的语法:

1
2
// output "say you say me"
FormateString("{0} you {0} me", "say")

如果你需要一个丰富的字符串格式化功能,可以考虑使用cppformat这个库。

阅读全文 »

关于 C++ 11 初始化列表和转换构造函数

发表于 2016-03-09 | 阅读次数:

C++11 统一了原本各种乱七八糟的初始化规则,采用统一的大括号初始化,所以你可以像 下面这样初始化:

1
2
3
4
5
6
7
string  s;
string s = "hello world";
string* s = new string("hello world");

string s{};
string s = {"hello world"};
string* s = new string{"hello world"};

后面的三个大括号初始化都叫做列表初始化。C++ 初始化非常的复杂,详细信息可以参考 下面这个链接。

本文主要讨论 string s = {"hello world"} 这种类型的列表初始化和转换构造函数的 关系。

阅读全文 »

读书札记之 —— 《程序设计实践》

发表于 2016-02-29 | 阅读次数:

作者布拉恩.科尼汉(Brian W.Kernighan)是一座高山,难得一见的大师级的人物。C 语言圣经K&R中的 K 指的是他,awk 语言中的 K 也是他。它写过很多久负盛名 的书籍,比如《C程序设计语言》,《UNIX 编程环境》,《编程风格元素》和这本《程序 设计实践》。

大师写的书基本上都是一个基调,言简意赅,字字珠玑,简洁但不简单。这本书没有任何 的废话,从前言到附录,每一个部分都能让你受益匪浅。这本书很薄,却无所不包,分成 九个章节,每一章都讲述了程序设计环节中的重要问题。这本书可以和前阵子读的《程序 员修炼之道》相媲美,强烈推荐每个程序员认真的读一读(不管你是不是主要用C语言 做开发)

英雄所见通常略同,这本书和原来看过的很多书有重合,但是这本书讲的更加清晰明了。 这也体现了书名中的实践二字,这本书提到了很多其他书籍都泛泛而谈的金科玉律的实 践方式。

阅读全文 »

Python 正则表达式疑难点

发表于 2016-02-26 | 阅读次数:

^ 和 \A 以及 $ 和 \Z 的区别

Python 的文档中对于这几个的记号的含义解释如下:

  • ^

    Matches the start of the string, and in MULTILINE mode also matches immediately after each newline.

  • $

    Matches the end of the string or just before the newline at the end of the string, and in MULTILINE mode also matches before a newline. foo matches both ‘foo’ and ‘foobar’, while the regular expression foo$ matches only ‘ foo’. More interestingly, searching for foo.$ in ‘foo1\nfoo2\n’ matches ‘ foo2’ normally, but ‘foo1’ in MULTILINE mode; searching for a single $ in ‘foo\n’ will find two (empty) matches: one just before the newline, and one at the end of the string.

  • \A

    Matches only at the start of the string.

  • \Z

    Matches only at the end of the string.

从上面的文档看 $ 和 \Z 的含义只有在 MULTILINE 模式下才会有区别,比如说下面 的例子[^1]:

[^1]: 例子来自 stackoverflow

阅读全文 »

C++ 多态性继承和非多态性继承的区别

发表于 2016-02-24 | 阅读次数:

在 C++ 中多态的实现是以继承为基础的,但是这门语言的演化中继承早于多态出现,继承 不一定就意味着多态的使用^0。在后文中我把用于多态的继承称为多态性继承,不用于 多态的继承称为非多态性继承^1。

多态被称为面向对象编程的核心,可以比较确定的说在 C++ 中多态性的继承应该比非多态 性的常用的多。那么这两种继承模型之间主要区别是什么呢?这就是本文将要讨论的问题 。

注意:本文中讨论的关于C++ 多态性和非多态性继承区别并不是C++的一项准则而是一种 最佳实践。

阅读全文 »

读书札记之 —— 《黑客与画家》

发表于 2016-02-18 | 阅读次数:

这本书发人深省,作者思想深邃到让人不寒而栗,很多事情原来从来没有想过,作者以 他非凡的洞察力和缜密的逻辑思维把问题讲解的非常透彻,文字生动而幽默,一切都像故事 一样娓娓道来,让人欲罢不能。

作者保罗.格雷厄姆是硅谷的创业教父,整本书也可以说是写给创业者的指南,包括为什么 要去创业、如何找到创业的突破口、如何选择创业的技术、如何设计产品、如何开发产品等 等。

作者本身是一名黑客,和大多数黑客一样推崇极致。你需要进度的努力才可能会得到极大的 回报,才可能在创业的大浪淘沙中存活下来。

这是一本个人文集,里面充斥着各种个人的思考和偏好。作者以传销式的手法向你描述他对 于问题的看法。所以在阅读这本书之前请你先做好思想准备,也许读完之后,你就不在是你 了。

阅读全文 »

读书札记之 —— 《C++ 语言的设计和演化》

发表于 2016-02-17 | 阅读次数:

这本书讲述C++语言的设计和演化,可以让你对于C++的各种特性达到知其然更知其所以然的 境界。很遗憾,这本书没有读完,因为实在读不下去,原因是我比较作死的买了一本英文影 印版的旧书(目前市面上该书已经绝版),但是本贾尼的文法和用词习惯实在太过于高深, 我很艰难的读完了第一部分,却失去了读第二部分的勇气。以前太过自负了,以后读技术专 著有口碑不错的中文译本还是不要过于追求原滋原味的好。此外这本书是过年前几天开始阅 读,年后各种走亲访友,没有时间安心的看书,使得这本书的阅读过程断断续续的,最终也 就没有阅读下去的欲望了。

阅读全文 »

在C++类声明中为什么既包含接口又包含实现

发表于 2016-02-07 | 阅读次数:

包含接口和实现的类声明

C++备受一些人吐槽的一点是它在类的声明中既包含了实现细节又包含了接口细节,比如:

1
2
3
4
5
6
7
8
9
#include "Point.h"

class Circle {
public:
double Area(); // 接口
private:
double _radius; // 实现
Point _center; // 实现
};

这其中带来的很大的一个问题就是有时候即使只是改变类内容的实现细节(比如Point 类 定义发生了变化,或者把_radius变成 float 类型),类的用户也需要重新编译自己的程 序(这通常称为编译依赖),这一点让很多人难以接受。(当然还存在其他问题,比如用户 知道了实现细节就可以通过一些手段欺骗编译器,写出一些依赖实现而不是依赖接口的代码 )。

阅读全文 »
1…567…11
郭荣飞

郭荣飞

记录成长路上的点点滴滴

108 日志
33 标签
© 2018 郭荣飞
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4