c – 使用pair或string作为map <>键,哪个更有效?

我想使用地图来存储键值对.

地图的关键字应包含有关一个点的坐标(int)的信息.

一种可能性是将int转换为字符串.例如,坐标(x,y)可以表示为“x#y”并将该字符串“x#y”存储为关键字.

另一种可能性是使用一对来将坐标存储为对< int,int>并使用这对作为关键.

哪种方式更好,为什么?

解决方法

这取决于您对效率的定义,并且我们很快就会转变为可能被认为是过早优化的东西.有很多事情在起作用,顺便提一下你的问题,我认为我们应该采取一种非常简单的看法:

您的主要考虑因素可能是:

>存储:每个密钥使用多少内存
>速度:关键比较的复杂程度
>初始化:创建密钥的复杂程度

让我们假设你的系统:

> int是4个字节
>指针是8个字节
>你为字符串分配自己的内存而不是使用std :: string(这是依赖于实现的)

存储

> std :: pair< int,int>需要8个字节
>你的字符串需要8个字节用于指针,加上额外的内存用于字符串表示的值(每个整数最多10个字节)和另一个字节用于分隔符

速度

>比较std :: pair< int,int>最多需要两个整数比较,这在大多数处理器上都很快
>比较两个字符串很复杂.平等很容易,但不是很复杂.您可以为字符串使用特殊的填充语法,需要更多存储空间,以减少其复杂性.

初始化

> std :: pair< int,int>初始化简单快速
>创建两个值的字符串表示需要某种内存分配,可能涉及逻辑以确定所需的最小内存量,然后是分配本身(慢)和实际的数字转换(也慢).这是一个双重打击的“瓶颈”.

你已经可以看到面值了,使用字符串可能会很疯狂……也就是说,除非你有其他重要原因.

现在,你应该使用std :: pair< int,int>?这可能是矫枉过正的.例如,假设您只存储适合范围[0,65535]的值.在这种情况下,std :: pair< uint16_t,uint16_t>就足够了,或者你可以将这两个值打包成一个uint32_t.

然后其他人提到了哈希,如果您需要快速查找但不关心迭代顺序,这很好.

我说我会保持这种简单化,所以这就是我要停下来的地方.希望这给了你一些思考的东西.

最后要注意的是:不要过度思考问题 – 以最简单的方式编写,然后测试是否符合您的需求.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...