STL的六大组件中最主要的是容器和算法这两个,一个泛化数据的存储,一个泛化数据的操作。前面两篇文章我们简单的介绍了STL中的容器,这篇文章将会介绍STL算法以及粘合容器和算法的迭代器。STL是基于模板实现,容器基于模板类,而算法基于模板函数。在具体介绍算法和迭代器之前,我们先简单的回顾一下模板函数的语法。
一种跨平台的C/C++动态库的符号隐藏方式
C++轮子——STL关联容器
上一篇文章中我们简单的介绍了一下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 到底表示什么
这两天在看《CLR via C#》一书,发现C#在语法上区分了常量和只读两个概念,使用const
关键字表示常量,使用readonly
关键字表示只读。我当时转念一想,C++中对应的const
如何表达这两种概念呢?细思之下发现,C++里面这个问题比我想象中的要复杂很多,特意写一篇文章记录一下。
C++轮子 —— STL 序列容器
STL中大家最耳熟能详的可能就是容器,容器大致可以分为两类,序列型容器(SequenceContainer)和关联型容器(AssociativeContainer)这篇文章中将会重点介绍STL中的各种序列型容器和相关的容器适配器。主要内容包括
- std::vector
- std::array
- std::deque
- std::queue
- std::stack
- std::priority_queue
- std::list
- std::forward_list
C++轮子 —— STL 简介
大部分人提到 C++ 标准库的时候首先想到的就是STL
,STL
的全称是Standard Template Library
,它背后的技术支撑是模板,由于很多人对于模板本身的不了解,导致很多人对于 STL
的理解也非常的片面。有些人把STL
等同于容器,有些人把STL
等同于标准库。
C++支持非常多的编程范式【1】,C++标准库中用到的基本上是基于对象和泛型这两种(没错,标准库中面向对象其实非常少,没记错的话,只在异常体系中出现过),很明显STL
不等同于C++标准库。那是不是说标准库中的泛型部分就属于STL
呢?答案也是否定的。C++标准库中的大部分类都是泛型类,但是不是所有的泛型类都是STL
,比如
std::string
就属于泛型类,但是它不属于STL
。
C++ 常用库 —— JSON for Modern C++
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
库的一些使用和实现上的细节,一起看看吧。
匿名命名空间和 static 声明的区别
在C
语言中,如果我们想要一个符号只在文件内部(严格来说是编译单元内部,也就是经
过预处理之后得到的源文件)可用,我们需要把它声明成static
,比如:
1 | // widget.cpp |
在C++
中有一种推荐的等效做法——匿名的名字空间:
1 | // widget.cpp |
之所以推荐在C++
使用匿名名字空间来取代static
的这种用法的原因主要有下面三个:
static
的这个关键词的用途过多,比如你还可以用它声明静态成员,用它声明函数内 部的静态变量。static
没有办法修饰一个类型,所以下面的代码不合法:1
static struct Widget {}; // 不合法
但是匿名命名空间可以:
1
2
3namespace {
struct Widget {}; // 合法
} // namespace某些模板的参数必须具有外部链接熟悉,比如下面的代码是不合法的
1
2
3
4
5
6
7
8template <typename T, const int& N>
struct Array {
T data[N];
};
static const int kMaxSize = 10;
Array<int, kMaxSize> data; // 不合法,报错说 kMaxSize 没有外部的链接属性
虽然static
关键字和匿名命名空间
完成了类似是事情,但是这两者之间到底有什么本质
的区别呢?这篇文章的剩余部分会详细说明这个问题。