簡體   English   中英

如何在C ++中復制const_iterator

[英]How to copy a const_iterator in C++

在我的頭文件中

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 );
    }
}

我還要問:你確定要手動滾動自己的Vector嗎? 你有充分的理由不使用std :: vector嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM