使用vector容器,即避免不了进行查找,所以今天就罗列一些stl的find算法应用于vector中。

find()

Returns an iterator to the first element in the range [first,last) that compares equal to val. If no such element is found, the function returns last.

#include <iostream>     // std::cout
#include <algorithm> // std::find
#include <vector> // std::vector int main () {
// using std::find with array and pointer:
int myints[] = { 10, 20, 30, 40 };
int * p; p = std::find (myints, myints+4, 30);
if (p != myints+4)
std::cout << "Element found in myints: " << *p << '\n';
else
std::cout << "Element not found in myints\n"; // using std::find with vector and iterator:
std::vector<int> myvector (myints,myints+4);
std::vector<int>::iterator it; it = find (myvector.begin(), myvector.end(), 30);
if (it != myvector.end())
std::cout << "Element found in myvector: " << *it << '\n';
else
std::cout << "Element not found in myvector\n"; return 0;
}
//
30
30

find_end()

Searches the range [first1,last1) for the last occurrence of the sequence defined by [first2,last2), and returns an iterator to its first element, or last1 if no occurrences are found.

#include <iostream>     // std::cout
#include <algorithm> // std::find_end
#include <vector> // std::vector bool myfunction (int i, int j) {
return (i==j);
} int main () {
int myints[] = {1,2,3,4,5,1,2,3,4,5};
std::vector<int> haystack (myints,myints+10); int needle1[] = {1,2,3}; // using default comparison:
std::vector<int>::iterator it;
it = std::find_end (haystack.begin(), haystack.end(), needle1, needle1+3); if (it!=haystack.end())
std::cout << "needle1 last found at position " << (it-haystack.begin()) << '\n'; int needle2[] = {4,5,1}; // using predicate comparison:
it = std::find_end (haystack.begin(), haystack.end(), needle2, needle2+3, myfunction); if (it!=haystack.end())
std::cout << "needle2 last found at position " << (it-haystack.begin()) << '\n'; return 0;
}
//输出:
5
3

find_if()

Returns an iterator to the first element in the range [first,last) for which pred returns true. If no such element is found, the function returns last.

#include <iostream>     // std::cout
#include <algorithm> // std::find_if
#include <vector> // std::vector bool IsOdd (int i) {
return ((i%2)==1);
} int main () {
std::vector<int> myvector; myvector.push_back(10);
myvector.push_back(25);
myvector.push_back(40);
myvector.push_back(55); std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
std::cout << "The first odd value is " << *it << '\n'; return 0;
}
//输出:
25

顺便说一句能够使用lambda表达式取代IsOdd函数。使得更加简洁。

find_first_of()

Returns an iterator to the first element in the range [first1,last1) that matches any of the elements in [first2,last2). If no such element is found, the function returns last1.

#include <iostream>     // std::cout
#include <algorithm> // std::find_first_of
#include <vector> // std::vector
#include <cctype> // std::tolower bool comp_case_insensitive (char c1, char c2) {
return (std::tolower(c1)==std::tolower(c2));
} int main () {
int mychars[] = {'a','b','c','A','B','C'};
std::vector<char> haystack (mychars,mychars+6);
std::vector<char>::iterator it; int needle[] = {'A','B','C'}; // using default comparison:
it = find_first_of (haystack.begin(), haystack.end(), needle, needle+3); if (it!=haystack.end())
std::cout << "The first match is: " << *it << '\n'; // using predicate comparison:
it = find_first_of (haystack.begin(), haystack.end(),
needle, needle+3, comp_case_insensitive); if (it!=haystack.end())
std::cout << "The first match is: " << *it << '\n'; return 0;
}
输出:
A
a

find_if_not()

最后出厂这个 我们应该重视一些 是C++11才有的方法。个人认为用处非常多。看看官方的描写叙述:

Returns an iterator to the first element in the range [first,last) for which pred returns false. If no such element is found, the function returns last.

样例:

#include <iostream>     // std::cout
#include <algorithm> // std::find_if_not
#include <array> // std::array int main () {
std::array<int,5> foo = {1,2,3,4,5}; std::array<int,5>::iterator it =
std::find_if_not (foo.begin(), foo.end(), [](int i){return i%2;} );
std::cout << "The first even value is " << *it << '\n'; return 0;
}
//输出:
2

