接触到 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 行,这个地方,他只是判等,一旦不等,就把后面的覆盖到前面来,那么,就需要要求,原来的序列里面,相同的元素是相邻的,另外,他只是覆盖,并不删除后面的,那么就要求,调用完这个函数之后,还要自己去把后面的也给删除了。