问题描述
我正在尝试为我的容器实现迭代器,但有一些情况告诉我我走错了路,我想听听如何正确实现常量和反向迭代器。
error: cannot convert 'Node<int>*' to 'Node<const int>*' in initialization
73 | Iterator<Type>::Iterator(Node<TypeIter>* n_ptr) : data(n_ptr)
实现
//-------------------------------------------------------------------------------------------------
template <typename Type>
class Node
{
public:
Type element;
Node<Type>* prev;
Node<Type>* next;
public:
Node() : element(),prev(nullptr),next(nullptr) {};
Node(const Type& elem,Node* prev,Node* next) : element(elem),prev(prev),next(next) {};
Node(const Node& node) : Node(node.element,node.prev,node.next) {};
};
//-------------------------------------------------------------------------------------------------
template <typename Type>
class Iterator
{
public:
using difference_type = std::ptrdiff_t;
using value_type = std::remove_cv_t<Type>;
using pointer = Type*;
using reference = Type&;
using iterator_category = std::random_access_iterator_tag;
using iterator_concept = std::contiguous_iterator_tag;
public:
Node<Type>* data;
public:
explicit Iterator(Node<Type>* ptr = nullptr);
Iterator(const Iterator& iterator);
template<typename TypeIter>
explicit Iterator(Node<TypeIter>* ptr = nullptr);
template<typename TypeIter>
explicit Iterator(const Iterator<TypeIter>& iterator);
~Iterator() = default;
bool operator==(const Iterator& lhs) const;
bool operator!=(const Iterator& lhs) const;
Iterator operator++();
Iterator operator++(int post);
Iterator operator--();
Iterator operator--(int post);
Type& operator*();
};
//-------------------------------------------------------------------------------------------------
namespace std
{
template <typename Type>
struct iterator_traits<Iterator<Type>>
{
using difference_type = std::ptrdiff_t;
using value_type = std::remove_cv_t<Type>;
using pointer = Type*;
using reference = Type&;
using iterator_category = std::random_access_iterator_tag;
using iterator_concept = std::contiguous_iterator_tag;
};
} // namespace std
//-------------------------------------------------------------------------------------------------
template <typename Type>
class Deque
{
public:
//Using
using iterator = Iterator<Type>;
using const_iterator = Iterator<const Type>;
using reverse_iterator = std::reverse_iterator<iterator>;
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
据我了解,这与以下事实有关:我有2个不同的模板,一个带有const,另一个没有。
using iterator = Iterator<Type>;
using const_iterator = Iterator<const Type>;
主要
int main()
{
Deque<int> test;
test.push_back(123);
test.push_back(77);
test.push_back(1);
test.push_back(777);
test.push_back(321);
test.push_back(111);
test.push_back(12);
test.push_back(1000);
std::cout << test.front() << '\n';
std::cout << test.back() << '\n';
std::cout << "==========" << '\n';
auto [min_it,max_it] = std::minmax_element(std::begin(test),std::end(test));
std::cout << *min_it << " - " << *max_it << '\n';
auto [min_it1,max_it1] = std::minmax_element(std::rbegin(test),std::rend(test));
std::cout << *min_it1 << " - " << *max_it1 << '\n';
auto [min_it2,max_it2] = std::minmax_element(std::cbegin(test),std::cend(test));
std::cout << *min_it2 << " - " << *max_it2 << '\n';
Deque<int>::const_iterator cIter;
std::cout << "The const itr deque is: ( ";
for (cIter = test.cbegin(); cIter != test.cend(); ++cIter)
{
std::cout << *Iter << " ";
}
std::cout << ")." << std::endl;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)