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等數據結構都不是順序索引的數據結構,所以返回的是迭代器。

:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章