std unique 的实现

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

Leave a Reply

Your email address will not be published. Required fields are marked *