我想使用map
来存储键值对。
地图的关键字应包含有关一点坐标(int
)的信息。
一种可能性是将int
转换为string
。例如,坐标(x,y)可以表示为"x#y"
,并将此字符串"x#y"
存储为键。
另一种可能性是使用一对将坐标存储为pair<int, int>
并使用此pair
作为关键字。
哪种方式更好?为什么?
答案 0 :(得分:14)
这取决于您对高效的定义,并且我们很快就会转向可能被视为过早优化的内容。有很多事情在起作用,顺便提一下你的问题,我认为我们应该采取一种非常简单的看法:
您的主要考虑因素可能是:
让我们假设你的系统:
int
是4个字节std::string
(这取决于实现)<强>存储强>
std::pair<int,int>
需要8个字节<强>速度强>
std::pair<int,int>
最多需要两次整数比较,这在大多数处理器上都很快<强>初始化强>
std::pair<int,int>
初始化简单快捷你已经可以看到,面对价值,使用字符串可能会很疯狂......也就是说,除非你有其他重要原因。
现在,您是否应该使用std::pair<int,int>
?这可能是矫枉过正的。例如,假设您只存储适合范围[0,65535]的值。在这种情况下,std::pair<uint16_t,uint16_t>
就足够了,或者您可以将这两个值打包成一个uint32_t
。
然后其他人提到了散列,如果您需要快速查找但不关心迭代顺序,这很好。
我说我会保持这种简单化,所以这就是我要停下来的地方。希望这给了你一些思考的东西。
最后要注意的是:不要过度思考问题 - 以最简单的方式编写,然后 TEST ,如果它符合您的需要。
答案 1 :(得分:1)
1,坐标可以是双数,所以我认为对&lt; double,double&gt;会是更好的选择。
第二,如果你真的想使用int pair或string key,那么对&lt; int,int&gt;将是更好的选择,因为字符串将始终创建比实际长度更多的容量。 基本上,您将为每个字符串键丢失一些未使用的内存。 string.length()值可以等于或小于string.capacity()value ..