地图的关键字应包含有关一个点的坐标(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.
然后其他人提到了哈希,如果您需要快速查找但不关心迭代顺序,这很好.
我说我会保持这种简单化,所以这就是我要停下来的地方.希望这给了你一些思考的东西.
最后要注意的是:不要过度思考问题 – 以最简单的方式编写,然后测试是否符合您的需求.