# 条款46：考虑使用函数对象代替函数作算法的参数

## 条款46：考虑使用函数对象代替函数作算法的参数

```vector<double> v;
...
sort(v.begin(), v.end(), greater<double>());
```

```inline
bool doubleGreater(double d1, double d2)
{
return dl > d2;
}
...
sort(v.begin(), v.end(), doubleGreater);
```

`sort(v.begin(), v.end(), doubleGreater);`

```void sort(vector<double>::iterator first,			// 区间起点
vector<double>::iterator last,		// 区间终点
bool (*comp)(double, double));		// 比较函数
```

```set<string> s;
...
transform(s.begin(), s.end(),
ostream_iterator<string::size_type>(cout, "\n"),
mem_fun_ref(&string::size));
```

```struct StringSize:
public unary_function<string, string::size_type>{	// 参见条款40
string::size_type operator()(const string& s) const
{
return s.size();
}
};

transform(s.begin(), s.end(),
ostream_iterator<string::size_type>(cout, "\n"),
StringSize());
```

```template<typename FPType>					// 返回两个
FPTypeaverage(FPType val1, FPType val2)			// 浮点数的平均值
{
return (val1 + val2) / 2;
}

template<typename InputIter1,
typename InputIter2>
void writeAverages(InputIter1 begin1,			// 把两个序列的
InputIter1 end1,		// 成对的平均值
InputIter2 begin2,		// 写入一个流
ostream& s)
{
transform(
begin1, end1, begin2,
ostream_iterator<typename iterator_traits
<lnputIter1>::value_type> (s, "\n"),
average<typename iteraror_traits
<InputIter1>::value_type>	// 有错？
);
}
```

```template<typename FPType>
struct Average:
public binary_function<FPType, FPType, FPType>{		// 参见条款40
FPType operator()(FPType val1. FPType val2) const
{
return average(val 1 , val2);
}

template<typename InputIter1, typename InputIter2>
void writeAverages(lnputIter1 begin1, InputIter1 end1,
InputIter2 begin2, ostream& s)
{
transform(
begin1, end1, begin2,
ostream_iterator<typename iterator_traits<lnputIter1>
::value_type>(s, "\n"),
Average<typename iterator_traits<InputIter1>
::value_type>()
);
}
```