如何确定输出迭代器是否已被修改

时间:2009-08-20 12:47:03

标签: c++ stl iterator

我有一个模板函数,它采用以下形式:

template < class ITER1, class ITER2 >
bool example(ITER1 Input1, ITER1 Input2, ITER2 Output)
{
    ITER2 OrigOutput(Output);

    // ...

    std::copy(Input1, Input2, Output);

    return (OrigOutput != Output);
}

我正在呼叫example()

std::vector < int > Input;
std::set < int > Output;

if (example(Input.begin(), Input.end(), inserter(Output, Output.begin())))
{
    ...
}

如果元素已插入example(),我希望true返回Output,但是我收到编译错误(msvc 2008):

Error 1 error C2678: binary '!=' : no operator found which takes a left-hand 
operand of type 'std::insert_iterator<_Container>' (or there is no acceptable 
conversion)

有没有办法可以确定是否有任何元素插入到输出迭代器中以返回正确的bool值?

3 个答案:

答案 0 :(得分:4)

编写一个包装器迭代器,它将分隔到另一个迭代器,您可以从插入迭代器构造它。然后,您的代理人可以在modified方法中将operator=成员设置为true。

有些事情如下:

template<typename ITER>
class ModifiedIterator : public std::iterator<std::output_iterator_tag, void, void, void, void>
{
protected:
    typedef ITER Iter;
    Iter iter;
    bool& isModified;

public:
    explicit ModifiedIterator (Iter i, bool& isMod)
    : iter(i), isModified (isMod)
    {}

    template<typename T>
    ModifiedIterator& operator= (const T& value)
    {
        iter = value;
        ++iter;
        isModified = true;
        return *this;
    }

    ModifiedIterator& operator* () { return *this; }
    ModifiedIterator& operator++ () { return *this; }
    ModifiedIterator operator++ (int) { return *this; }
};

答案 1 :(得分:1)

OutputIterators不允许这样做。但在你的情况下,是什么阻止你返回Input1 != Input2

答案 2 :(得分:1)

您至少有以下两个选项:

  1. 编写您自己的版本inserter,它将一个额外的布尔引用参数作为参数,如果cont.insert (...).second为真,则设置为true。
  2. 在调用者代码中的'if'语句之前,存储容器的大小。如果在调用后它有更多的元素,那么你知道复制插入的元素。
  3. 如果尺寸成本不是O(1),则第二个选项具有潜在的性能考虑因素。