为什么`std :: string`有一个`find`成员函数?

Fra*_*ank 10 c++ string stl stdstring

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

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

And*_*owl 12

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

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

然而,因为他们最终都汇聚到C++标准库,C++标准确实作出努力,以统一这些语法约定,并允许使用strings的STL算法,这就是为什么类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(),修改容器中的值).