Web Analytics
yangyang

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

All Posts in 2023.8


从Dictionary中key为大小写不敏感的字符串类型说起

本文由一个在Dictionary中使用String作为key,且支持大小写不敏感匹配的例子来说明Dictionary的内部原理。由Key获取hash值是Dictionary实现的关键。在Dictionary声明的时候,可以通过构造函数传递IEqualityComparer参数来指定比较器,通过该对象来获取哈希值。如果不提供这个参数,则会在内部判断Key是否实现了IEquatable泛型接口,如果提供了,则使用该泛型接口中定义的GetHashCode来获取哈希值,否则会根据Key的类型生成一个通用的EqualityComparer,这个通过的EqualityComparer的参数是object类型,所以如果Key的类型为结构体,则必须为其实现IEquatable泛型接口,否则就会产生装箱从而严重影响性能。 …

Dictionary Hash StringComparer IEquatable IEqualityComparer

解决WinForm中Chart控件偶发的一言不合就报错画红叉的问题

在WinForm中,使用自带的System.Windows.Forms.DataVisualization.Charting图表控件绘图时,在极其偶然的情况下,由于一些数据或者参数不对,会导致图表绘图区出现一个大大的红色叉叉,同时会弹出报错窗体。这个问题在我司的一个程序中非常罕见,且不容易重现,最近在处理这个问题时,通过控制变量,使得这一问题比较容易重现,从而为找到问题打开了突破口,这里记录一下。 …

CandleStick MSChart Red-Cross StackOverflow

C++内存管理基础

本文也是候捷《C++内存管理机制》的笔记,介绍了C++原始内存分配的基本方法,优缺点,以及介绍了一个简单的内存池,虽然在Modern C++中已经不建议直接管理内存分配后的指针,而是采用智能指针的方式。但是这些只是对原始内存分配的一些包装或处理,所以这里记录一下。 基本方式 《Effective C++》这本书开篇就指出,C++由几大部分组成: C语言部分。C++是以C为基础,C++经过编译器处理后就是C语言。在C++中仍然保留了很多C语言的用法,比如区块(blocks)、语句(statement),数组(arrays)、指针(pointer)等等。所以C语言中的一些内存分配方法,在C++中仍然能够使用。 面向对象,就是C with Class,包括类、封装、继承、多态等等。 模版,Template C++是C++泛型编程的一部分。这一点跟C#中的泛型编程个人感觉区别巨大。但C++中的模版 …

memory management memory pool allocator embedded pointer

C++中的模版模版参数和模版别名的使用

最近在看候捷的C++系列视频教程,其中有一个例子讲到了使用迭代器特性(iterator_traits)和使用模版模版参数(template template parameter)以及模版别名(alias template)来完成同一件事情,非常的经典,我这里记录一下。 事情的起因 事情的缘由是要比较在不同类型的容器类型(vector、deque、set等等)中,对象是否有moveable的相关构造函数 对容器的各种操作性能的影响。所以要编写一个通用的模版方法,允许接受不同的模版参数,以及不同的数据类型,并能输出调用各种操作(拷贝构造,移动构造,赋值构造)耗费的时间等的时间。 为了方便进行,这里编写了两个简化版本的String类,一个名为MyString的类带有各种移动构造,拷贝,赋值函数(Big Five) #include #include # …

template template parameter alias template iterator traits