pair <t,t =“”> vs vector <t>(2)C ++

时间:2018-04-01 21:49:26

标签: c++ std-pair

为什么要创建一个像 boost std minmax这样的函数来返回一对相同类型的函数。当你可以返回一个向量并且可以使用索引访问它们时。

如果:vectores需要.size()...,对&lt;&gt;正好是2个元素......意味着更少的空间...

然后为什么对首先返回,然后是第二个。而不仅仅是一个索引的容器。

  auto result = std::minmax_element (foo.begin(),foo.end());

  std::cout << "min is " << *result.first;
  std::cout << ", at position " << (result.first-foo.begin()) << '\n';
  std::cout << "max is " << *result.second;
  std::cout << ", at position " << (result.second-foo.begin()) << '\n';
想一想,这不是最好的例子。 但是......记住情报是:最大化可能性。 这开启了可能性。

  for(uint64_t i = 0; i < 2; ++i) {
     if (i)
        std::cout << "max is ";
     else
        std::cout << "min is ";
     std::cout << *result[i];

     std::cout << ", at position " << (result[i]-foo.begin()) << '\n';
  }

1 个答案:

答案 0 :(得分:1)

您提出的建议成本更高,并且在一般情况下不提供任何回报。在C ++中,我们不愿意为我们不需要的东西买单。

std::vector旨在允许动态调整大小。这需要很高的成本。它使用动态内存分配,这比分配&#34;慢得多。用于自动变量。即使分配是免费的,所使用的存储也会在堆栈外部损害您的内存位置,并可能导致额外的缓存未命中。至少,符合要求的实现需要指向分配的存储,大小和容量的指针,因此它需要比std::pair更多的空间。最后,它的语义更差,因为无法从类型中判断它只包含两个元素。

好处是能够插入更多元素,这是程序员通常不需要对minmax_element函数的结果做的事情。如果你需要在容器中包含其他内容,那么你总是可以使用std::pair进行构建,但是不应该对一般用例进行权衡以适应这种特殊情况。

只是为了澄清,minmax_element返回一对迭代器,而不是元素。无论对象的大小如何,这些基本上都是两个指针。便宜的建筑和便宜的商店。