Essential C++浓缩笔记(三)——泛型编程风格

一、Array如何传入函数,以及如何被函数返回

传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。因此下面三种声明方式的结果是一样的:

void myFunction(int *param)  {...}        //方式1
void myFunction(int param[3]){...}        //方式2
void myFunction(int param[]) {...}        //方式3

 

二、了解泛型指针

定义:(例: vector::iterator iter = svec.begin();

iter被定义为一个iterator,指向一个vector,后者的元素类型是string,初值指向svec的第一个元素。 

通过iterator取得元素值:提领方式

通过iter调用底部string元素提供的操作,使用arrow运算符(->)

 

三、泛型算法

泛型算法能带来更大的弹性,而且能减少程序员的负担, 泛型算法包含很多基本的函数如find(),copy(),sort()等。

摘抄书上附录的一段话,这段话基本把泛型算法讲明白了,其他的主要还是多上手敲代码。

“算法通常有重载的两个版本:版本一使用底层元素所属之类型的内置运算符,包括equality运算符和less-than运算符。版本之二接受function object或者function pointer的传入,借此提供和内置运算符不同的行为。例如,默认情形下,sort()会使用less-than运算符来对容器内的元素排序。如果要改变这一行为,我们可以传入预先定义好的greater function object”

sort( vec.begin(), vec.end());
sort( vec.begin(), vec.end(), greater());

 

四、使用Iterator Inserter

使用前要包含iterator头文件,insertion adapter不能用在Array中。

 

五、使用Iostream Iterator

供输入及输出使用的Iostream Iterator类,称为istream_iterator和ostream_iterator。

使用前,需要包含iterator头文件

定义方法:

istream_iterator is(cin);        //定义first iterator
istream_iterator eof;            //不指定istream对象便代表了end-of-file

ostream_iterator os(cout," ");    //定义ostream

//从文件中读取和写入,只需要绑定ifstream object对象或ofstream object对象即可
ifstream in_file("input_file.txt";
...
istream_iterator is(in_file);

 

六、程序实现

Task1:对于一个vector,输入一个数,如果这个数在vector内,返回这个数地址,利用泛型指针将vector扩展到任意容器

#include
#include
#include
#include
#include
using namespace std;

int arr[4] = { 1,2,4,5 };
vector vec(arr, arr + 4);

template
Iteratortype find(type &num, Iteratortype iter_st, Iteratortype iter_ed);

int main() {		
	vector::iterator iter_st = vec.begin();
	vector::iterator iter_ed = vec.end();
	int num;
	cout << "please input a number:" << endl;
	cin >> num;	
	vector::iterator it;
	it = find(num, iter_st, iter_ed);
	cout << *it << endl;
	
	getchar();
	return 0;
}

//利用泛型指针处理所有容器
template
Iteratortype find(type &num, Iteratortype iter_st, Iteratortype iter_ed) {	
	for (; iter_st != iter_ed; iter_st++) {
		if (num == *iter_st)
			return iter_st;
	}
	return iter_ed;
}

 

Task2:使用泛型算法,使得函数能进一步处理任何运算操作(如大于某个值,小于某个值)

#include
#include
#include
#include
#include
#include
#include
using namespace std;

template 
void show_vec(vector &vec); 
template
outpuIterator filter(inputIterator first, inputIterator last, outpuIterator at, type &val, comp pred);

int ia[8] = { 1,3,6,10,15,21,28,36 };
vector ivec(ia, ia + 8);
list ilist(ia, ia + 8);

string sa[10] = { "the","light","untonsured","hair","grained","and","hued","like","pale","oak" };
vector svec(sa, sa + 10);
list slist(sa, sa + 10);

int main() {
	vector temp(8);
	int val = 10;		
	cout << "array for values less than 10:"<());//之前报错的原因是:没有输入一个泛型指针对象 temp.begin()	

	getchar();
	return 0;
}

template 
outpuIterator filter(inputIterator first, inputIterator last, outpuIterator at, type &val, comp pred){	
	while ((first = find_if(first, last, bind2nd(pred, val))) != last) {
		cout << "found value: " << *first << endl;			
		*at++ = *first++;		
	}	
	return at;
}

 

七、编程过程遇到的问题&&总结

1、ERROR:“Iterator":类型 从属名称的使用必须以“typename”为前缀

P74页下面display函数显示有问题

https://blog.csdn.net/darennet/article/details/40950577

https://blog.csdn.net/weixin_43256707/article/details/103099979

2、间接寻址非法问题

template 
outpuIterator filter(inputIterator first, inputIterator last, outpuIterator at, type &val, comp pred) {
	type temp;
	while ((first = find_if(first, last, bind2nd(pred, val))) != last) {
		cout << "found value: " << *first << endl;		
		*at++ = *first++;	
	}	
	return at;
}

有时候如果怎么修改还是报错,有可能不是函数定义的问题,有可能是调用的问题。

陷入僵局的时候,最好从头检查一次

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