將std容器的正向迭代器轉換成反向迭代器
迭代器是一種很有用的設計模式,它提供一種方法順序訪問一個聚合對象(如列表、集合、樹等)中的各個元素,而又不暴露該對象的內部表示。迭代器最大的好處是實現了遍歷邏輯與數據結構解耦,比如說,你使用迭代器實現了某個容器對象的遍歷,后來發現這個容器不合適,需要更換成另外一個容器,那么在修改容器類型之后,就不用修改遍歷操作。
雖然現代編程都內置了對迭代器模式的支持,但是自己在封裝某個數據對象實現的時候,就免不了自己實現迭代器。一般而言是先封裝正向迭代器,如果還有反向遍歷的需求,那么就可以通過正向迭代器來實現反向迭代器。C++中std的迭代器實現還是挺繞的,比如正向迭代器begin是第一個元素,end最后一個元素的后一個元素;反向迭代器rbegin是最后一個元素,rend是第一個元素的前一個元素——兩者最好不要混用,用正向迭代器實現反向遍歷操作多半不靠譜。
那么具體如何通過正向迭代器來獲取反向迭代器呢?可以使用如下公式:
反向迭代器 r_it = std::reverse_iterator<正向迭代器類型>(fwd_it + 1);
可參考如下示例來驗證:
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 創建一個 vector 用于測試
std::vector<int> vec = {10, 20, 30, 40, 50};
std::cout << "容器內容: ";
for (const auto& elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl << std::endl;
// --- 測試 1: fwd_it 指向第一個元素 (10) ---
std::cout << "=== 測試 1: fwd_it 指向第一個元素 ===" << std::endl;
auto fwd_it_first = vec.begin(); // 指向 10
std::cout << "fwd_it_first 指向的元素: " << *fwd_it_first << std::endl;
// 使用公式構造反向迭代器
auto r_it_first =
std::reverse_iterator<std::vector<int>::iterator>(fwd_it_first + 1);
std::cout << "r_it_first 指向的元素: " << *r_it_first << std::endl;
// 驗證它們是否指向同一個值
std::cout << "指向同一個元素嗎? "
<< (*fwd_it_first == *r_it_first ? "是" : "否") << std::endl;
std::cout << std::endl;
// --- 測試 2: fwd_it 指向最后一個元素 (50) ---
std::cout << "=== 測試 2: fwd_it 指向最后一個元素 ===" << std::endl;
auto fwd_it_last = vec.end() - 1; // 指向 50 (不能用 vec.end() + 1!)
std::cout << "fwd_it_last 指向的元素: " << *fwd_it_last << std::endl;
// 使用公式構造反向迭代器
auto r_it_last =
std::reverse_iterator<std::vector<int>::iterator>(fwd_it_last + 1);
std::cout << "r_it_last 指向的元素: " << *r_it_last << std::endl;
// 驗證它們是否指向同一個值
std::cout << "指向同一個元素嗎? "
<< (*fwd_it_last == *r_it_last ? "是" : "否") << std::endl;
std::cout << std::endl;
// --- 測試 3: fwd_it 指向中間元素 (30) ---
std::cout << "=== 測試 3: fwd_it 指向中間元素 ===" << std::endl;
auto fwd_it_middle = vec.begin() + 2; // 指向 30
std::cout << "fwd_it_middle 指向的元素: " << *fwd_it_middle << std::endl;
// 使用公式構造反向迭代器
auto r_it_middle =
std::reverse_iterator<std::vector<int>::iterator>(fwd_it_middle + 1);
std::cout << "r_it_middle 指向的元素: " << *r_it_middle << std::endl;
// 驗證它們是否指向同一個值
std::cout << "指向同一個元素嗎? "
<< (*fwd_it_middle == *r_it_middle ? "是" : "否") << std::endl;
std::cout << std::endl;
}
運行的結果是:
容器內容: 10 20 30 40 50
=== 測試 1: fwd_it 指向第一個元素 ===
fwd_it_first 指向的元素: 10
r_it_first 指向的元素: 10
指向同一個元素嗎? 是
=== 測試 2: fwd_it 指向最后一個元素 ===
fwd_it_last 指向的元素: 50
r_it_last 指向的元素: 50
指向同一個元素嗎? 是
=== 測試 3: fwd_it 指向中間元素 ===
fwd_it_middle 指向的元素: 30
r_it_middle 指向的元素: 30
指向同一個元素嗎? 是
說明公式是成立的。不過在使用這個公式之前需要檢查fwd_it是不是end,因為end是容器最后一個元素的后一個元素,對其進行加1操作可能會導致未定義的行為而出錯。

浙公網安備 33010602011771號