我们知道在javascript
以及Python 3.6+
中,所有的dict
都保留了插入顺序。但在 C++中,无论是std::map
还是std::unordered_map
,都没有保留插入顺序。当遍历时,std::map
得到的是一个根据键值排序的有序序列,而std::unordered_map
则基本是乱序。
loki::AssocArray
弥补了该特性,它有兼容std::map
的 API ,同时又确保了在begin()
到end()
循环时,保留了插入时的顺序。在这方面它和tsl::ordered_map
一样,只是效率没后者那么高,但胜在代码和内存布局简单清晰。
loki::AssocArray
的代码位于https://github.com/brkpt/loki/blob/master/include/loki/AssocVector.h,该文件没有其它依赖,可以直接复制使用。
其原理特别简单,就是一个std::vector<pair<K, V>>
,连顺序都不排(可对照folly::sorted_vector_map
),直接按照添加顺序在尾部插入。只是添加了一些仿std::map
的 API。
也因为如此,只有新增数据很快,其余的操作,如修改、删除,甚至访问,都需要O(n)
的时间,基本只适合不到三位数的元素个数时使用。
Q. E. D.