接触到 std 的 unique 这个函数,看了一下实现,自己也写了一下。在读默认的实现的时候发现代码真是的比较坑爹的,缩进啊,花括号啊,之类的,都是不按规范来的。
自己照着写了一个如下
#include <iostream> #include <vector> template<class It> It myUnique(It itBegin, It itEnd) { for (It itBegin2; (itBegin2 = itBegin) != itEnd && ++itBegin != itEnd; ) { if (*itBegin2 == *itBegin) { for (; ++itBegin != itEnd; ) { if (*itBegin2 != *itBegin) { *++itBegin2 = *itBegin; } } return ++itBegin2; } } return itEnd; } template<class It> void iteratorPrint(It itBegin, It itEnd) { while (itBegin != itEnd) { printf("%d\n", *itBegin++); } } int main() { std::vector<int> numbers; numbers.push_back(3); numbers.push_back(4); numbers.push_back(4); numbers.push_back(5); numbers.push_back(5); numbers.push_back(6); numbers.push_back(6); iteratorPrint(numbers.begin(), numbers.end()); printf("--------------------\n"); myUnique(numbers.begin(), numbers.end()); iteratorPrint(numbers.begin(), numbers.end()); return 0; }
输出如下
3 4 4 5 5 6 6 -------------------- 3 4 5 6 5 6 6
注意到代码的 8 到 12 行,这个地方,他只是判等,一旦不等,就把后面的覆盖到前面来,那么,就需要要求,原来的序列里面,相同的元素是相邻的,另外,他只是覆盖,并不删除后面的,那么就要求,调用完这个函数之后,还要自己去把后面的也给删除了。