最后 再来一个程序:

#include <vector>
#include <string>
#include <algorithm>
struct value_t
{
int a;
int b;
}; class vector_finder
{
public:
vector_finder(const int a) :m_i_a(a) {}
bool operator ()(const std::vector<struct value_t>::value_type &value)
{
return value.a == m_i_a;
}
private:
int m_i_a;
}; int main()
{
std::vector<struct value_t> my_vector;
struct value_t my_value; my_value.a = 11; my_value.b = 1000;
my_vector.push_back(my_value); my_value.a = 12; my_value.b = 1000;
my_vector.push_back(my_value); my_value.a = 13; my_value.b = 1000;
my_vector.push_back(my_value); my_value.a = 14; my_value.b = 1000;
my_vector.push_back(my_value); std::vector<struct value_t>::iterator it = my_vector.end();
it = std::find_if(my_vector.begin(), my_vector.end(), vector_finder(13));
if (it == my_vector.end())
printf("not found\n");
else
printf("found value.a:%d value.b:%d\n", it->a, it->b);
return 0;
}

最后来一个实战中用到的。vector<string>中的string的首字母依照字母表进行排序:

#include <iostream>     // std::cout
#include <algorithm> // std::stable_sort
#include <vector> // std::vector
#include <string> static char ch = 'a';
bool myfunction(const std::string& lhs, const std::string& rhs)
{
return lhs < rhs;
} bool myfunction2(const std::string& lhs)
{
return lhs[0] == ch;
} int main() { std::vector<std::string> myvector;
myvector.push_back("wo");
myvector.push_back("wi");
myvector.push_back("wa");
myvector.push_back("ao");
myvector.push_back("bo");
myvector.push_back("ae");
myvector.push_back("bv");
myvector.push_back("cd");
myvector.push_back("ef");
myvector.push_back("gd");
myvector.push_back("ww");
myvector.push_back("cd");
myvector.push_back("at");
myvector.push_back("bt");
myvector.push_back("ct");
myvector.push_back("dt");
myvector.push_back("et");
myvector.push_back("ft");
myvector.push_back("gt");
myvector.push_back("ht");
myvector.push_back("it");
myvector.push_back("jt");
myvector.push_back("kt");
myvector.push_back("lt");
myvector.push_back("mt");
myvector.push_back("nt");
myvector.push_back("ot");
myvector.push_back("pt"); myvector.push_back("qt");
myvector.push_back("rt");
myvector.push_back("st");
myvector.push_back("tt");
myvector.push_back("ut");
myvector.push_back("vt");
myvector.push_back("wt");
myvector.push_back("xt");
//myvector.push_back("yt");
myvector.push_back("zt"); myvector.push_back("qt");
myvector.push_back("et");
myvector.push_back("ee"); std::stable_sort(myvector.begin(), myvector.end(), myfunction); for (std::string &s : myvector)
std::cout << s << " ";
std::cout << std::endl;
std::cout << "===============" << std::endl; for (int i = 1;i < 27; i++)
{
auto it_begin = std::find_if(myvector.begin(), myvector.end(), myfunction2);
auto it_end = std::find_if_not(it_begin, myvector.end(), myfunction2);
for (auto i = it_begin; i != it_end; i++)
{
std::cout << *i << " ";
}
std::cout << std::endl; ch++;
}
return 0;
}
//输出:
ae ao at bo bt bv cd cd ct dt ee ef et et ft gd gt ht it jt kt lt mt nt ot pt qt qt rt st tt ut vt wa wi wo wt ww xt zt
===============
ae ao at
bo bt bv
cd cd ct
dt
ee ef et et
ft
gd gt
ht
it
jt
kt
lt
mt
nt
ot
pt
qt qt
rt
st
tt
ut
vt
wa wi wo wt ww
xt zt

实战c++中的vector系列--vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)的更多相关文章

  1. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  2. 实战c++中的vector系列--vector的一些异常

    今天就写一写vector的一些异常.能够捕捉的异常. out_of_range 相当于数组的越界了.vector会自己主动增大容量,可是假设索引超出了当前的size.就会引发异常. #include& ...

  3. 实战c++中的vector系列--vector&lt;unique_ptr&lt;&gt;&gt;初始化(全部权转移)

    C++11为我们提供了智能指针,给我们带来了非常多便利的地方. 那么假设把unique_ptr作为vector容器的元素呢? 形式如出一辙:vector<unique_ptr<int> ...

  4. 实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中推断不等于end())、operator[])

    遍历一个vector容器有非常多种方法.使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << ...

  5. 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

    在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数 ...

  6. 实战c++中的string系列--不要使用memset初始化string(一定别这么干)

    參考链接: http://www.cppblog.com/qinqing1984/archive/2009/08/07/92479.html 百度百科第一次这么给力: void *memset(voi ...

  7. 实战c++中的string系列--std::string与MFC中CString的转换

    搞过MFC的人都知道cstring,给我们提供了非常多便利的方法. CString 是一种非常实用的数据类型. 它们非常大程度上简化了MFC中的很多操作,使得MFC在做字符串操作的时候方便了非常多.无 ...

  8. 实战c++中的string系列--十六进制的字符串转为十六进制的整型(一般是颜色代码使用)

    非常久没有写关于string的博客了.由于写的差点儿相同了.可是近期又与string打交道,于是荷尔蒙上脑,小蝌蚪躁动. 在程序中,假设用到了颜色代码,一般都是十六进制的,即hex. 可是server ...

  9. 实战c++中的string系列--string的替换、查找(一些与路径相关的操作)

    今天继续写一些string操作. string给我们提供了非常多的方法,可是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\prog ...

随机推荐

  1. .Net Core项目上Azure Docker云

    1.找到创建资源-容器-Container Instances 2.安装模板,填写私有映像表的相关信息 3.创建成功,运行测试.

  2. 大数据攻城狮之Hadoop伪分布式篇

    对于初学大数据的萌新来说,初次接触Hadoop伪分布式搭建的同学可能是一脸萌笔的,那么这一次小编就手把手的教大家在centos7下搭建Hadoop伪分布式. 底层环境: VMware Workstat ...

  3. 4.Flask-alembic数据迁移工具

    alembic是用来做ORM模型与数据库的迁移与映射.alembic使用方式跟git有点类似,表现在两个方面,第一个,alemibi的所有命令都是以alembic开头: 第二,alembic的迁移文件 ...

  4. Go中的main函数和init函数

    Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main).这两个函数在定义时不能有任何的参数和返回值.虽然一个package里面可以 ...

  5. ASP.NET Cache 实现依赖Oracle的缓存策略

    ASP.NET 中的缓存提供了对SQL依赖项的支持,也就是说当SQL SERVER数据库中的表或行中的数据被更改后,缓存中的页面就失效,否则,页面输出可一直保留在缓存当中.这确实为程序员提供了方便.但 ...

  6. UID卡、CUID卡、FUID卡的区别

    UID卡(国外称GEN1) 所有区块可被重复读写 卡片ID可改且使用后门指令更改ID ID可被重复修改 响应后门指令(意味着可被使用后门指令检测是否为克隆卡的机器发现) CUID卡(国外称GEN2) ...

  7. 2星|《腾讯产品法》:标题党,作者只有QQ手机助手的短期产品经验

    腾讯产品法(一本书读懂腾讯产品思维与运营方法,<腾讯传>作者吴晓波推荐) 全书是作者的一些产品设计与运营的经验.如果书名不误导读者,这本书的内容值3星. 基于书名的误导,读后比较失望,作者 ...

  8. 统计:mAP的中文意思

    原文链接:http://blog.csdn.net/Lu597203933/article/details/41802155 之前写过一篇blog叫做机器学习实战笔记之非均衡分类问题:http://b ...

  9. Android 性能测试初探(二)

    书接前文 Android 性能测试初探(一).上回大体介绍了下在 android 端的性能测试项,现在我们就细节测试项做一些阐述(包括如何自己 DIY 测试). 首先我们来说说启动时间.关于应用的启动 ...

  10. 在vue中,让表格td下的textraea自适应高度

    1.效果图 2.数据是动态获取的,因此存在一个异步的问题,解决的思路是数据获取到渲染在textarea中以后,获取文字的真实高度,然后把这个高度给textarea 3.具体代码以及步骤 (1)再cre ...