繁体   English   中英

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

[英]How to determine whether output iterator has been modified

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

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()如果将元素插入到Output ,则返回true ,但是我遇到了编译错误(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值?

编写一个包装迭代器,该迭代器将委派到另一个迭代器,您可以从插入迭代器构造该迭代器。 然后,您的委托人可以在operator=方法中将modified成员设置为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; }
};

OutputIterators不允许这样做。 但是在您的情况下,是什么导致您无法返回Input1 != Input2呢?

您至少具有以下两个选项:

  1. 编写自己的版本inserter ,该版本inserter将一个额外的布尔参考参数作为参数,如果cont.insert (...).second为true,则将其设置为true。
  2. 在调用方代码中的“ if”语句之前,请存储容器的大小。 如果在调用之后它具有更多元素,那么您知道副本插入了元素。

如果大小成本不是O(1),则第二种选择具有潜在的性能考虑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM