如何在C++中复制const_iterator

How to copy a const_iterator in C++

本文关键字:const iterator 复制 C++      更新时间:2023-10-16

在我的头文件中,我有

template <typename T>
class Vector {
   public:
       typedef T* iterator;
       typedef const T* const_iterator;
       Vector(const_iterator start, const_iterator end);
       // other stuff ...
}

在.cpp文件中,我有

template <typename T>
Vector< T >::Vector( const_iterator start, const_iterator end ) : theSize( 0 ), theCapacity( 1 )
{
    array = new T[ theCapacity ];
    typename Vector< T >::iterator itr = start; // this is line 29
    for( iterator itr = start; itr != end; itr++ ){
        push_back( *itr );
    }
}

然而编译器告诉我

Vector.cpp:29: error: invalid conversion from ‘const int*’ to ‘int*’

如何在保持参数为const_iterator的同时解决此问题?

注意:如果有帮助的话,我将尝试在开始和结束之间使用另一个Vector的元素来构造Vector。

我看不出在循环中也不使用const_iterator的原因。此外,push_back函数不应该接受迭代器,而应该接受值。

因此,我将把相关部分改写如下:

typename Vector< T >::const_iterator itr = start;
for(const_iterator itr = start; itr != end; itr++ ){
    push_back(*itr);
}

您应该执行push_back(*itr)而不是push_back(itr),这将解决您的问题

for循环只需要使用const_iterator。迭代器的常量仅适用于它的值,它仍然可以递增。你还不如用你已经有的。

Vector(const_iterator pos, const_iterator end)
{
    for( ; pos != end; pos++ ){
        push_back( *pos );
    }
}
正如Andy所说,您需要一个const迭代器。如果您的编译器支持C++11,那么您的代码将变为:
template <typename T>
Vector< T >::Vector( const_iterator start, const_iterator end ) : 
theSize( 0 ), 
theCapacity( 1 )
{
    array = new T[ theCapacity ];
    for( auto itr = start; itr != end; itr++ ){
        push_back( *itr );
    }
}

我还必须问:你确定要手动滚动你自己的矢量吗?你有充分的理由不使用std::vector吗?