一般的查找方法是写个函数遍历这个vector,一个个进行比较查找。
实际上在使用STL的时候,不建议使用循环遍历的查找方法,建议使用stl的泛型算法。理由如下:(参考《effictive c++》46条)
效率:泛型算法通常比循环高效。
正确性: 写循环时比调用泛型算法更容易产生错误。
可维护性: 与相应的显式循环相比,泛型算法通常使代码更干净、更直观。
1、find模板函数
用stl的find方法查找一个包含简单类型的vector中的元素.
代码如下:
vector<string> strVec;
//加入成员。。
std::find(strVec.begin(),strVec.end(),"aa");
2、find_if模板函数
假如vector的成员是复合类型的对象时,常使用find_if指定具体的查找方式。
复合类型如:
class A
{
public:
A(const std::string str,int id)
{
__str=str;
__id=id;
}
private:
std::string __str;
int __id;
};
函数声明
template<class InputIterator, class Predicate> InputIterator find_if( InputIterator _First, InputIterator _Last, Predicate_Pred );使用关键:最后一个参数是一个一元谓词
(1)函数
代码如下:
bool compare(A& dValue)
{
if(dValue.GetStr().compare(“bb”)==0)
return true;
else
return false;
}
vector<A> a;
A b(“aa”,4);
A c(“bb”,6);
A d(“zz”,7);
a.push_back(b);
a.push_back(c);
a.push_back(d);
vector<A>::iterator t=std::find_if(a.begin(),a.end(),compare);
不过,函数方式在函数内限定了被比较的内容。
(2)函数对象
带一个参数且返回值限定为bool的函数对象(并重载()操作符号的自定义类)。
代码如下:
class findx
{
public:
findx(const string str)
{
__test=str;
}
string GetTest()
{
return __test;
}
bool operator()(A& dValue)
{
if(dValue.GetStr().compare(__test)==0)
return true;
else
return false;
}
private:
string __test;
};
vector<A>::iterator t=std::find_if(a.begin(),a.end(),findx(“33″));
(3)绑定器
STL中的绑定器有类绑定器和函数绑定器两种,类绑定器有binder1st和binder2nd,而函数绑定器是bind1st和bind2nd,他们的基本目的都是用于构造一个一元的函数对象。
比如这里我们可以利用bind2nd通过绑定二元函数对象中的第二个参数的方式来实现二元谓词向一元谓词的转换。
代码如下:
struct compare: binary_function<A, string,bool>
{
bool operator()( A &val, string str) const
{
if (val.GetStr()== str)
return true;
else
return false;
}
};
vector<A>::iterator t=find_if(a.begin(),a.end(),bind2nd(compare(),”33″));
3、sort模板函数
使用方式也有函数和函数对象方式。
代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool myfunction (int i,int j) { return (i<j); } //函数方式
struct myclass {
bool operator() (int i,int j) { return (i<j);} //函数对象方式
} myobject;
int main () {
int myints[] = {32,71,12,45,26,80,53,33};
vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33
vector<int>::iterator it;
// using default comparison (operator <):
sort (myvector.begin(), myvector.begin()+4); //(12 32 45 71)26 80 53 33
// using function as comp
sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
// using object as comp
sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80)
// print out content:
cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
}