C++ 输入和输出迭代器

C++ 输入和输出迭代器,c++,iterator,C++,Iterator,我有一个关于使用输入和输出迭代器的练习问题。函数的标题如下所示 template<class InpIter,class OutpIter> OutpIter my_unique_copy(InpIter first, InpIter last, OutpIter result) 模板 输出程序我的\u唯一\u副本(输入程序第一,输入程序最后,输出程序结果) 函数应将元素从范围[第一,最后]复制到结果。在连续的重复元素组中,仅复制第一个值。返回值是元素复制到的范围的终点。 复杂性

我有一个关于使用输入和输出迭代器的练习问题。函数的标题如下所示

template<class InpIter,class OutpIter>
OutpIter my_unique_copy(InpIter first, InpIter last, OutpIter result)
模板
输出程序我的\u唯一\u副本(输入程序第一,输入程序最后,输出程序结果)
函数应将元素从范围[第一,最后]复制到结果。在连续的重复元素组中,仅复制第一个值。返回值是元素复制到的范围的终点。 复杂性:线性

我知道该怎么做了,只是想寻求一些帮助,因为我还不太习惯使用迭代器

template<class InpIter,class OutpIter>
OutpIter my_unique_copy(InpIter first, InpIter last, OutpIter result){
    InpIter current=first;
    first++;//point to second element
    while(first!=last){
        while(*first==*current){//Keep comparing elements to current to see if they're same
            first++;
        }
        result=current;
        current=first;
        result++;
        first++;
    }
    return result;
}
模板
输出程序我的\u唯一\u副本(输入程序第一,输入程序最后,输出程序结果){
输入电流=第一;
第一个+++;//指向第二个元素
while(第一个!=最后一个){
而(*first==*current){//将元素与当前元素进行比较,看看它们是否相同
第一++;
}
结果=电流;
电流=第一;
结果++;
第一++;
}
返回结果;
}

我想这就是你想要的,每一步都有解释

template<class InpIter,class OutpIter>
OutpIter my_unique_copy(InpIter first, InpIter last, OutpIter result)
{
    // keep going until end of sequence
    while(first!=last)
    {
        // save current position.
        InpIter current=first;

        // advance first, test it against last, and if not
        // equal, test what it references against current.
        // repeat this until *first != *current, or first == last
        while (++first != last && *first == *current);

        // not matter what dropped the loop above, we still have
        // our current, so save it off and advance result.
        *result++ = *current;
    }

    // not sure why you want to return the first iterator position
    // *past* the last insertion, but I kept this as-is regardless.
    return result;
}

好的,问题是什么?:)编译器不会咬人。。。唯一让你感到舒服的方法就是尝试一下。你也可以使用
unique\u copy()
如果
first==last
它也不通过输出迭代器
result
写入,这有点重要,不是吗?太棒了!我不确定返回,但这是规范使它听起来像。最后一件事,在while循环中,我猜我们会先递增,直到它不再等于current,这意味着我们可以存储current并从下一个不同的值开始。我不确定我是否遵循了最后一件事。我试图解释内部while循环逻辑是如何工作的。它使用布尔短路求值来不遵从
第一个
,除非我们知道它不是
最后一个
。确切的顺序是1。增量
第一个
,2。检查它是否是最后一个,如果是,则断开。3.检查是否
*first==*current
,如果它们不相等,则断开。否则返回到1。希望这是有意义的。如果您想知道,在我们保存
*结果后,如果不将
当前
重置为第一个,这是如何工作的,请问问自己,将其保存为什么?我们将这样做:
current=first
。但这正是内部while循环上面的代码所做的。它将再次执行(除非
first==last
)。真的为我澄清了一些事情,非常感谢
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    int ar[] = { 1,2,2,3,3,3,4,5,5,6,7,7,7,7,8 };
    int res[10] = {0};

    int *p = my_unique_copy(std::begin(ar), std::end(ar), res);
    std::copy(res, p, std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
1 2 3 4 5 6 7 8