Think in in C++[vol2]【6】通用算法

  • 标准模板库(STL)是标准C++库的子集。
  • copy(a, a + SIZE, b ):
    前两个参数表示输入序列的范围。第1指针指向该序列的第1个元素的起始位置,第2 个指针指向数组的超越末尾的位置,第3个指针指向输出序列的位置。
template<typename T> void copy(T* begin, T*end, T* dest) {
    
    
	while (begin != end)
		*begin++ = *dest**;
}
  • 迭代器Iterator本质上与指针相同,所以可以在标准库中以一种能够接受迭代器和指针两种参数的方式来实现算法。
template<typename T> void copy(Iterator* begin, Iterator*end, Iterator* dest) {
    
    
	while (begin != end)
		*begin++ = *dest**;
}

1.判定函数

  • remove_copy_if():第3个参数是一个指向判定函数的指针,
    这个指针有一个与序列中元素同类型的参数,并且必须返回一个布尔型的值

//You supply this predicate
bool gt15(int x) {
    
     return 15 < x ;}

int main(int argc, char const *argv[])
{
    
    
	int a[] = {
    
    10, 20, 30};
	const size_t SIZE = sizeof a / sizeof a[0];
	int b[SIZE];
	//remove_copy_if():第3个参数是一个指向判定函数的指针,
	//这个指针有一个与序列中元素同类型的参数,并且必须返回一个布尔型的值
	int* endb = remove_copy_if(a, a+SIZE, b, gt15);
	int* beginb = b;
	while(beginb != endb)
		cout << *beginb++ << endl;

	return 0;
}

2.流迭代器

  • remove_copy_if(a, a+SIZE, ostream_iterator(cout, “\n”), gt15);
    ostream_iterator的这个特殊实例应用于输出流cout。每次remove_copy_if()通过迭代器对cout赋一个来自输入序列a的整数。即迭代器向cout写入这个整数,并且随后还自动写入一个单独的字符串(此处是’\n’)的一个实例。
bool gt15(int x) {
    
     return 15 < x; }
int main(int argc, char const *argv[])
{
    
    
	int a[] = {
    
    10, 20, 30;}
	const size_t SIZE = sizeof a / sizeof a[0];
	remove_copy_if(a, a+SIZE, ostream_iterator<int>(cout, "\n"), gt15)return 0;
}

3.函数对象

  • 函数对象时重载了 operator() 的类的一个实例,operator()是函数调用运算符。这个运算符允许用函数调用语法并使用对象。如同其他对象一样,可以通过该对象的构造函数来初始化它。

    
    class gt_n
    {
          
          
    	int value;
    public:
    	gt_n(int val) : value(val) {
          
          }
    	bool operator()(int n) {
          
           return n > value; }
    	~gt_n(){
          
          }
    	
    };
    
    int main(int argc, char const *argv[])
    {
          
          
    	gt_n f(4);
    	cout << f(3) << endl;
    	cout << f(5) << endl; 
    }
    

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/113783983