C ++无法从const int *转换为const_iterator

时间:2018-09-11 15:02:24

标签: c++ const-iterator

我已经更新到了更新的C ++编译器(从Visual C ++ 6.0到Visual C ++ 2015),并且我正在努力将Vector模板类转换为兼容的。我遇到的一个错误涉及vector :: erase方法和输入类型。

  • 模板类代码段:

    template<class Type> class Vector {
    public:
        typedef Type* iterator;
        typedef const Type* const_iterator;
    
        ...
    
        iterator erase( const_iterator iBegin );
        iterator erase( const_iterator iBegin, iEnd );
    
    private:
        VectorImpl<Type>* m_pImpl;
    };
    
    ...
    
    template <typename Type> typename Vector<Type>::iterator Vector<Type>::erase( 
    typename Vector<Type>::const_iterator iBegin )
    {
        return m_pImpl->erase( iBegin );
    };
    

    ...

  • 错误:

  

C2440:“正在初始化”:无法从“ const int *”转换为“ std :: _ Vector_const_iterator >>”

通过解引用迭代器,我能够将std :: vector迭代器转换为int *,但是我不确定如何进行逆操作:

template <typename Type> typename Vector<Type>::const_iterator Vector<Type>::begin()
{
    Vector<Type>::const_iterator begin = &(*m_pImpl->begin());
    return begin;
};

问:是否可以将const int *转换为std :: vector const_iterator?

1 个答案:

答案 0 :(得分:1)

  

通过解引用迭代器,我能够将std :: vector迭代器转换为int *,但是我不确定如何进行逆操作

您应该记住,指针和迭代器不是一回事。指针是一种迭代器,但事实并非如此。

您可以通过将某个迭代器带到该元素,然后取消对该迭代器的引用,然后获取结果的地址来获取某个元素的地址。

但是将原始指针转换为迭代器并不是特别有意义。通常,这就像将一些橙汁倒入水中,然后尝试将两者分开。建议全面坚持使用迭代器

但是,请参见下文。

  

是否可以将const int *转换为std :: vector const_iterator?

实际上,是的。如果您知道该指针有效,并且肯定只使用向量,则可以依靠向量数据连续性:

const int* ptr = ...;
const int* first = &vec[0];
const size_t dist = ptr - first;
auto it = vec.cbegin() + dist;

现在it是您想要的。

但这是黑客依赖指针和迭代器算法的方法,前者将仅对向量起作用,而后者仅对序列容器有效(并且需要{{ 1}},因此将其放在其他容器上。

如果没有很好的理由受第三方库的限制,我不会在生产代码中接受这一点。

在我看来,您应该将std::advance换成Vector。我知道,如果您不能(或不想)更改代码的向外接口,则可能会遇到问题。坦率地说,在那种情况下,我将std::vector排除在外,因为这是两个相互独立的实现。