C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++ 标准库reverse 函数

C++ 标准库中的reverse 函数使用示例

作者:白落提fy

本文介绍了C++标准库中的reverse函数,包括其原型、参数、使用示例、复杂度分析、注意事项及相关函数,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

一.函数原型

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

二.函数参数

first:指向要反转序列起始位置的迭代器
last:指向要反转序列结束位置的下一个位置的迭代器(左闭右开区间 [first, last))

三.使用示例

1.反转数组

#include <iostream>
#include <algorithm>
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    std::reverse(arr, arr + n);
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";  // 输出: 5 4 3 2 1
    }
    return 0;
}

2.反转vector

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
    vector<int> vec = {1, 2, 3, 4, 5};
    reverse(vec.begin(), vec.end());
    for (int num : vec) {
        cout << num << " ";  // 输出: 5 4 3 2 1
    }
    return 0;
}

3.反转string

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
    string str = "Hello, World!";
    reverse(str.begin(), str.end());
    cout << str << endl;  // 输出: !dlroW ,olleH
    return 0;
}

4,反转部分元素

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
    vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8};
    // 只反转中间部分元素 [2, 3, 4, 5, 6] -> [6, 5, 4, 3, 2]
    reverse(vec.begin() + 1, vec.end() - 1);
    for (int num : vec) {
        cout << num << " ";  // 输出: 1 7 6 5 4 3 2 8
    }
    return 0;
}

四.复杂度分析

时间复杂度:O(n),其中 n 是 last - first,执行大约 n/2 次交换
空间复杂度:O(1),原地操作,不需要额外空间

五.注意事项

  1. reverse 函数要求迭代器是双向迭代器(BidirectionalIterator)。
  2. 可以用于所有支持双向迭代器的容器:vectordequeliststring数组
  3. reverse 会修改原容器,如果不希望修改原容器,可以使用 reverse_copy

六.相关函数

1.reverse_copy

reverse函数不保证稳定性(因为交换元素可能会改变相等元素的相对顺序,但通常我们使用reverse时并不关心这个,因为元素值不同,且即使相同,反转后顺序也变了)。
C++标准库还提供了reverse_copy函数,它可以将反转的结果复制到另一个序列中,而不改变原序列。

template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy(BidirectionalIterator first,
BidirectionalIterator last,
OutputIterator result);
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
    vector<int> src = {1, 2, 3, 4, 5};
    vector<int> dst(src.size());
    reverse_copy(src.begin(), src.end(), dst.begin());
    cout << "原序列: ";
    for (int num : src) {
        cout << num << " ";  // 输出: 1 2 3 4 5
    }
    cout << "\n反转后的副本: ";
    for (int num : dst) {
        cout << num << " ";  // 输出: 5 4 3 2 1
    }
    return 0;
}

2.自定义反转算法实现

#include <iostream>
#include <vector>
using namespace std;
// 手动实现 reverse 功能
template<typename T>
void my_reverse(T begin, T end) {
    while (begin != end && begin != --end) {
        swap(*begin, *end);
        ++begin;
    }
}
int main() {
    vector<int> vec = {1, 2, 3, 4, 5};
    my_reverse(vec.begin(), vec.end());
    for (int num : vec) {
        cout << num << " ";  // 输出: 5 4 3 2 1
    }
    return 0;
}

3.与反向迭代器的区别

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    vector<int> vec = {1, 2, 3, 4, 5};
    // 使用 reverse 函数修改原容器
    reverse(vec.begin(), vec.end());
    cout << "使用 reverse 后: ";
    for (int num : vec) {
        cout << num << " ";  // 输出: 5 4 3 2 1
    }
    cout << endl;
    // 重置 vector
    vec = {1, 2, 3, 4, 5};
    // 使用反向迭代器(不修改原容器,只是反向遍历)
    cout << "使用反向迭代器遍历: ";
    for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
        cout << *it << " ";  // 输出: 5 4 3 2 1
    }
    cout << endl;
    cout << "原容器未被修改: ";
    for (int num : vec) {
        cout << num << " ";  // 输出: 1 2 3 4 5
    }
    return 0;
}

到此这篇关于C++ 标准库中的reverse 函数的文章就介绍到这了,更多相关C++ 标准库reverse 函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文