我正在制作我自己的矢量容器,并且我正在嘗試使用 C 98 標準實作一個像真正的迭代器一樣作業的迭代器。
這是作業,所以我不希望答案只是暗示我應該看哪里以及我應該學習什么才能解決這個問題。
所以基本上我試圖讓這段代碼作業:
ft::vector<int> v (100, 100);
ft::vector<int>::iterator it = v.begin();
ft::vector<int>::const_iterator cit = it;
std::cout << (cit == it) << std::endl; //comparison 1 /// works
std::cout << (it == cit) << std::endl; //comparison 2 /// doesn't compile
std::cout << (cit 1 == it 1) << std::endl; //doesn't work
std::cout << (it 1 == cit 1) << std::endl; //doesn't work
iterator并且const_iterator是這樣的 typedef:
typedef typename ft::iterator_vector<value_type> iterator;
typedef typename ft::iterator_vector<const value_type> const_iterator;
值型別是傳遞給向量模板的型別。
第一次比較沒有作業,直到我在我的迭代器模板中添加了一個用戶定義的轉換運算子來轉換(實際上正如@TedLyngmo 指出的相反),iterator<const foo>為iterator<foo>operator iterator_vector<const value_type>() const { return _p; }
但是編譯器說我現在需要能夠將 a 轉換iterator<const foo>為 a const iterator<foo>,我不知道如何進行。
這是我的迭代器的實作:
template <class T>
class iterator_vector : public ft::iterator<std::random_access_iterator_tag, T> {
public:
typedef ft::iterator<std::random_access_iterator_tag, T> iterator;
typedef ft::iterator_traits<iterator> iterator_traits;
typedef typename iterator_traits::difference_type difference_type;
typedef typename iterator_traits::value_type value_type;
typedef typename iterator_traits::pointer pointer;
typedef typename iterator_traits::reference reference;
typedef typename iterator_traits::iterator_category iterator_category;
/*
** Member functions
*/
iterator_vector(pointer p = 0) : _p(p) {}
~iterator_vector(void) {}
operator iterator_vector<const value_type>() const { return _p; }
iterator_vector& operator () { _p; return *this; }
iterator_vector operator (int)
{
iterator_vector r = *this;
_p;
return r;
}
iterator_vector& operator--() { --_p; return *this; }
iterator_vector operator--(int)
{
iterator_vector r = *this;
--_p;
return r;
}
iterator_vector operator (size_t n) const { return iterator_vector(_p n); }
iterator_vector operator-(size_t n) const { return iterator_vector(_p - n); }
iterator_vector& operator =(size_t n) { _p = n; return *this; }
iterator_vector& operator-=(size_t n) { _p -= n; return *this; }
difference_type operator (iterator_vector rhs) const { return _p rhs._p; }
difference_type operator-(iterator_vector rhs) const { return _p - rhs._p; }
reference operator*(void) const { return *_p; }
pointer operator->() const { return _p; }
reference operator[](size_t n) const { return _p[n]; }
bool operator==(const iterator_vector& rhs) const { return _p == rhs._p; }
bool operator!=(const iterator_vector& rhs) const { return _p != rhs._p; }
bool operator<(const iterator_vector& rhs) const { return _p > rhs._p; }
bool operator>(const iterator_vector& rhs) const { return _p < rhs._p; }
bool operator<=(const iterator_vector& rhs) const { return _p <= rhs._p; }
bool operator>=(const iterator_vector& rhs) const { return _p >= rhs._p; }
/*
** Non-member functions
*/
friend iterator_vector operator (size_t n, const iterator_vector& rhs) { return iterator_vector(rhs._p n); }
friend iterator_vector operator-(size_t n, const iterator_vector& rhs) { return iterator_vector(rhs._p - n); }
private:
pointer _p;
};
uj5u.com熱心網友回復:
從您在代碼中關于什么失敗的評論看來,您缺少何時iterator在左側和const_iterator右側的比較函式。您可以添加此免費功能:
template<typename T>
bool operator==(const iterator_vector<T>& lhs, const iterator_vector<const T>& rhs) {
// just swap the order here and the implicit conversion from `iterator`
// to `const_iterator` from `lhs` solves the rest:
return rhs == lhs;
}
我在迭代器模板中添加了一個用戶定義的轉換運算子以轉換
iterator<const foo>為iterator<foo>
不,您以相反的方式添加了隱式轉換。也就是說,從iterator到const_iterator- 這很好!
另一種方法是使兩個迭代器friend不必為所有運算子實作類似的lhs與rhs函式的交換。模板中的運算子將變為:
// define these before your class template (borrowed from C 11):
template< class T > struct remove_const { typedef T type; };
template< class T > struct remove_const<const T> { typedef T type; };
//... in your class template:
friend class iterator_vector<typename remove_const<T>::type>;
friend class iterator_vector<const T>;
template<typename U>
bool operator==(const iterator_vector<U>& rhs) const { return _p == rhs._p; }
template<typename U>
bool operator!=(const iterator_vector<U>& rhs) const { return _p != rhs._p; }
template<typename U>
bool operator<(const iterator_vector<U>& rhs) const { return _p > rhs._p; }
template<typename U>
bool operator>(const iterator_vector<U>& rhs) const { return _p < rhs._p; }
template<typename U>
bool operator<=(const iterator_vector<U>& rhs) const { return _p <= rhs._p; }
template<typename U>
bool operator>=(const iterator_vector<U>& rhs) const { return _p >= rhs._p; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/376717.html
上一篇:C 獲取模板函式引數的名稱
