前面讲到用distance算法来返回两个迭代器之间的距离.下面给出实现:
template
int myDistance(T a, T b)
{
int distance = 0;
if (a <= b)
{
while (a != b)
{
distance++;
a++;
}
}
else
{
while (a != b)
{
distance--;
a--;
}
}
return distance;
}
下面我想讲下关于count_if这个算法的使用,一看就知道,这个算法是用来判断满足期望条件的元素的数量的.
#include
#include
#include
using namespace std;
//这是一个模板函数.
template <typename T>
bool demand(T a)
{
return (a > 5);
}
int main()
{
vector<int> s = {2,4,6,1,3,9,7,55,5};
//STL中的算法,前两个参数基本都是表示范围,count_if统计让第三个参数返回true的元素的数量.
cout << count_if(s.begin(), s.end(), demand<int>) << endl; //输出4.
system("pause");
return 0;
}
当然也会有人说,那我能不能把这个函数的操作放在类中进行呢.这也是可以的,这就相当于仿函数了.这是重载了()操作符.类代码如下:
template <typename T>
class Demand
{
public:
bool operator()(T a)
{
return (a > 5);
}
};
int main()
{
vector<int> s = {2,4,6,1,3,9,7,55,5};
//注意这里的()不要忘记...
cout << count_if(s.begin(), s.end(), Demand<int>()) << endl;
system("pause");
return 0;
}
然而为了统计这些简单的数量,而去写一个函数或者类,实在有些繁琐.所以在STL的配接器中,也有一些已经定义好的函数可以直接使用来完成功能.强烈推荐这种方式!!!
#include
#include
#include
#include
using namespace std;
int main()
{
vector<int> s = {2,4,6,1,3,9,7,55,5};
//只需要这样就可以直接得出结果啦~是不是很神奇呢...原来greater是STL内置的仿函数,而bind2nd是和仿函数配接使用的函数,可以用来进行参数绑定,这里我们绑定了5,所以求的就是大于5的元素个数.
cout << count_if(s.begin(), s.end(), bind2nd(greater<int>(), 5)) << endl;
system("pause");
return 0;
}
以下是count_if的手工实现:
相比之下,lua就不用模板了,直接变量放在参数列表中就好了,,,这就是动态语言和静态语言的不一样…难受啊…
template
int myCount_if(T a, T b, C temp)
{
int count = 0;
while (a != b)
{
if (temp(*a++))
count++;
}
return count;
}