C++开发必备之stl(二)

迭代器

C++ 迭代器(Iterator)是标准模板库(STL)中的重要概念,它为容器(如vector, list, set等)提供了一种统一的遍历机制。迭代器类似于指针,可以用来指向容器中的元素,并通过递增或递减操作来遍历容器。

1. 迭代器的基本概念

迭代器是一个可以指向容器中元素的对象,类似于指针。它可以被用于遍历容器的元素,而无需关心容器的底层实现。

迭代器通常通过 STL 容器的begin()end()函数来获取。begin()返回指向第一个元素的迭代器,end()返回指向“末尾”之后位置的迭代器。

std::vector<int> vec = {1, 2, 3, 4, 5};
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it)
{
    std::cout << *it << " ";
}

2. 迭代器的类型

根据容器的特性和访问方式,C++ 迭代器有以下几种类型:

  • 输入迭代器(Input Iterator):只能进行只读访问,支持一次性遍历(如std::istream_iterator)。
  • 输出迭代器(Output Iterator):只能进行写操作,不能进行读操作(如std::ostream_iterator)。
  • 前向迭代器(Forward Iterator):支持读写操作,可以单向遍历(如std::forward_list::iterator)。
  • 双向迭代器(Bidirectional Iterator):支持向前和向后遍历(如std::list::iterator)。
  • 随机访问迭代器(Random Access Iterator):支持随机访问和双向遍历,具有指针类似的操作(如std::vector::iterator, std::deque::iterator)。

3. 常用操作

  • 解引用*it,返回迭代器当前指向的元素。
  • 递增++it,将迭代器移动到下一个元素。
  • 递减--it,将迭代器移动到上一个元素(仅限双向和随机访问迭代器)。
  • 比较:迭代器可以用==!=来进行比较,判断是否指向同一个元素。
  • 随机访问:对随机访问迭代器,支持it + nit - nit[n]操作。
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it = vec.begin();

std::cout << *it << std::endl;    // 输出1
++it;
std::cout << *it << std::endl;    // 输出2

4. 迭代器类别的使用

  • std::vector的迭代器是随机访问迭代器,可以进行it+n操作,快速随机访问元素。
  • std::list的迭代器是双向迭代器,可以进行++it--it操作,无法进行随机访问。
  • std::set的迭代器也是双向迭代器,不能修改集合中的元素。
  • std::map的迭代器也是双向迭代器,解引用时返回键值对。

5. 常用的迭代器相关函数

  • begin()end():返回容器的起始和结束迭代器。
  • rbegin()rend():返回容器的反向迭代器,反向遍历容器。
  • cbegin()cend():返回容器的常量迭代器,不能通过迭代器修改容器内容。
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.rbegin(); it != vec.rend(); ++it)
{
    std::cout << *it << " ";  // 输出 5 4 3 2 1
}

6. 迭代器失效问题

迭代器失效通常发生在容器结构改变时,比如删除、插入操作。以下是一些常见的迭代器失效情况:

  • vector:插入或删除元素时,指向被插入/删除元素的迭代器以及后续的迭代器失效。
  • list:插入或删除元素不会导致其他迭代器失效,除非删除的是该迭代器指向的元素。
  • mapset:插入不会使现有迭代器失效,但删除操作会导致指向删除元素的迭代器失效。

7. 迭代器适配器

STL 提供了一些迭代器适配器,用于将非迭代器对象转换为迭代器:

  • std::back_inserter:将插入操作适配为向容器末尾插入元素。
  • std::front_inserter:将插入操作适配为向容器头部插入元素。
  • std::inserter:将插入操作适配为在特定位置插入元素。
std::vector<int> vec;
std::copy(arr, arr + 5, std::back_inserter(vec));

8. 常量迭代器

常量迭代器(const_iterator)只能读取容器中的元素,不能修改元素的值。它通常用于保护容器数据不被修改。

std::vector<int> vec = {1, 2, 3, 4, 5};
for (std::vector<int>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it)
{
    std::cout << *it << " ";  // 输出 1 2 3 4 5
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值