浅谈STL中的find及其扩展函数
来源:互联网 发布:linux apt get 安装 编辑:程序博客网 时间:2024/06/06 03:13
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;elsestd::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;elsestd::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尾插入myit = 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::endlstd::cout<<*it<<std::endl;}else std::cout<<"fail find_end"<<std::endl;
想深入了解以上函数,我还是推荐大家看《STL源码剖析》
0 0
- 浅谈STL中的find及其扩展函数
- STL中的find函数
- STL中的find函数
- STL中的find()函数,kmp的替代品
- 浅谈C++中的虚函数及其作用
- STL函数对象:定义、及其在STL中的应用
- STL find函数
- STL find函数
- STL中find函数
- STL-find,find_if函数
- STL find()函数
- STL find 函数
- 浅谈STL仿真函数
- 浅谈STL中的容器
- STL库中find函数
- STL之find函数讲解
- STL(2)find函数
- 浅谈 STL中的 nth_element() 使用方法
- swift中使用CoreData实现增删查改
- 误删资料恢复
- Hibernate4.3.9获取SessionFactory的方法
- DISCUZ浅析之COOKIE篇
- almostSorted
- 浅谈STL中的find及其扩展函数
- 【转载】char*,const char*和string 三者转换
- Linux系统编程——系统调用之 I/O 操作(文件操作)
- 使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
- android应用之——为自己的apk签名
- 《Hadoop基础教程》之初识Hadoop
- 微信自定义菜单
- Htrace on Hadoop, Hbase and HbaseClient
- Android开发之查看应用包名package和入口activity名称的方法