常用查找算法 find() find_if() adjacent_find() binary_search() count() count_if()

简介: 常用查找算法 find() find_if() adjacent_find() binary_search() count() count_if()

1.find() //查找元素

2.find_if() //按条件查找元素

3.adjacent_find() //查找相邻重复元素

4.binary_search() //二分查找法

5.count //统计元素个数

6.count_if //按条件统计元素个数


———————————————————————————————


1.原型:find(iterator beg,iterator end,value)


注意find函数会返回迭代器位置——找到返回对应位置,没有找到返回容器末尾位置

iterator beg:源容器初始位置

iterator end:原容器末尾位置

value:查找的元素


对于非自定义数据查找:


#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
//查找非自定义数据类型 
void test01()
{
  vector<int> v;
  for(int i=0;i<4;i++)
  v.push_back(i);
  vector<int>::iterator it = find(v.begin(),v.end(),2);//find会返回迭代器位置,找到返回对应位置,没找到返回v.end()
  if(it == v.end())  //写一个判断语句,判断迭代器返回位置是否为末尾位置
  {
  cout<<"没有找到"<<endl;
  }
  else
  {
  cout<<"找到值为"<<*it<<endl;
  }
}
int main()
{
  test01();
  return 0;
}


对于自定义类型的查找:


#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include <string>
class Person
{
public:
  Person(string name,int age)
  {
  this->m_name = name;
  this->m_age = age;
  }
  //*************************************************** 
  //重载== 让底层find知道怎么查找 
  bool operator==(const Person &p)  //要加const
  {
  if(this->m_name == p.m_name && this->m_age == p.m_age)
  {
    return true;
  }
  else
  {
    return false;
  }
  }
  //***************************************************
  string m_name;
  int m_age;  
};
void test02()
{
  vector<Person> v;
  Person p1("小明",12);
  Person p2("小王",15); 
  Person p3("小红",17);
  v.push_back(p1);
  v.push_back(p2);
  v.push_back(p3);
  //自定义一个测试类型
  Person P("小明",13); 
  vector<Person>::iterator it = find(v.begin(),v.end(),P); 
  if(it == v.end())
  {
  cout<<"没有找到"<<endl;
  }
  else
  {
  cout<<"找到了姓名:"<<it->m_name<<" 年龄:"<<it->m_age<<endl; 
  }
}
int main()
{
  test02();
  return 0;
}


———————————————————————————————


2.函数原型:find_if(iterator beg,iterator end,_func())


iterator beg:容器中初始位置

iterator end:容器中末尾位置

_func:函数对象,加谓词(针对于内置数据类型与自定义数据类型)


内置数据类型:


#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
//*****************************************
//我们用find_if找大于10的数 
class Comp
{
public:
  bool operator()(int val)
  {
  return val>10;  
  } 
}; 
//*****************************************
void test()
{
  vector<int> v;
  v.push_back(5);
  v.push_back(10);
  v.push_back(15);
  vector<int>::iterator it = find_if(v.begin(),v.end(),Comp());
  if(it == v.end())
  {
  cout<<"未找到该元素"<<endl;
  }
  else
  {
  cout<<"找到该元素为:"<<*it<<endl; 
  }
}
int main()
{
  test();
  return 0;
}



自定义数据类型:


#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include <string> 
//自定义数据类型 
class Person 
{
public:
  Person(string name,int age) //构造函数 
  {
  this->m_name = name;
  this->m_age = age;
  } 
  string m_name;
  int m_age;
};
//*****************************************
class Comp
{
public:
  bool operator()(Person &p)
  {
  return p.m_age>10;  //这里条件设置为年龄大于10,可以自定义条件 
  }
};
//*****************************************
void test()
{
  vector<Person> v;
  //构造对象 
  Person p1("aaa",20); 
  Person p2("bbb",2);
  Person p3("ccc",15);
  //插入容器 
  v.push_back(p1); 
  v.push_back(p2); 
  v.push_back(p3); 
  vector<Person>::iterator it = find_if(v.begin(),v.end(),Comp());
  if(it == v.end())
  {
  cout<<"未找到该位置"<<endl;
  }
  else
  {
  cout<<"找到该位置"<<"姓名为:"<<it->m_name<<"年龄为:"<<it->m_age<<endl;  //从前往后找符合条件的 
  } 
}
int main()
{
  test();
  return 0;
}


—————————————————


3.adjacent_find:查找相邻及重复的元素


原型:adjacent_find(iterator beg,iterator end)

iterator beg:迭代器初始位置

iterator end:迭代器末尾位置

函数返回迭代器位置,找到返回对应迭代器,没有找到返回容器的末尾


#include <iostream>
using namespace std;
#include <vector> 
#include <algorithm>
//常用查找算法 adjacent_find 查找相邻重复的元素 
void test()
{
  vector<int> v;
  v.push_back(2);
  v.push_back(1);
  v.push_back(3);
  v.push_back(3);
  vector<int>::iterator it = adjacent_find(v.begin(),v.end());
  if(it == v.end())
  {
  cout<<"没有找到"<<endl;
  }
  else
  {
  cout<<"找到,为"<<*it<<endl;
  }
} 
int main()
{
  test();
  return 0;
}


———————————————————————————————


4.binary_search() 二分查找


前提:容器中的数应当为有序的

返回值:返回的是bool类型

函数原型:binary_search(iterator beg,iterator end)

iterator beg:容器初始位置

iterator end:容器末尾位置


#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
void test()
{
  vector<int> v;
  //采用binary_search容器中必须是有序的数 
  for(int i=0;i<10;i++)
  v.push_back(i);
  bool ret = binary_search(v.begin(),v.end(),8);  //返回的是bool值
  if(ret)
  {
  cout<<"找到了"<<endl;
  } 
  else
  {
  cout<<"未找到"<<endl;
  }
}
int main()
{
  test();
  return 0;
}


———————————————————————————————


5.count() 查找对应相同的数量


返回值:数量

分两种:内置数据类型如int,double,自定义数据类型 class

函数原型:count(iterator beg,iterator end,num)

iterator beg:容器初始位置

iterator end:容器末尾位置

num:对应数据


内置数据类型


#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
void test()
{ 
  vector<int> v;
  v.push_back(2);
  v.push_back(1);
  v.push_back(2);
  v.push_back(2); 
  int num = count(v.begin(),v.end(),2);
  cout<<"有"<<num<<"个相同的数据"<<endl;
}
int main()
{
  test();
  return 0;
}


自定义数据类型


#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
class Person
{
public:
  Person(string name,int age)
  {
  this->m_name = name;
  this->m_age = age;
  }
//********************************************* 
  bool operator==(const Person& p) //这里必须加const为了与底层相同 
  {
  //这里我们只要求它们的年龄相同 
  if(this->m_age == p.m_age)
  {
    return true;
  }
  else
  {
    return false;
  }
  }
//*********************************************
  string m_name;
  int m_age;
}; 
void test()
{ 
  vector<Person> v;
  //创建对象
  Person p1("a",15);
  Person p2("b",16);
  Person p3("c",15);
  Person p4("d",15);
  v.push_back(p1);
  v.push_back(p2);
  v.push_back(p3);
  v.push_back(p4);  
  //创建一个测试例
  Person P("e",15);
  int num = count(v.begin(),v.end(),P);
  cout<<"与e同学年龄相同的有"<<num<<"个"<<endl; 
}
int main()
{
  test();
  return 0;
}


———————————————————————————————


6.count_if() 根据条件查找数据


原型:count_if(iterator beg,iterator end,_func)

iterator beg:容器初始位置

iterator end:容器末尾位置

_func:函数对象

返回值:数字

分为内置数据类型和自定义数据类型


内置数据类型


#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
//*********************************************
//自己定义一个类 
class compar
{
public:
  bool operator()(int val) //写一个bool类型的谓词 
  {
  return val>20;
  }
}; 
//*********************************************
void test()
{ 
  vector<int> v;
  v.push_back(5);
  v.push_back(10);
  v.push_back(20);
  v.push_back(30);  
  int num = count_if(v.begin(),v.end(),compar()); 
  cout<<"符合条件的有"<<num<<"个"<<endl; 
}
int main()
{
  test();
  return 0;
}



自定义数据类型


#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
class Person
{
public:
  Person(string name,int age)
  {
  this->m_name = name;
  this->m_age = age;
  }
  string m_name;
  int m_age;
}; 
//*********************************************
//再自定义一个类 
class compar
{
public:
  bool operator()(const Person& p) //谓词 
  {
  return p.m_age >20; 
  }
};
//*********************************************
void test()
{ 
  vector<Person> v;
  //创建对象
  Person p1("a",15);
  Person p2("b",16);
  Person p3("c",30);
  Person p4("d",20);
  v.push_back(p1);
  v.push_back(p2);
  v.push_back(p3);
  v.push_back(p4);  
  //创建一个测试例
  int num = count_if(v.begin(),v.end(),compar());
  cout<<"大于20岁的同学有"<<num<<"个"<<endl; 
}
int main()
{
  test();
  return 0;
}


相关文章
|
6月前
|
算法 C语言 Ruby
分形逃逸时间算法中的 Normalized Iteration Count(NIC)技术 让颜色更柔和
Normalized Iteration Count (NIC) 技术是一种提升逃逸时间算法中分形图像质量的方法,它产生更平滑的颜色过渡。数学公式表示为:`mu = n + 1 - log(log(|Z(n)|)) / log(p)`,其中 `Z(n)` 是迭代次数,`|Z(n)|` 是复数模长,`p` 通常取2。示例代码提供了 Ruby, Maxima 和 C 语言的实现。
|
7月前
|
存储 算法 JavaScript
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(二)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
161 0
|
7月前
|
算法 搜索推荐 程序员
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(一)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
125 0
|
算法 Java
看动画学算法之:排序-count排序
看动画学算法之:排序-count排序
看动画学算法之:排序-count排序
|
算法 C++
C++泛型线性查找算法——find
C++泛型线性查找算法——find 《泛型编程和STL》笔记及思考。 线性查找可能是最为简单的一类查找算法了。他所作用的数据结构为一维线性的空间。这篇文章主要介绍使用 C++ 实现泛型算法 find的过程。
1546 0
|
算法 C++
C++ STL算法系列2---find ,find_first_of , find_if , adjacent_find的使用
一.find运算 假设有一个int型的vector对象,名为vec,我们想知道其中是否包含某个特定值。 解决这个问题最简单的方法时使用标准库提供的find运算: 1 // value we'll look for 2 int search_value = 42; 3 4 /...
863 0
|
算法 C++
C++类属算法count
count是一种非可变序列算法,其功能是在序列中查找等于某个给定值的元素的个数。示例如下: // Illustrating the generic count algorithm#include #include #include #include using namespace std;i...
748 0
|
算法 C++ 区块链
C++类属性算法find
类属性算法find分别用于数组、表和输入迭代器 1 #include 2 #include 3 #include 4 #include 5 #include 6 7  using namespace std; 8 9  int main()10 {11 int...
648 0
|
17天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
3天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
下一篇
DataWorks