在C++中,如果你想在自定义的列表迭代器类中将迭代器转换为const_iterator
,你需要确保const_iterator
能够访问但不能修改底层数据。以下是一个简单的例子,展示了如何实现这样的转换:
#include <iostream>
#include <vector>
template <typename T>
class MyList {
public:
class Iterator {
protected:
typename std::vector<T>::iterator it;
public:
Iterator(typename std::vector<T>::iterator iterator) : it(iterator) {}
T& operator*() { return *it; }
T* operator->() { return &(*it); }
Iterator& operator++() { ++it; return *this; }
bool operator!=(const Iterator& other) const { return it != other.it; }
};
class ConstIterator {
protected:
typename std::vector<T>::const_iterator it;
public:
ConstIterator(typename std::vector<T>::const_iterator iterator) : it(iterator) {}
ConstIterator(const Iterator& iterator) : it(iterator.it) {} // 允许从Iterator转换为ConstIterator
const T& operator*() const { return *it; }
const T* operator->() const { return &(*it); }
ConstIterator& operator++() { ++it; return *this; }
bool operator!=(const ConstIterator& other) const { return it != other.it; }
};
MyList(std::initializer_list<T> init) : data(init) {}
Iterator begin() { return Iterator(data.begin()); }
Iterator end() { return Iterator(data.end()); }
ConstIterator begin() const { return ConstIterator(data.begin()); }
ConstIterator end() const { return ConstIterator(data.end()); }
private:
std::vector<T> data;
};
int main() {
MyList<int> list = {1, 2, 3, 4, 5};
// 使用普通迭代器
for (MyList<int>::Iterator it = list.begin(); it != list.end(); ++it) {
std::cout << *it << ' ';
}
std::cout << '\n';
// 使用const_iterator
for (MyList<int>::ConstIterator it = list.begin(); it != list.end(); ++it) {
std::cout << *it << ' ';
}
std::cout << '\n';
// 将普通迭代器转换为const_iterator
MyList<int>::ConstIterator const_it = MyList<int>::ConstIterator(list.begin());
std::cout << *const_it << '\n';
return 0;
}
在这个例子中,MyList
类有两个嵌套的迭代器类:Iterator
和ConstIterator
。Iterator
可以修改元素,而ConstIterator
只能读取元素。ConstIterator
类有一个构造函数,它接受一个Iterator
对象并将其转换为ConstIterator
。这样,你可以安全地将非const迭代器转换为const迭代器,而不需要担心意外修改数据。
这种设计允许你在需要时灵活地使用不同类型的迭代器,并且可以很容易地在它们之间转换。
领取专属 10元无门槛券
手把手带您无忧上云