为什么std :: string有一个查找成员函数,而std :: vector和朋友没有?
在字符串上使用std :: find有什么问题吗?
解决方法
这主要是出于历史原因,但不仅仅是.
字符串库和STL(由A. Stepanov开发的最终成为C标准库的一部分的容器/算法库)是独立开发的,它们采用了不同的约定.
然而,由于它们最终都融合到C标准库中,因此C标准确实努力统一这些句法约定,并允许使用STL算法的字符串,这就是为什么类字符串具有成员函数,如begin()和end()除了其他成员函数,如substr().
除了向后兼容性之外,无论如何,还有一个原因,为什么string提供了诸如find()的成员函数:与容器不同,它们是为了处理访问或操纵其元素的通用算法,字符串大多被认为是值本身,而不是作为值的集合(即字符序列).因此,封装将字符串值操作为字符串类的成员函数的算法是有意义的.
在其设计中,C标准库因此支持这两种字符串视图:作为值集合和值本身.
更新:
你的第一句话“std :: vector和朋友没有”的位不完全正确.至少,如果你将std :: vector的范围扩展到std :: set,std :: multiset,std :: map,std :: multimap,std :: unordered_set和std :: unordered_map(换句话说,相当于C标准库中的所有关联容器).
某些数据结构确实在其接口上具有一些通用STL算法的成员函数版本:这或者是表示这些算法比那些特定数据结构的通用对等体(例如find())具有更有效的实现,或者需要专门的实现,因为通用算法根本不能应用于那些数据结构(例如,std :: remove()),它修改容器中的值).