stl 迭代器(Iterator)

定义

迭代器(Iterator)是STL(Standard Template Library,标准模板库)中的一个核心概念,用于提供一种通用的方式来遍历容器(如vector、list、map等)中的元素,而无需暴露容器的底层细节。迭代器本质上是一个指针,但它可以指向容器中的元素,而不仅仅是指向内存地址。

迭代器提供了以下基本操作:

  1. begin(): 返回一个指向容器中第一个元素的迭代器。
  2. end(): 返回一个指向容器中最后一个元素之后的位置的迭代器。
  3. *: 解引用运算符,返回迭代器当前指向的元素的值。
  4. ++: 前缀和后缀自增运算符,将迭代器向前移动到下一个元素。
  5. --: 前缀和后缀自减运算符,将迭代器向后移动到前一个元素。
  6. += 和 -=: 用于将迭代器向前或向后移动指定数量的元素。
  7. operator== 和 operator!=: 用于比较两个迭代器是否相等或不相等。

示例

遍历vector

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {1, 2, 3, 4, 5};  
  
    // 使用迭代器遍历vector  
    for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {  
        std::cout << *it << " ";  
    }  
  
    return 0;  
}

STL 迭代器的实现

在STL(Standard Template Library)中,迭代器的实现是高度抽象化的,并且作为模板类存在于各个容器中。由于STL的实现是库的一部分,并且通常作为编译器的标准库提供,所以直接查看STL迭代器的源码可能不是很容易,因为源码通常不包含在标准库中,而是作为库的实现部分,与编译器一起提供。

简单迭代器实现示例

#include <iostream>  
  
// 迭代器类模板  
template<typename T>  
class Iterator {  
public:  
    // 构造函数  
    Iterator(T* ptr) : ptr_(ptr) {}  
  
    // 解引用运算符  
    T& operator*() const {  
        return *ptr_;  
    }  
  
    // 前缀自增运算符  
    Iterator& operator++() {  
        ++ptr_;  
        return *this;  
    }  
  
    // 后缀自增运算符  
    Iterator operator++(int) {  
        Iterator temp = *this;  
        ++ptr_;  
        return temp;  
    }  
  
    // 不相等运算符  
    bool operator!=(const Iterator& other) const {  
        return ptr_ != other.ptr_;  
    }  
  
private:  
    T* ptr_; // 指向元素的指针  
};  
  
// 容器类模板  
template<typename T, std::size_t N>  
class Array {  
public:  
    // 类型别名,方便使用  
    using iterator = Iterator<T>;  
  
    // 获取迭代器指向容器的开始  
    iterator begin() {  
        return iterator(data_);  
    }  
  
    // 获取迭代器指向容器的结束(尾后迭代器)  
    iterator end() {  
        return iterator(data_ + N);  
    }  
  
    // 数组数据  
    T data_[N];  
};  
  
int main() {  
    // 创建一个包含整数的数组容器  
    Array<int, 5> arr = {1, 2, 3, 4, 5};  
  
    // 使用迭代器遍历数组  
    for (auto it = arr.begin(); it != arr.end(); ++it) {  
        std::cout << *it << " ";  
    }  
  
    return 0;  
}

在这个示例中,我们定义了一个Iterator类模板,它接受一个类型参数T,代表迭代器将指向的元素类型。迭代器包含了一个指向元素的指针,并重载了*++!=运算符,这些都是STL迭代器通常提供的操作。

我们还定义了一个Array类模板,它包含了一个固定大小的数组和一个使用我们定义的迭代器类型的beginend成员函数。这个Array类模板提供了一个简单的容器接口,可以通过迭代器来访问其元素。

请注意,这个示例只是为了展示迭代器的基本概念和操作,并不能代表STL中迭代器的完整和高效实现。在实际的STL库中,迭代器的实现会更加复杂,并且会考虑到性能优化、类型安全和异常安全等因素。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值