第十一章:泛型算法
1:算法
find,count:读算法,头文件algorithm;
copy, replace,replace_copy:写算法,头文件algorithm;
find_first_of,accumulate:读算法,头文件numeric;
fill,fill_n:写算法,头文件xutility;
back_inserter:写算法,头文件iterator;
2:算法不改变容器的大小,真理在于让算法独立于容器,而达到普遍性,泛性,使得设计更为简单
3: 理解下面程序代码:
istream_iterator<int> in_iter(cin); // read ints from cin istream_iterator<int> eof; // istream "end" iterator // read until end of file, storing what was read in vec while (in_iter != eof) // increment advances the stream to the next value // dereference reads next value from the istream vec.push_back(*in_iter++);
对于istream_iterator<int> in_iter(cin); 表示构建了一个流输入迭代器,且通过cin将该迭代器已经准备好了,只要解引用则就可以将输入数据获取到返回来。比如此时用*in_iter时会将流中第一个元素输入其中;但是留意的是*in_iter是获取流中数据返回其值;若在解引用时发现流中没有数据,自然会告诉流,让流提示客户输入数据。
对于*in_iter++操作,其实质是*in_iter ;in_iter++;而在定义流迭代器时,就已经准备好一个数据待接收了;故而在*in_iter提示接收数据,而在in_iter++还会提示接收数据,因为迭代器指向此流时没有数据。验证:int c=*in_iter;in_iter++;c=*in_iter;第一个会提示输入,是因为in_iter迭代器指向的流没有数据需要输入;而第二将迭代器转下一个时,发现没有任何数据对应,故而提示客户输入数据;而在第3个语句时,由于只是解引用,而此处的迭代器所指流是有数据的,故而不需要提示输入了。
其整个过程实质是指:定义迭代器时,已经有输入了,只是由于是定义,且没有使用其中数据,故而没有提示;因此第一个解引用就会提示输入;后面的只要迭代器指向下个,则就该填入所指处的值,故而需要提示输入。
对于*in_iter++操作过程还得考虑优先级问题,是先运行in_iter++;后运行*in_iter;因此,假设输入1 2 ;则先将1收入,且移动后将2也收入了,而*in_iter是将第一个迭代器解引用了,故而可以获取其中的值;但是到下一次循环时,in_iter++则由于没有数据了,故而需要提示输入,则只有输入了,才会*in_iter获得2值;故而输入是1 2 \n ctl+z \n 输出才会是1 2;
1 2
1--获取1
ctl+z
2--获取2
明显语句:
istream_iterator<int> itin(cin); istream_iterator<int> itin1(cin); istream_iterator<int> eof; while(itin!=eof) { ivec.push_back(*itin); itin++; }
可以看到输入是1 2 3 时,只是获得了1 3 ,因为2 已经被itin1获取了。
4:对于list对象,应该优先使用list容器特有的成员版本,而不是泛型算法。