使用`std::iterator`定义自己的迭代器类型
我们可以使用`std::iterator`来定义自己的迭代器类型,例如:
```cpp
#include <iterator>
template <typename T>
class my_iterator : public std::iterator<std::forward_iterator_tag, T> {
public:
// 构造函数 my_iterator(T* ptr) : ptr_(ptr) {}
// 迭代器操作函数 T& operator*() const { return *ptr_; }
T* operator->() const { return ptr_; }
my_iterator& operator++() { ++ptr_; return *this; }
my_iterator operator++(int) { my_iterator tmp(*this); ++ptr_; return tmp; }
bool operator==(const my_iterator& other) const { return ptr_ == other.ptr_; }
bool operator!=(const my_iterator& other) const { return ptr_ != other.ptr_; }
private:
T* ptr_;
};
```
这里我们定义了一个名为`my_iterator`的迭代器类型,它继承自`std::iterator`,并指定了迭代器的类型标签为`std::forward_iterator_tag`,元素类型为`T`。我们还重载了迭代器操作函数,包括解引用、自增、相等和不等运算符等。
使用迭代器我们可以通过容器的成员函数`begin()`和`end()`来获取迭代器的起始和结束位置,例如:
```cpp#include <vector>
int main() {
std::vector<int> vec {1, 2, 3, 4, 5};
// 使用迭代器遍历容器 for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}
```
在这个例子中,我们使用`std::vector`容器存储了一些整数,然后使用`vec.begin()`和`vec.end()`获取了迭代器的起始和结束位置,然后使用`for`循环遍历了容器中的所有元素,并输出它们的值。
需要注意的是,迭代器的类型和容器的类型必须匹配,否则会编译错误。