谓词函数predicates和仿函数functors

谓词 函数是一个判断式,一个返回bool值的函数或者仿函数。
C++ standard library P264:并非所有返回布尔值的仿函数都是合法的谓词函数。因为使用两个相同的参数调用一个一元谓词函数,应该总是返回相同的结果(与调用次数无关)。

敲代码的时候犯了一个小错误,写仿函数的operator()时,由于操作符中并未使用额外的参数,所以函数定义时默认成了不传参,结果编译错误。

for(; __first != __last; ++__first)
        if(!bool(__pred(*__first)))
          {
            *__result = _GLIBCXX_MOVE(*__first);
            ++__result;
          }

可以看到​, ​在remove_if算法中,使用谓词函数时传入了*(__first),所以谓词函数定义时,形参应与容器元素类型相同,更不能省略。
正确代码如下:
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

template <class T>
void print_elements(const T& container){
	for(typename T::const_iterator it = container.begin(); it != container.end(); ++it){
		cout << *(it) << " ";
	}
	cout << endl;
}

class Nth{
	private:
		int nth, count;
	public:
		Nth(int n): nth(n), count(0) {}
		int operator() (int){
			return nth == ++count;
		}
};

int main(){
	list<int> coll;
	for (int i = 0; i < 9; ++i)
		coll.push_back(i);
    print_elements(coll);
	list<int>::iterator pos;
	pos = remove_if(coll.begin(), coll.end(), Nth(3));
	coll.erase(pos, coll.end());
	print_elements(coll);
	return 0;
}
运行结果为:

coll: 1 2 3 4 5 6 7 8 9
nth removed: 1 2 4 5 7 8 9





你可能感兴趣的:(C++,STL)