STL将算法库分为4种分别为:非修改式序列操作、修改式序列操作、排序和相关操作、通用数字运算。
前3个在algorithm头文件中描述,而第4个在numeric头文件中描述:
而在非修改式序列操作中,find是一个重要的函数。其STL源码如下:
<span style="font-family:SimSun;font-size:14px;"><span style="font-size:14px;">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;
}
</span></span>
点击打开链接从源码中可看到find函数旨在区间[first,last)中循序查找某个值首次出现的位置。其返回值为InputIterator指向满足等同条件的元素,若不成功,则返回迭代器last。
以下是我写的关于find的小程序:
int main(void)
{
std::string str[] = {"hello","word","wangdao","hehe","lisi","wangdao","hehe"};
std::string * pstr;
pstr = std::find(str,str + 7,"word");
if(pstr != str +7)
std::cout<<"element found"<<std::endl;
else
std::cout<<"element not fount"<<std::endl;
std::deque<std::string> str_deq(str,str + 7);
std::deque<std::string>::iterator it;
it = find(str_deq.begin(),str_deq.end(),"word");
if(it != str_deq.end())
std::cout<<"element found"<<std::endl;
else
std::cout<<"element not fount"<<std::endl;
std::cout<<*it<<std::endl;
此外,find函数还有很多扩展。
find_if()为在区间中查找第一个满足条件函数的值。和find差不多,只不过第三个参数变成了函数,其中函数的参数为容器中存储的类型,返回值为bool。如果查找失败,find_if返回第二个参数。
bool Ismy(std::string str)
{
std::string istr = "my";
return (istr == str);
}<pre name="code" class="cpp"> str_deq.push_back("my");//deque尾插入my
it = find_if(str_deq.begin(),str_deq.end(),Ismy);
std::cout<<"the first accord with Ismy is "<<*it<<std::endl;
find_end():在序列中查找最后一个与另一个序列匹配的值。该函数的参数中包含2个序列区间。该函数用于在序列一的[first1,last1)区间内,查完全匹配序列二的[first2,last2)区间的最后一次出现的地方。可以使用容器所存的元素的类型所提供的equality操作,也可以在其参数中加入自己定义的二元运算。
bool equal(std::string str1,std::string str2)
{
return (str1 == str2);
}
std::string str2[]= {"wangdao","hehe"};
it = find_end(str_deq.begin(),str_deq.end(),str2,str2 + 2);
if(it != str_deq.end())
{ std::cout<<"str2 last find at "<<(it - str_deq.begin())<<std::endl;
std::cout<<*it<<std::endl;
}
else
std::cout<<"fail find_end"<<std::endl;
it = find_end(str_deq.begin(),str_deq.end(),str2,str2 + 2,equal);
if(it != str_deq.end())
{ std::cout<<"str2 last find at "<<(it - str_deq.begin())<<std::endl;
std::cout<<*it<<std::endl;
}
else
std::cout<<"fail find_end"<<std::endl;
find_first_of():与find_end()不同之处在于它是在第二个序列中查找第一个与第一个序列的值匹配的元素。其他的与find_end()相同
it = find_first_of(str_deq.begin(),str_deq.end(),str2,str2 + 2);
if(it != str_deq.end())
{ std::cout<<"str2 first find at "<<(it - str_deq.begin())<<std::endl
std::cout<<*it<<std::endl;
}
else
std::cout<<"fail find_end"<<std::endl;
想深入了解以上函数,我还是推荐大家看《STL源码剖析》