【问题标题】:Why does `std::string` have a `find` member function? [closed]为什么`std::string`有`find`成员函数? [关闭]
【发布时间】:2013-01-28 09:42:21
【问题描述】:

为什么std::string 有一个find 成员函数而std::vector 和朋友没有它?

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

【问题讨论】:

  • @juanchopanza 哇,这是一个很棒的链接。刚刚学到了很多关于非成员朋友如何改进封装的知识..(对于那些没有读过作者认为可以从类中删除许多成员函数,例如空从std::list、std::vector、std: :string 并制成一个通用函数,服务于整个标准库)。

标签: c++ string stl stdstring


【解决方案1】:

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

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

但是,由于它们最终都融合到 C++ 标准库中,C++ 标准确实努力统一这些语法约定,并允许将 strings 与 STL 算法一起使用,这就是为什么类 string 具有这样的成员函数作为begin()end() 除了其他成员函数,如substr()

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

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

更新:

你的第一句话“虽然std::vector和朋友没有”并不完全正确。至少,如果您将std::vector 的朋友范围扩展到std::setstd::multisetstd::mapstd::multimapstd::unordered_setstd::unordered_map(换句话说,几乎所有C++ 标准库中的关联容器)。

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

【讨论】:

    【解决方案2】:

    std::string::find的语义(*)std::find的语义完全不同。在算法的情况下,它会在容器内找到一个元素,如果你将其应用于std::string,则意味着找到字符为X的位置

    成员函数std::string::find(除了接受单个charT 的一个变体)有不同的用途,它们找到子字符串(即一系列值而不是单个值)。

    下一个问题是为什么存在一个需要charT 的重载,而它可能只是对std::find 的调用。正如安迪在他的回答中提到的,STL 和字符串库的实现是分开发生的。然后将迭代器添加到std::string 组件中。当迭代器被添加到std::string 时,这个重载已经存在,即使它没有,语义仍然与std::find 有点不同,因为与std::string::find 的其余部分一样,它们不是迭代器采取并返回职位。这并不意味着一个不能根据另一个来实现,只是那个代码会更复杂。

    (*) 请耐心等待...阅读std::string,就像拼写为std::basic_string<>

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多