时习之

学而时习之,不亦说乎


  • 首页

  • 标签

  • 归档

  • 搜索

C++轮子——STL算法和迭代器

发表于 2018-04-13 | 阅读次数:

STL的六大组件中最主要的是容器和算法这两个,一个泛化数据的存储,一个泛化数据的操作。前面两篇文章我们简单的介绍了STL中的容器,这篇文章将会介绍STL算法以及粘合容器和算法的迭代器。STL是基于模板实现,容器基于模板类,而算法基于模板函数。在具体介绍算法和迭代器之前,我们先简单的回顾一下模板函数的语法。

阅读全文 »

一种跨平台的C/C++动态库的符号隐藏方式

发表于 2018-04-11 | 阅读次数:

什么是符号隐藏

在同一个文件中,如果有一些函数我们并不想要让外部访问,我们通常会添加 static 修饰符,把它设置为内部链接属性。

1
static void foo();

但是通常库不太可能是单文件组成,这些文件中有些是做接口给外部使用,有些则单纯的只是库的内部实现。对于外部使用者来说,内部实现的这些符号没有实际的作用,理论上我们完全可以像对待文件内部符号一样把它们统统隐藏掉。但是在语言层面我们并没有相关的语法用于表达这个概念(Java中的包访问权限和C#中的internal类似这个概念)。不同的编译器提供了不同的方式来完成这件事情,这篇文章总结了一种跨平台的处理方式。

阅读全文 »

C++轮子——STL关联容器

发表于 2018-03-23 | 阅读次数:

上一篇文章中我们简单的介绍了一下STL中的序列容器和容器适配器,这篇文章中我们将重点介绍STL中的关联容器(最后四个在概念上应该不是关联容器,但是因为和前面的容器联系太紧密,统一放在这里讲解),主要内容包括:

  • std::set
  • std::map
  • std::multi_map
  • std::multi_set
  • std::unordered_map
  • std::unordered_set
  • std::unordered_multimap
  • std::unordered_multiset
阅读全文 »

C++ const 到底表示什么

发表于 2018-03-14 | 阅读次数:

这两天在看《CLR via C#》一书,发现C#在语法上区分了常量和只读两个概念,使用const关键字表示常量,使用readonly关键字表示只读。我当时转念一想,C++中对应的const如何表达这两种概念呢?细思之下发现,C++里面这个问题比我想象中的要复杂很多,特意写一篇文章记录一下。

阅读全文 »

C++轮子 —— STL 序列容器

发表于 2018-02-25 | 阅读次数:

STL中大家最耳熟能详的可能就是容器,容器大致可以分为两类,序列型容器(SequenceContainer)和关联型容器(AssociativeContainer)这篇文章中将会重点介绍STL中的各种序列型容器和相关的容器适配器。主要内容包括

  • std::vector
  • std::array
  • std::deque
  • std::queue
  • std::stack
  • std::priority_queue
  • std::list
  • std::forward_list
阅读全文 »

C++轮子 —— STL 简介

发表于 2018-02-01 | 阅读次数:

大部分人提到 C++ 标准库的时候首先想到的就是STL,STL的全称是Standard Template Library,它背后的技术支撑是模板,由于很多人对于模板本身的不了解,导致很多人对于 STL的理解也非常的片面。有些人把STL等同于容器,有些人把STL等同于标准库。

C++支持非常多的编程范式【1】,C++标准库中用到的基本上是基于对象和泛型这两种(没错,标准库中面向对象其实非常少,没记错的话,只在异常体系中出现过),很明显STL不等同于C++标准库。那是不是说标准库中的泛型部分就属于STL呢?答案也是否定的。C++标准库中的大部分类都是泛型类,但是不是所有的泛型类都是STL,比如 std::string就属于泛型类,但是它不属于STL。

阅读全文 »

C++ 轮子系列

发表于 2018-01-30 | 阅读次数:

如果说我看得比别人更远些,那是因为我站在巨人的肩膀上

牛顿这句话非常契合现在的软件开发,因为基本上很少有人写的软件是从零开始。就我而 言,任何一项开发任务的迭代周期的起点都是了解已经存在的巨人。在C++的世界里其实有大量的轮子。这个系列的文章,主要总结一些我用过的比较好用的轮子,当时自己的一个学习笔记吧,我平时学习这些库的时候比较喜欢去翻一翻库的实现源码,所以这个系列的文章在涉及怎么用的同时也会涉及到如何实现。

主要内容包括:

  1. C++ 标准库
  2. 准标准库 – boost
  3. 其他库
阅读全文 »

C++ 常用库 —— JSON for Modern C++

发表于 2017-05-14 | 阅读次数:

JSON应该算是目前网络数据交换格式的事实标准,似乎没有那一种语言不存在支持这种数 据格式的库,C++也不例外。不过JSON虽然和语言无关,但是它毕竟源于动态语言,所以 在C++中,很多JSON库接口都不太自然。C++11引入的universal initialization和initializer list让一个拥有自然的接口的JSON库成为可能。这篇文章介绍的就是这样 一个库——JSON for Modern C++。我第一次见到这个库的时候有了使用动态语言的 感觉。

1
json array = {"hello", 1, 2.5, false, true, {1, 2}};

你没有看错,上面写的真的是C++的代码不是Python。这篇文章会介绍关于这个神奇的 JSON库的一些使用和实现上的细节,一起看看吧。

阅读全文 »

Linux 高效编程的一些总结

发表于 2017-05-14 | 阅读次数:

这篇文章总结了一些 Linux 下高效C++编程的工具。

阅读全文 »

匿名命名空间和 static 声明的区别

发表于 2017-03-19 | 阅读次数:

在C语言中,如果我们想要一个符号只在文件内部(严格来说是编译单元内部,也就是经 过预处理之后得到的源文件)可用,我们需要把它声明成static,比如:

1
2
3
// widget.cpp
static void internal_function() { }
static int internal_value = 10;

在C++中有一种推荐的等效做法——匿名的名字空间:

1
2
3
4
5
6
7
// widget.cpp
namespace {

void internal_function() {}
int internal_value = 10;

} // namespace

之所以推荐在C++使用匿名名字空间来取代static的这种用法的原因主要有下面三个:

  1. static的这个关键词的用途过多,比如你还可以用它声明静态成员,用它声明函数内 部的静态变量。

  2. static没有办法修饰一个类型,所以下面的代码不合法:

    1
    static struct Widget {}; // 不合法

    但是匿名命名空间可以:

    1
    2
    3
    namespace {
    struct Widget {}; // 合法
    } // namespace
  3. 某些模板的参数必须具有外部链接熟悉,比如下面的代码是不合法的

    1
    2
    3
    4
    5
    6
    7
    8
    template <typename T, const int& N>
    struct Array {
    T data[N];
    };

    static const int kMaxSize = 10;

    Array<int, kMaxSize> data; // 不合法,报错说 kMaxSize 没有外部的链接属性

虽然static关键字和匿名命名空间完成了类似是事情,但是这两者之间到底有什么本质 的区别呢?这篇文章的剩余部分会详细说明这个问题。

阅读全文 »
123…11
郭荣飞

郭荣飞

记录成长路上的点点滴滴

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