类别: 算法 | 组件类型: 函数 |
template <class ForwardIterator> ForwardIterator unique(ForwardIterator first, ForwardIterator last); template <class ForwardIterator, class BinaryPredicate> ForwardIterator unique(ForwardIterator first, ForwardIterator last, BinaryPredicate binary_pred);
存在两个不同版本的unique原因是存在两个不同定义,描述了连续组元素与自身副本的含义。在第一个版本中,测试是简单的相等性:范围内元素[f, l)是副本,如果对于范围内的每个迭代器i,要么i == f,要么*i == *(i-1)。在第二个版本中,测试是一个任意的 二元谓词binary_pred:中的元素[f, l)是副本,如果对于范围内的每个迭代器i,要么i == f,要么binary_pred(*i, *(i-1))是true. [2]
vector<int> V; V.push_back(1); V.push_back(3); V.push_back(3); V.push_back(3); V.push_back(2); V.push_back(2); V.push_back(1); vector<int>::iterator new_end = unique(V.begin(), V.end()); copy(V.begin(), new_end, ostream_iterator<int>(cout, " ")); // The output it "1 3 2 1".
s。从char
inline bool eq_nocase(char c1, char c2) { return tolower(c1) == tolower(c2); } inline bool lt_nocase(char c1, char c2) { return tolower(c1) < tolower(c2); } int main() { const char init[] = "The Standard Template Library"; vector<char> V(init, init + sizeof(init)); sort(V.begin(), V.end(), lt_nocase); copy(V.begin(), V.end(), ostream_iterator<char>(cout)); cout << endl; vector<char>::iterator new_end = unique(V.begin(), V.end(), eq_nocase); copy(V.begin(), new_end, ostream_iterator<char>(cout)); cout << endl; } // The output is: // aaaabddeeehiLlmnprrrStTtTy // abdehiLmnprSty
注释Unique[1] 注意,“移除”的含义有些微妙。,如remove,不会销毁任何迭代器,也不会改变first和.(它没有办法完成任何类似的事。)所以,例如,如果V是一个 向量,remove(V.begin(), V.end(), 0)不会改变V.size(): V将只包含比之前少一个元素。Unique返回一个指向元素从中移除后生成范围的末尾的迭代器;其后的元素无关紧要。如果您正在操作 Sequence,您可能希望使用 Sequence'serase成员函数完全放弃这些元素。
[2] 严格来说,第一个版本的unique是冗余的:您可以使用类的对象获得相同的功能equal_to作为 二元谓词 参数。第一个版本严格意义上是出于便捷目的:测试相等性是一个重要的特例。
[3] BinaryPredicate不要求是等价关系。不过,使用unique和不是等价关系的 二元谓词 时需要格外小心:您很容易获得意外的结果。