C++中的find函数

我们在C++中使用的find函数一般都是algorithm库里面提供的或者
是STL容器里面的find函数。今天就来总结一下他们的使用与区别

1. 容器里面的find函数
STL里面容器除了vector其他常见的容器都有自己实现成员函数find,例如string中的find函数,string的find()函数用于找出字母在字符串中的位置。
函数原型如下:

//(1)
size_type find (const basic_string& str, size_type pos = 0) const noexcept;
//(2)
size_type find (const charT* s, size_type pos = 0) const;
//(3)
size_type find (const charT* s, size_type pos, size_type n) const;
//(4)
size_type find (charT c, size_type pos = 0) const noexcept;

(1)(2)(4)的两个参数
第一个参数就是你要查找的元素,第二个参数就是字符串中的某个位置,表示从从这个位置开始的字符串中找指定元素。(如果不填这个参数也是可以的,默认从字符串的首位置开始找)
对于(3)的三个参数:取第一个参数的前n(第三个参数)个字符(相当于截取了s的前n个字符)第二个参数就是指明从哪个位置开始找。

返回值:若查找成功,返回按查找规则找到的第一个字符或子串的位置;若查找失败,返回npos,即-1(打印出来为4294967295)。

2. 算法里面的find函数
算法库里面的查找功能的相关函数

它是在范围内寻找元素,它返回一个迭代器,该迭代器[first,last)比较等于val的范围内的第一个元素。找到返回的是该元素的迭代器,如果找不到这样的元素,则函数返回last(就是个迭代器)。该函数实现原理就是用operator==将各个元素与val进行比较。具体实现如下:

template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last,const T& val)
{
  while (first!=last) {
    if (*first==val) return first;
    ++first;
  }
  return last;
}
  • 为什么库里面的返回的不是索引下标?这是因为索引下标是在数组这种连续存储的数据结构里面常见的,是一种顺序索引;而很多数据结构的存储并非连续的,所以不能实现顺序索引,因为它是个库函数为了兼顾所有的数据结构,所以返回的仅仅是指针或是迭代器。
  • 所以顺序存储结构里面的find函数返回的是下标索引。因为它是连续空间存储的,返回下标是没有问题的,而set,map,multiset,multimap等数据结构都不是顺序索引的数据结构,所以返回的是迭代器。

:)

你可能感兴趣的:(C/C++)