Web Analytics
yangyang

码农兼一个普普通通小青年

C++ C++ is best!!!


从C++中的迭代器说到左闭合区间

和C#中的IEnumerable接口类似,在C++中,遍历标准容器库比如vector、deque、list等,都需要用到迭代器对象(iterator),根据容器的类型不同以及访问时是否需要读写,迭代器也分为可读写迭代器iterator,只读迭代器const_iterator以及反向迭代器reverse_itertaor。 调用容器类型成员的begin和end方法(或者cbegin,cend,rbegin,rend)方法,这两个方法分别返回指向容器首元素,以及尾元素之后的位置(one past the last element),简称尾后的迭代器。 这里面有一个容易误解的地方在于,end方法返回的迭代器,从来都不会指向容器的最后一个元素,而是指向最后一个元素之后的元素。如果容器v的第一个和最后一个元素分别记为first和last,那么调用v.begin()和v.end()返回的迭代器范围( …

iterator left-inclusive Dijkstra

C++中的声明、定义和初始化

不同于其它语言比如C#,C++中有很多专有的术语,有些术语还十分重要,比如声明、定义、初始化,初始化又有直接初始化和赋值初始化,了解这些术语对于掌握C++非常重要,这里就简单记录一下: 为什么会有声明和定义的区分 C++语言支持分离式编译(seperation compilation)机制,即允许将程序分割为若干文件,每个文件可以被独立编译。如果将程序分为多个文件,则需要有在文件间共享代码的方法,一个文件中的代码可能需要另一个文件中定义的变量。 为了支持分离式编译,C++语言将声明(declaration)和定义(definition)区分开来。声明使得名字为程序所知,一个文件如果想使用别处定义的名字,必须包含对那个名字的声明。而定义则负责创建与名字关联的实体。 变量的声明规定的变量的名字和类型,定义也一样,但除此之外,定义还申请存储空间,也可能会为变量赋予一个初始值。我们通常看到的.h头 …

C++ declaration definition initialization

布隆过滤器原理及应用

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数,主要用于判断一个元素是否在一个集合中。与直接存储数据不同,布隆过滤器是通过一系列随机映射函数,将待存储的数据通过映射函数提取特征,然后将这些特征存储到二进制向量对应的二进制位上(类似于前文的Bitmap存储),当查找某个值时,通过随机映射函数,提取特征,然后检查这些特征所在的二进制位上是否都为1,如果都为1,表示该可能存在在集合中,但只要有一个为0,则一定不在集合中。 …

Bloom Filter Hash table collision

位运算及其应用

位运算符作用于整型对象,并把运算对象看作是二进制位的集合。位运算提供了检查和设置二进制位的功能。通常在编写代码中,相比加减乘除,位运算并不常用,但在有些情况下,位运算有用处。本文首先介绍为位运算的基本概念,然后介绍位运算的应用场景,包括使用Bitmap来存储整型数据,并介绍了在此基础上如何对大量不重复的整型数据进行快速排序,对大量整型数进行去重和快速查找,最后介绍了编程语言对Bitmap思想的实现,包括C++里面的bitset,C#里面的BitArray,并介绍了枚举值中使用位运算的一些例子。 …

bitwise or xor bitmap bitset bitarray

C++中的引用和指针

我本人只有一点C基础,还是上大学的时候习得的。工作不管是开发桌面程序Winform,WPF,还是Web程序,亦或是Office插件,一直使用的C#。在最近的工作中,需要使用C#调用一些C++类库,通常的做法就是把C++类库通过C++ CLI包装一下,然后变成dll直接供C#调用。但是到了.NET Core时代,C++ CLI已经不被支持了,所以唯一的交互方式就是通过P/Invoke,于是看了另外一本书《精通.NET互操作:P/Invoke、C++ Interop和COM.Interop》,发现在.NET与C++进行互操作时有非常多需要注意的地方,一不小心就会有性能问题,且容易出错,当然,这里面涉及到需要掌握一些C++的知识,所以就打算学习一下C++。     要学习一门新语言,当然要找最经典的书本看,然后跟着练习,于是我找到了《Primer C++ 第五版》这本书,我初次接触到C++里面的 …

C++