低调、勤奋。
分类: C/C++
2013-01-06 21:32:39
写入到输入序列的一个简单算法是 fill 函数,考虑如下例子:
fill(vec.begin(), vec.end(), 0); // reset each element to 0back_inserter 函数是迭代器适配器。与容器适配器()一样,迭代器适配器使用一个对象作为实参,并生成一个适应其实参行为的新对象。在本例中,传递给 back_inserter 的实参是一个容器的引用。back_inserter 生成一个绑定在该容器上的插入迭代器。在试图通过这个迭代器给元素赋值时,赋值运算将调用 push_back 在容器中添加一个具有指定值的元素。使用 back_inserter 可以生成一个指向 fill_n 写入目标的迭代器:
vector
// ok: back_inserter creates an insert iterator that adds elements to vec
fill_n (back_inserter(vec), 10, 0); // appends 10 elements to vec
现在,fill_n 函数每写入一个值,都会通过 back_inserter 生成的插入迭代器实现。效果相当于在 vec 上调用 push_back,在 vec 末尾添加 10 个元素,每个元素的值都是 0。
写入到目标迭代器的算法
copy 从输入范围中读取元素,然后将它们复制给目标 ivec。
算法的 _copy 版本
replace 算法就是一个很好的例子。该算法对输入序列做读写操作,将序列中特定的值替换为新的值。该算法带有四个形参:一对指定输入范围的迭代器和两个值。每一个等于第一值的元素替换成第二个值。
// replace any element with value of 0 by 42
replace(ilst.begin(), ilst.end(), 0, 42);
这个调用将所有值为 0 的实例替换成 42。如果不想改变原来的序列,则调 用 replace_copy。这个算法接受第三个迭代器实参,指定保存调整后序列的目 标位置。
// create empty vector to hold the replacement
vector
// use back_inserter to grow destination as needed
replace_copy (ilst.begin(), ilst.end(), back_inserter(ivec), 0, 42);
调用该函数后,ilst 没有改变,ivec 存储 ilst 一份副本,而 ilst 内所 有的 0 在 ivec 中都变成了 42。
对容器元素重新排序的算法
unique 的使用
单词按次序排列后,现在的问题是:让故事中所用到的每个单词都只保留一个副本。unique 算法很适合用于解决这个问题,它带有两个指定元素范围的迭代器参数。该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器,表示无重复的值范围的结束。
调用 unique 后,vector 中存储内容是:
注意,words 的大小并没有改变,依然保存着 10 个元素;只是这些元素的顺序改变了。调用 unique“删除”了相邻的重复值。给“删除”加上引号是因为 unique 实际上并没有删除任何元素,而是将无重复的元素复制到序列的前端,从而覆盖相邻的重复元素。unique 返回的迭代器指向超出无重复的元素范围末端的下一位置。
如果要删除重复的项,必须使用容器操作,在本例中调用 erase 实现该功能。这个函数调用从 end_unique 指向的元素开始删除,直到 words 的最后一个元素也删除掉为止。调用之后,words 存储输入的 8 个不相同的元素。
排序算法
标准库定义了四种不同的排序算法,上面只使用了最简单的 sort 算法,使 words 按字典次序排列。除了 sort 之外,标准库还定义了 stable_sort 算法,stable_sort 保留相等元素的原始相对位置。通常,对于已排序的序列,我们并不关心其相等元素的相对位置,毕竟,这些元素是相等的。但是,在这个应用中,我们将“相等”定义为“相同的长度”,有着相同长度的元素还能以字典次序的不同而区分。调用 stable_sort 后,对于长度相同的元素,将保留其字典顺序。
// sort words by size, but maintain alphabetic order for words of the same size stable_sort(words.begin(), words.end(), isShorter);
调用后,words 中的元素按长度大小排序,而长度相同的单词则仍然保持字典顺序:
现在此 vector 对象已经按单词长度排序,剩下的问题就是统计长度不小于 6 的单词个数。使用 count_if 算法处理这个问题:
vector了解程序的细节之后,下面是完整的程序:
// comparison function to be used to sort by word length