为什么std::string
有find
会员功能而std::vector
朋友没有呢?
std::find
在字符串上使用有什么问题吗?
这主要是出于历史原因,但不仅如此。
字符串库和 STL(由 A. Stepanov 开发的容器/算法库,最终成为 C++ 标准库的一部分)是独立开发的,它们采用了不同的约定。
然而,由于它们最终都融合到 C++ 标准库中,C++ 标准确实努力统一这些语法约定并允许将s与string
STL 算法一起使用,这就是为什么类string
具有成员函数,例如.begin()
end()
substr()
无论如何,除了向后兼容性之外,提供成员函数还有另一个原因,string
例如find()
:与容器不同,容器旨在与访问或操作其元素的通用算法一起工作,字符串通常被认为是值本身,而不是值的集合(即char
s 的序列)。string
因此,将操作值的算法封装到类的成员函数中是有意义的string
。
因此,在其设计中,C++ 标准库支持string
s 的这两种视图:作为值的集合和作为值本身。
更新:
您的第一句话“虽然std::vector
和朋友没有”并不完全正确。至少,如果您将std::vector
' 的朋友范围扩展到std::set
, std::multiset
, std::map
, std::multimap
, std::unordered_set
, 和std::unordered_map
(换句话说,几乎扩展到 C++ 标准库中的所有关联容器),则不会。
某些数据结构确实在其接口上具有某些通用 STL 算法的成员函数版本:这要么表明这些算法比那些特定数据结构(例如find()
)的通用对应物具有更有效的实现,要么表明一个专门的实现是必要的,因为通用算法根本不能应用于那些数据结构(例如std::remove()
,它修改容器中的值)。
std::string::find
(*)的语义与 的语义完全不同std::find
。在该算法的情况下,它将在容器内找到一个元素,如果您将其应用于某个std::string
装置,则可以找到字符为 X 的位置。
成员函数std::string::find
(除了接受单个 的一个变体charT
)有不同的目的,它们查找子字符串(即一系列值而不是单个值)。
下一个问题是为什么存在一个需要 a 的重载,charT
而它可能只是对std::find
. 正如安迪在他的回答中提到的,STL 和字符串库的实现是分开发生的。然后将迭代器添加到std::string
组件中。当迭代器被添加到 时std::string
,这个重载已经存在,即使它不存在,语义仍然std::find
与其余部分有所不同std::string::find
,而不是迭代器,它们采用并返回位置。这并不意味着一个不能根据另一个来实现,只是那个代码会更复杂。
(*)忍受我...读起来std::string
好像它是拼写的std::basic_string<>