当前位置: 代码迷 >> 综合 >> 一套代码实现c++ 容器的正逆向遍历及元素删除
  详细解决方案

一套代码实现c++ 容器的正逆向遍历及元素删除

热度:37   发布时间:2024-01-28 11:56:52.0

很多时候我们需要实现c++容器的正反方向的遍历,比如我们对第一个容器需要逆向遍历,第二个容器正向遍历,那么第一个容器的迭代器就使用逆向迭代器(reverse_iterator),第二个容器的迭代器使用正向迭代器。这样不同的迭代器就不方便使用统一的代码,而且我们常常遇到的情况是,除了迭代器相反外,其它的业务逻辑都是类似的,所以我们通常不得不写两个函数,这两个函数除了迭代器外,其它的代码都是重复的。

如果我们正逆遍历都使用相同的迭代器,则可以将代码统一。本文演示如何使用正向迭代器实现c++容器的正逆向的遍历及元素删除。

代码如下:

#include <iostream>
#include <iterator>
#include <vector>using namespace std;using RevIt = reverse_iterator < vector < int >::iterator >;
using Itr_t = vector < int >::iterator;vector<int> v[2]{{6, 7, 8, 9}, { 0, 1, 2, 3, 4, 5 }};void traverse(int idx)
{Itr_t it;auto vp = v + idx;int len = vp->size();int direction = 2 * idx - 1;it = vp->begin() + (1-idx)*(len - 1);for(int ii=0; ii<len; ++ii){if(0 == ii) {it = vp->erase(it);it += idx - 1;}else {cout << *it << " ";it += direction;}}cout << endl;
}
int
main ()
{for(int ii=0; ii<2; ++ii)traverse(ii);
}

上述代码将向量容器的正逆遍历及元素删除封闭在一个函数中,通过传入的参数来确定进行正向遍历还是逆向遍历。

传入参数 idx = 0,则进行逆向遍历;反之 idx = 1则进行正向遍历。

正向遍历前,迭代器指向第一个元素(vp->begin()),在删除元素时 it = vp->erase(it),因为erase的返回值已经指向下一个元素,迭代器就不需要执行递增的操作。

逆向遍历里,迭代器初始化到最后一个元素(vp->begin() + vp->size() -1),在删除元素时 it = vp->erase(it) 指向下一个元素,但我们是逆向遍历的,这个实际上指向刚刚遍历过的元素(如果删除的是第一个元素,则这个指向 vp->end()),因些这一轮结束后应该将迭代器递减。

  相关解决方案