微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

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

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

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

原文地址:https://www.jb51.cc/c/116527.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