std :: pair vs Array

Has*_*lil 3 c++ arrays std-pair

我正在创建一个带有键和值的Map.值必须有两个单独的条目.现在我想到的前两个选项
要么就是去

Map< int,array[2] > 
Run Code Online (Sandbox Code Playgroud)

要么

Map < int,pair < float,float > >  
Run Code Online (Sandbox Code Playgroud)

在内存和执行时间方面,这两者中哪一个更好.我个人认为数组会更好,因为我们不需要执行任何搜索功能.我只是计划使用下标访问该位置并更改它们.

rub*_*nvb 6

你有三个选择,正确的选择取决于两个int代表什么.

  1. using mymap = std::map<int, std::array<float, 2>>;
  2. using mymap = std::map<int, std::pair<float, float>>;
  3. 使用此构造的可读代码的首选选项:

    struct somethingmeaningful { float meaningful1; float meaningful2; };
    using mymeaningfulmap = std::map<int, somethingmeaninful>;
    
    Run Code Online (Sandbox Code Playgroud)

注意最后一个神奇地变得有意义;-).

另外,请注意我是如何完全忽视你的问题,哪个更快.这样做的原因是无关紧要.从长远来看,具有有意义名称的可读代码总是更具性能!

  • @Hassan 然后停止在这里问什么假设可以执行最好的问题,并开始在它将运行的实际系统上分析实际代码。 (6认同)
  • 一旦编译器完成处理,这三者也很可能具有完全相同的性能。 (2认同)

dir*_*ter 6

为了弄清楚这一点,第一个例子可能应该是

std::map<int, std::array<float, 2> >
Run Code Online (Sandbox Code Playgroud)

但不太清楚你的意思

[...]计划使用下标访问该位置[...]

请注意,对于一对,你会做类似的事情

std::pair<float, float> a;
a.first = 1.0;
Run Code Online (Sandbox Code Playgroud)

而对于数组,语法看起来像这样

std::array<float, 2> a;
a[0] = 1.0;
Run Code Online (Sandbox Code Playgroud)

那么数组可能会有更多的开销,因为它提供了您不会使用的其他功能,例如迭代器等。最好的方法总是做一些实验。我发现保持我的实现对交换容器等的开放也有助于我保持代码的干净和模块化。

  • `std::array` 为何有更多开销? (8认同)
  • 话虽这么说,有一句著名的 Dijkstra 名言:两个或更多,使用 for ... 所以“begin”和“end”毕竟可能有用:) (3认同)
  • 我想我不应该说开销。它肯定不会慢或什么的。然而,“std::pair”更轻量。`std::array` 提供了像 `begin`、`end`、`fill` 等方便的函数,这些函数在只有两个元素的情况下可能有点过分了。 (2认同)