一、Array如何传入函数,以及如何被函数返回
传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。因此下面三种声明方式的结果是一样的:
void myFunction(int *param) {...} //方式1
void myFunction(int param[3]){...} //方式2
void myFunction(int param[]) {...} //方式3
二、了解泛型指针
定义:(例: vector
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;
}
有时候如果怎么修改还是报错,有可能不是函数定义的问题,有可能是调用的问题。
陷入僵局的时候,最好从头检查一次