机试,vector迭代器

在C++里,std::vector 迭代器是一种强大的工具,用于遍历和操作 std::vector 容器中的元素。以下详细介绍 std::vector 迭代器的相关知识:

1. 迭代器的基本概念

迭代器是一种对象,它提供了一种统一的方式来访问容器中的元素,而无需关心容器的具体实现细节。对于 std::vector 来说,迭代器就像是一个指向元素的指针,允许你按顺序访问 vector 里的每个元素。

2. 迭代器的类型

  • 正向迭代器:可以从 vector 的起始位置向末尾方向遍历元素。
  • 反向迭代器:可以从 vector 的末尾位置向起始方向遍历元素。

3. 获取迭代器

  • begin():返回指向 vector 第一个元素的迭代器。
  • end():返回指向 vector 最后一个元素之后位置的迭代器,通常用于判断是否遍历结束。
  • rbegin():返回指向 vector 最后一个元素的反向迭代器。
  • rend():返回指向 vector 第一个元素之前位置的反向迭代器。

4. 正向迭代器的使用示例

#include <iostream>
#include <vector>

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

    // 获取指向第一个元素的迭代器
    std::vector<int>::iterator itBegin = vec.begin();
    // 获取指向最后一个元素之后位置的迭代器
    std::vector<int>::iterator itEnd = vec.end();

    // 使用迭代器遍历 vector
    for (std::vector<int>::iterator it = itBegin; it != itEnd; ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // C++11 及以后可以使用 auto 关键字简化迭代器类型
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

代码解释

  • std::vector<int>::iterator 定义了一个 vector<int> 类型的正向迭代器。
  • vec.begin() 返回指向 vector 第一个元素的迭代器,vec.end() 返回指向 vector 最后一个元素之后位置的迭代器。
  • 通过 *it 可以访问迭代器所指向的元素。
  • ++it 使迭代器指向下一个元素。

5. 反向迭代器的使用示例

#include <iostream>
#include <vector>

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

    // 获取指向最后一个元素的反向迭代器
    std::vector<int>::reverse_iterator ritBegin = vec.rbegin();
    // 获取指向第一个元素之前位置的反向迭代器
    std::vector<int>::reverse_iterator ritEnd = vec.rend();

    // 使用反向迭代器遍历 vector
    for (std::vector<int>::reverse_iterator rit = ritBegin; rit != ritEnd; ++rit) {
        std::cout << *rit << " ";
    }
    std::cout << std::endl;

    // 使用 auto 关键字简化迭代器类型
    for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {
        std::cout << *rit << " ";
    }
    std::cout << std::endl;

    return 0;
}

代码解释

  • std::vector<int>::reverse_iterator 定义了一个 vector<int> 类型的反向迭代器。
  • vec.rbegin() 返回指向 vector 最后一个元素的反向迭代器,vec.rend() 返回指向 vector 第一个元素之前位置的反向迭代器。
  • 反向迭代器使用 ++ 操作符时,实际上是向 vector 的起始方向移动。

6. 迭代器的其他操作

  • 解引用操作符 *:用于访问迭代器所指向的元素。
  • 递增操作符 ++:使迭代器指向下一个元素(正向迭代器)或前一个元素(反向迭代器)。
  • 比较操作符 ==!=:用于判断两个迭代器是否相等或不相等,通常用于循环条件判断。
  • 算术操作符(仅随机访问迭代器)std::vector 的迭代器是随机访问迭代器,可以使用 +-+=-= 等算术操作符,例如 it + 2 可以让迭代器向前移动两个位置。

7. 迭代器失效问题

在使用迭代器时需要注意迭代器失效的问题。当对 vector 进行插入或删除操作时,可能会导致迭代器失效。例如,在插入元素时,如果 vector 的容量发生改变,原来的迭代器就会失效。因此,在进行插入或删除操作后,需要重新获取有效的迭代器。

#include <iostream>
#include <vector>

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

    // 插入元素,可能导致迭代器失效
    vec.insert(it, 0);

    // 重新获取迭代器
    it = vec.begin();

    for (; it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

通过合理使用迭代器,可以方便地对 std::vector 中的元素进行遍历、访问和修改等操作。

考研机试常用的数据结构 文章被收录于专栏

考研机试常用的数据结构

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务