vectorreverse函数详解

发布时间:2023-05-18

一、函数介绍

vector::reverse 是 C++ STL 库中的一个函数,它可以将一个 vector 类型的容器中元素的顺序进行反转,也可以称为是逆向排列。

二、函数的声明

template <class BidirectionalIterator>
void reverse ( BidirectionalIterator first, BidirectionalIterator last );

这里 BidirectionalIterator 是一个泛型类,表示可正反向移动的迭代器类型,容器类型为 vectordeque 等均可使用该函数。

三、函数的使用方法

使用 vector::reverse 函数,需要在头文件 <algorithm> 中引入此函数,调用时只需传入需要反转的首末迭代器即可。

std::vector<int> myvector;
std::vector<int>::iterator it;
// 向 myvector 中插入数据
for (int i = 1; i <= 5; i++) myvector.push_back(i);
// 反转 myvector 中的元素
std::reverse(myvector.begin(), myvector.end());
// 输出结果
std::cout << "myvector contains:";
for (it = myvector.begin(); it != myvector.end(); ++it)
    std::cout << ' ' << *it;
std::cout << '\n';

结果如下:

myvector contains: 5 4 3 2 1

四、函数的实现原理

vector::reverse 底层其实是调用了 STL 库中的 std::iter_swap 函数,该函数可以交换两个迭代器指向的元素。 vector::reverse 的原理就是不断的交换首、尾位置的元素,直到首尾迭代器相遇为止。

template <class _BidirectionalIterator>
inline void reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
{
    __reverse_dispatch(__first, __last, iterator_category(__first));
}
template <class _BidirectionalIterator, class _BidirectionalIterator2>
inline void __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, _BidirectionalIterator2*, bidirectional_iterator_tag) 
{
    while (true)
        if (__first == __last || __first == --__last)  // 当首、尾迭代器相遇或尾迭代器指向首迭代器时退出
            return;               
        else
            std::iter_swap(__first++, __last);   // 使用 std::iter_swap 函数交换首、尾位置元素
}

五、函数的应用场景

vector::reverse 函数通常在需要倒序遍历 vector 类型容器时使用。 如在输出整数数组(或 vector)的时候顺序输出元素不方便查看时,可以使用 vector::reverse 进行反转,然后再输出。

六、函数的注意事项

使用 vector::reverse 函数时需注意传入的容器必须支持双向迭代器,如 vectordeque 等。 使用该函数时,应确保首、尾迭代器指向的元素在反转后不会产生任何的异常。