C++中的迭代器

59 篇文章 0 订阅
52 篇文章 1 订阅

目录

摘要

迭代器类别

1. 输入迭代器(Input Iterator)

2. 输出迭代器(Output Iterator)

3. 前向迭代器(Forward Iterator)

4. 双向迭代器(Bidirectional Iterator)

5. 随机访问迭代器(Random Access Iterator)

总结

引用


摘要

在 C++ 中,迭代器(iterator)是用于遍历容器(如数组、链表、向量等)元素的对象。标准库(STL)中迭代器是一个重要的概念,类似于指针,但功能更强大。

根据不同的功能和特性,迭代器大致可以分为以下几类:

迭代器类别

- 输入迭代器(Input Iterator
- 输出迭代器(Output Iterator
- 前向迭代器(Forward Iterator
- 双向迭代器(Bidirectional Iterator
- 随机访问迭代器(Random Access Iterator

1. 输入迭代器(Input Iterator)

输入迭代器用于读取数据。它们支持只读访问,每个元素只能读取一次。

#include <iostream>
#include <vector>
#include <iterator>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int>::iterator it = vec.begin();

    std::cout << "Using input iterator: ";
    while (it != vec.end()) {
        std::cout << *it << " ";
        ++it;
    }
    std::cout << std::endl;

    return 0;
}

2. 输出迭代器(Output Iterator)

输出迭代器用于写入数据。它们支持只写访问,每个元素只能写入一次。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main() {
    std::vector<int> vec(5);
    std::ostream_iterator<int> out_it(std::cout, " ");

    for (int i = 0; i < 5; ++i) {
        vec[i] = i + 1;
    }

    std::cout << "Using output iterator: ";
    std::copy(vec.begin(), vec.end(), out_it);
    std::cout << std::endl;

    return 0;
}

3. 前向迭代器(Forward Iterator)

前向迭代器支持读写访问,并且可以多次遍历同一个元素,可以向前移动。

#include <iostream>
#include <forward_list>

int main() {
    std::forward_list<int> flist = {1, 2, 3, 4, 5};

    std::forward_list<int>::iterator it;
    std::cout << "Using forward iterator: ";
    for (it = flist.begin(); it != flist.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

4. 双向迭代器(Bidirectional Iterator)

双向迭代器支持读写访问,可以向前和向后移动。

#include <iostream>
#include <list>

int main() {
    std::list<int> lst = {1, 2, 3, 4, 5};

    std::list<int>::iterator it;
    std::cout << "Using bidirectional iterator (forward): ";
    for (it = lst.begin(); it != lst.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    std::cout << "Using bidirectional iterator (backward): ";
    for (it = lst.end(); it != lst.begin();) {
        --it;
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

5. 随机访问迭代器(Random Access Iterator)

随机访问迭代器支持读写访问,并且可以以常数时间进行任意跳转,提供了类似指针的算术运算功能。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    std::vector<int>::iterator it = vec.begin();
    std::cout << "Using random access iterator: ";
    for (size_t i = 0; i < vec.size(); ++i) {
        std::cout << *(it + i) << " ";
    }
    std::cout << std::endl;

    std::cout << "Using random access iterator for arithmetic operations: ";
    it += 2;
    std::cout << *it << " ";
    it -= 1;
    std::cout << *it << std::endl;

    return 0;
}

总结

1. 有效性:确保迭代器在使用过程中始终有效。例如,插入或删除元素后,某些容器的迭代器可能失效。
2. 边界检查:使用迭代器时,要注意不要超出容器的边界,否则可能会导致泄漏问题。
3. 类型匹配:使用合适的迭代器类型来匹配容器类型。
4. 算法和迭代器:STL 算法通常使用迭代器作为参数,确保传递的迭代器满足算法的要求。

在C++ 中,迭代器提供了一种通用的方式来遍历和操作容器中的元素。根据我们实际开发项目不同的需求,选择合适的迭代器可以更有效地进行数据操作和算法应用。

引用

Iterator library - cppreference.com

  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉夢志昂丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值