本帖最后由 JackIO 于 2015-1-18 19:43 编辑
我手边只有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啦。示例代码如下图:
|