为什么要创建一个像 boost 和 std minmax这样的函数来返回一对相同类型的函数。当你可以返回一个向量并且可以使用索引访问它们时。
如果:vectores需要.size()...,对<>正好是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';
}
答案 0 :(得分:1)
您提出的建议成本更高,并且在一般情况下不提供任何回报。在C ++中,我们不愿意为我们不需要的东西买单。
std::vector
旨在允许动态调整大小。这需要很高的成本。它使用动态内存分配,这比分配&#34;慢得多。用于自动变量。即使分配是免费的,所使用的存储也会在堆栈外部损害您的内存位置,并可能导致额外的缓存未命中。至少,符合要求的实现需要指向分配的存储,大小和容量的指针,因此它需要比std::pair
更多的空间。最后,它的语义更差,因为无法从类型中判断它只包含两个元素。
好处是能够插入更多元素,这是程序员通常不需要对minmax_element
函数的结果做的事情。如果你需要在容器中包含其他内容,那么你总是可以使用std::pair
进行构建,但是不应该对一般用例进行权衡以适应这种特殊情况。
只是为了澄清,minmax_element
返回一对迭代器,而不是元素。无论对象的大小如何,这些基本上都是两个指针。便宜的建筑和便宜的商店。