为什么STL容器没有通用函数的方法?

问题描述 投票:0回答:1

我知道迭代器上有一些通用函数可以完成您想做的所有事情,例如 std::find、std::count 等,但为什么标准容器(例如 std::vector 和 std:: )不可以呢?为了方便起见,数组对它们有一些抽象吗?例如,如果您有一个名称较长的 std::vector,则必须编写

std::find(nameOfLongNamedStdVector.begin(), nameOfLongNamedStdVector.end(), ...);

当我们可以拥有类似的东西时

nameOfLongNameStdVector.find(...);

我已经看到这样的论点:没有理由重新实现该函数,因为 std::find 可以完成这项工作,但其实现可以使用 std::find 并简单地充当包装器以方便使用。此外,还有一些容器,例如 std::map,它具有

contains
方法,std::vector 也可以从中受益。相反,如果您只是想查看某个值是否在向量中,则必须使用 std::find,然后将其与结束运算符进行比较,这确实很笨拙。

我知道存在可以提高性能的专门方法,但为什么不将它们添加到各处以实现统一、方便、整洁和可读性呢?

c++ methods stl stdvector
1个回答
0
投票

如果需要,容器有自己的功能。举个例子,

std::map
确实有自己的
find
,因为通用模板只是迭代所有元素,直到找到您要查找的元素,而
std::map
可以通过以下方式实现更高效的
find
:利用其内部树结构。

Find
在向量上的效率很低,而且不是特定于向量数据结构的东西——没有聪明的方法可以在向量中查找某些内容,因此向量不提供它。

你也可以在其他领域看到这种思路。就像

std::vector
确实有一个
insert
一样,它允许您在任何地方插入元素,但它不会给您
push_front
。它确实为您提供了
push_back
,因为这是
std::vector
的高效本机操作。

事实上,如果一个容器给你一些“特定”的东西,比如前面提到的矢量上的

push_back
,或者地图上的
find
,你几乎可以认为这是一个有效的操作。不一定
O(1)
,但仍然足以保证使其成为容器 API 的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.