10

为什么std::stringfind会员功能而std::vector朋友没有呢?

std::find在字符串上使用有什么问题吗?

4

2 回答 2

12

这主要是出于历史原因,但不仅如此。

字符串库和 STL(由 A. Stepanov 开发的容器/算法库,最终成为 C++ 标准库的一部分)是独立开发的,它们采用了不同的约定。

然而,由于它们最终都融合到 C++ 标准库中,C++ 标准确实努力统一这些语法约定并允许将s与stringSTL 算法一起使用,这就是为什么类string具有成员函数,例如.begin()end()substr()

无论如何,除了向后兼容性之外,提供成员函数还有另一个原因,string例如find():与容器不同,容器旨在与访问或操作其元素的通用算法一起工作,字符串通常被认为是值本身,而不是值的集合(即chars 的序列)。string因此,将操作值的算法封装到类的成员函数中是有意义的string

因此,在其设计中,C++ 标准库支持strings 的这两种视图:作为值的集合和作为值本身。

更新:

您的第一句话“虽然std::vector 和朋友没有”并不完全正确。至少,如果您将std::vector' 的朋友范围扩展到std::set, std::multiset, std::map, std::multimap, std::unordered_set, 和std::unordered_map(换句话说,几乎扩展到 C++ 标准库中的所有关联容器),则不会。

某些数据结构确实在其接口上具有某些通用 STL 算法的成员函数版本:这要么表明这些算法比那些特定数据结构(例如find())的通用对应物具有更有效的实现,要么表明一个专门的实现是必要的,因为通用算法根本不能应用于那些数据结构(例如std::remove(),它修改容器中的值)。

于 2013-02-12T23:10:20.323 回答
4

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<>

于 2013-02-12T23:22:09.637 回答