C++?標(biāo)準(zhǔn)庫(kù)中的reverse?函數(shù)使用示例
一.函數(shù)原型
template <class BidirectionalIterator> void reverse(BidirectionalIterator first, BidirectionalIterator last);
二.函數(shù)參數(shù)
first:指向要反轉(zhuǎn)序列起始位置的迭代器
last:指向要反轉(zhuǎn)序列結(jié)束位置的下一個(gè)位置的迭代器(左閉右開(kāi)區(qū)間 [first, last))
三.使用示例
1.反轉(zhuǎn)數(shù)組
#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.反轉(zhuǎn)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.反轉(zhuǎn)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,反轉(zhuǎn)部分元素
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8};
// 只反轉(zhuǎn)中間部分元素 [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;
}四.復(fù)雜度分析
時(shí)間復(fù)雜度:O(n),其中 n 是 last - first,執(zhí)行大約 n/2 次交換
空間復(fù)雜度:O(1),原地操作,不需要額外空間
五.注意事項(xiàng)
- reverse 函數(shù)要求迭代器是雙向迭代器(BidirectionalIterator)。
- 可以用于所有支持雙向迭代器的容器:vector、deque、list、string、數(shù)組等
- reverse 會(huì)修改原容器,如果不希望修改原容器,可以使用 reverse_copy
六.相關(guān)函數(shù)
1.reverse_copy
reverse函數(shù)不保證穩(wěn)定性(因?yàn)榻粨Q元素可能會(huì)改變相等元素的相對(duì)順序,但通常我們使用reverse時(shí)并不關(guān)心這個(gè),因?yàn)樵刂挡煌壹词瓜嗤?,反轉(zhuǎn)后順序也變了)。
C++標(biāo)準(zhǔn)庫(kù)還提供了reverse_copy函數(shù),它可以將反轉(zhuǎn)的結(jié)果復(fù)制到另一個(gè)序列中,而不改變?cè)蛄小?/p>
- reverse_copy的函數(shù)原型:
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反轉(zhuǎn)后的副本: ";
for (int num : dst) {
cout << num << " "; // 輸出: 5 4 3 2 1
}
return 0;
}2.自定義反轉(zhuǎn)算法實(shí)現(xiàn)
#include <iostream>
#include <vector>
using namespace std;
// 手動(dòng)實(shí)現(xiàn) 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.與反向迭代器的區(qū)別
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
// 使用 reverse 函數(shù)修改原容器
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;
}到此這篇關(guān)于C++ 標(biāo)準(zhǔn)庫(kù)中的reverse 函數(shù)的文章就介紹到這了,更多相關(guān)C++ 標(biāo)準(zhǔn)庫(kù)reverse 函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++中函數(shù)調(diào)用運(yùn)算符重載的實(shí)現(xiàn)
在 C++ 中,函數(shù)調(diào)用運(yùn)算符的重載是一種特殊的運(yùn)算符重載方式,允許自定義類(lèi)的對(duì)象像函數(shù)一樣被調(diào)用,本文就來(lái)詳細(xì)的介紹一下c++中函數(shù)調(diào)用運(yùn)算符重載的實(shí)現(xiàn),感興趣的可以了解一下2026-02-02
C/C++ 中實(shí)現(xiàn)讓控制臺(tái)暫停的方法
這篇文章主要介紹了C/C++ 中實(shí)現(xiàn)讓控制臺(tái)暫停的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
C++ OpenCV實(shí)現(xiàn)圖像去水印功能
本文將介紹如何使用OpenCV C++ 進(jìn)行簡(jiǎn)單圖像水印去除。我們?cè)诰W(wǎng)上download圖片時(shí),經(jīng)常因?yàn)榘鏅?quán)問(wèn)題有水印。本案例通過(guò)編寫(xiě)算法進(jìn)行簡(jiǎn)單水印去除。需要的可以參考一下2022-01-01
基于C++內(nèi)存分配、函數(shù)調(diào)用與返回值的深入分析
本篇文章是對(duì)C++中的內(nèi)存分配、函數(shù)調(diào)用與返回值進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

