zpd2009 发表于 2015-1-17 22:34:36

C++ primer第五版 第10章 关于fill_n方法

fill_n(dest, n, val)必须确定从dest开始的序列至少包含n个元素。
fill_n(back_inserter(vec), 10, 0)这样却可以在vec后面添加10个元素,书上的解释:
由于我们传递的参数是back_inserter返回的迭代器,因此每次赋值都会在vec上调用push_back。

不理解 - -。。

JackIO 发表于 2015-1-18 16:06:39

楼主把该问题具体在第10章的哪一节或者是哪一页给出来吧,我刚刚在第四版上没找到,目前手中还没有第五版。:)

zpd2009 发表于 2015-1-18 17:41:58

JackIO 发表于 2015-1-18 16:06
楼主把该问题具体在第10章的哪一节或者是哪一页给出来吧,我刚刚在第四版上没找到,目前手中还没有第五版。 ...

泛型算法那一章,介绍的back_inserter,第五版在341页

JackIO 发表于 2015-1-18 19:40:41

本帖最后由 JackIO 于 2015-1-18 19:43 编辑

zpd2009 发表于 2015-1-18 17:41
泛型算法那一章,介绍的back_inserter,第五版在341页
我手边只有C++ Primer中文第四版。不过,我在这本书的第11章(泛型算法)中的“11.2.2写容器元素的算法”一节中找到了楼主所说的问题。你不妨结合前面(2.不检查写入操作的算法)这部分来理解。
                                                                           vector<int> vec;fill_n(vec.begin(),10,0);书中也说了,fill_n()函数带有三个参数:一个迭代器、一个计数器以及一个值。该函数的功能是从迭代器指向的元素开始,将指定数量的元素设置为给定的值。例如fill_n(vec.begin(),10,0),它的功能就是从容器vec(更具体一点是向量vec)的第一个元素开始将vec中的前10个元素的值都替换成0,即不管之前vec容器中的前10个值是什么,调用这个函数之后,vec中的前10个值就会都变成0。
但是,注意,这里有一个前提,那就是vec中本来的元素个数一定要大于等于10个才可以,否则会出现错误,这也是我们常常犯的错误。
所以,为了避免以后我们不小心犯这个错误。C++中引入了函数back_inserter(插入迭代器),并使用fill_n(back_inserter(vec),10,0)来实现该功能,而又不会出错。


使用back_inserter(vec)时,会在容器vec中最后一个元素的后面添加一个新元素,其值等于赋值运算的右操作数。
即,如果vec原来为空,那么我执行语句“back_inserter(vec)=9;”之后,那么vec中就有了一个元素9。


所以,此时fill_n(back_inserter(vec),10,0)的实现流程是,在vec最后一个元素的后面插入10个0值,当然此时即使vec为空或者元素个数小于10也没关系,因为程序是直接在vec里面插入10个值为0的元素的,而不是用0值替换vec中原有的10个元素值。在vec中末尾添加元素值,肯定要调用push_back啦。示例代码如下图:



zpd2009 发表于 2015-1-19 20:46:45

JackIO 发表于 2015-1-18 19:40
我手边只有C++ Primer中文第四版。不过,我在这本书的第11章(泛型算法)中的“11.2.2写容器元素的算法” ...

搜带师奶,thanks:handshake

JackIO 发表于 2015-1-19 21:09:46

zpd2009 发表于 2015-1-19 20:46
搜带师奶,thanks

不客气,共同学习。:handshake

美丽中带着刺 发表于 2015-8-2 11:10:00

页: [1]
查看完整版本: C++ primer第五版 第10章 关于fill_n方法