使用pair <int,int =“”>或字符串作为map&lt;&gt;关键,哪个更有效率?

时间:2018-05-30 03:02:36

标签: c++ c++-standard-library

我想使用map来存储键值对。

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

一种可能性是将int转换为string。例如,坐标(x,y)可以表示为"x#y",并将此字符串"x#y"存储为键。

另一种可能性是使用一对将坐标存储为pair<int, int>并使用此pair作为关键字。

哪种方式更好?为什么?

2 个答案:

答案 0 :(得分:14)

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

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

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

让我们假设你的系统:

  • 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

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

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

最后要注意的是:不要过度思考问题 - 以最简单的方式编写,然后 TEST ,如果它符合您的需要。

答案 1 :(得分:1)

1,坐标可以是双数,所以我认为对&lt; double,double&gt;会是更好的选择。

第二,如果你真的想使用int pair或string key,那么对&lt; int,int&gt;将是更好的选择,因为字符串将始终创建比实际长度更多的容量。 基本上,您将为每个字符串键丢失一些未使用的内存。 string.length()值可以等于或小于string.capacity()value ..