stl clocklist 查找元素_剑指信奥 C++ 之 STL 迭代器(上)
趣樂博思劍指信奧 C++ 系列
?趣樂博思劍指信奧系列,專門針對全國青少年信息學奧林匹克聯賽 NOIP 而開展的專業教育方案。開設的課程有 C 語言基礎,C++ 語言基礎,算法設計入門與進階,經典試題分析與詳解等系列課程。面向10 - 16 歲少兒的編程教育,培養扎實的 C++ 語言基礎,靈活運用算法的能力,分析解決問題的能力。
?劍指信奧 | C++ 之 STL - 迭代器(上)
各個容器統一的訪問接口
什么是迭代器
還記得我們在介紹 C++ STL 的概念時,提到了 STL 包含四個組件嗎?
它們分別是 容器、迭代器、算法、函數,到目前為止,我們關于容器部分的內容已經基本結束了,它們分別是:
- string
- vector
- stack
- queue
- list
- set
- map
這些容器的主要作用就是用來存儲數據,依據它們底層不同的數據結構,存儲的方式也各不相同,因此帶來增查改刪各種操作時間和空間上的差異,人們在使用時就可以根據具體的需求做出最佳的選擇。
雖然都是不同的容器,但從這幾次課的學習,我們不難發現,我們對容器的很多操作都是類似的,比如在容器中查找一個特定的元素,查找滿足需求的一部分元素,修改元素等等。
如果為每一種容器都重新定義一套函數,實在是麻煩而且沒有必要,如果能有一個統一的方式能對所有的容器提供訪問功能就好了,而這,就是我們今天要學習的內容 — 迭代器 iterator
迭代器(iterator)有時又稱游標(cursor)是程序設計的軟件設計模式。?
迭代器是可在容器(container,例如鏈表或陣列)上遍歷的接口,設計人員無需關心容器內存分配的實現細節。
Wikipedia
所以,迭代器就是訪問容器的統一接口。
一個迭代器的示例
在開始介紹迭代器的具體內容之前,我們先來看一個迭代器使用的實例:
#include#include
using namespace std;
int main() {
// 容器的初始化
vector<int> container{1, 2, 3};
// 迭代器的定義
vector<int>::const_iterator i;
// for 循環 1
cout << "--- for 1 ---" << endl;
for (i = container.begin(); i != container.end(); i++) {
cout << *i << "\t";
}
// for 循環 2
cout << endl << "--- for 2 ---" << endl;
for (i = container.begin(); i < container.end(); i++) {
cout << *i << "\t";
}
// while 循環
cout << endl << "--- while ---" << endl;
i = container.begin();
while (i != container.end()) {
cout << *i << "\t";
i++;
}
return 0;
}
/*
output:
--- for 1 ---
1 2 3
--- for 2 ---
1 2 3
--- while ---
1 2 3
*/
在這段代碼中,我們先是初始化了一個具有 3 個元素的向量,然后使用 vector::iterator = i; 的方式聲明了一個關于這個容器的迭代器 i。
之后,以兩種 for 循環和一個 while 循環的方式輸出了這個容器的所有元素,三次遍歷的輸出結果都是一樣的。
現在,我們改動上述代碼中的 3 行,仔細觀察一下是在哪里:
#include#include
using namespace std;
int main() {
// 容器的初始化
deque<int> container{1, 2, 3};
// 迭代器的定義
deque<int>::const_iterator i;
// for 循環 1
cout << "--- for 1 ---" << endl;
for (i = container.begin(); i != container.end(); i++) {
cout << *i << "\t";
}
// for 循環 2
cout << endl << "--- for 2 ---" << endl;
for (i = container.begin(); i < container.end(); i++) {
cout << *i << "\t";
}
// while 循環
cout << endl << "--- while ---" << endl;
i = container.begin();
while (i != container.end()) {
cout << *i << "\t";
i++;
}
return 0;
}
/*
output:
--- for 1 ---
1 2 3
--- for 2 ---
1 2 3
--- while ---
1 2 3
*/
找到了嗎?是這樣的 3 行:
簡單一點說,我們是把容器由向量 vector 改為了雙端隊列 deque,三處循環代碼沒有任何改變,同樣實現了容器的遍歷。
這就體現了迭代器的作用:為容器提供統一的訪問接口。
迭代器的定義分類
迭代器是有分類的,我們先看一段代碼:
#include#include
using namespace std;
int main() {
// 容器的初始化
vector<int> container{1, 2, 3};
// 迭代器的定義
vector<int>::iterator i; // 正向迭代器
// for 循環 1
cout << "--- for 1 ---" << endl;
for (i = container.begin(); i != container.end(); i++) {
*i += 1; // 修改元素的值
}
// for 循環 2
cout << endl << "--- for 2 ---" << endl;
for (i = container.begin(); i < container.end(); i++) {
cout << *i << "\t";
}
return 0;
}
/*
output:
--- for 1 ---
--- for 2 ---
2 3 4
*/
這段代碼和之前第一個代碼片段很像,不同在以下兩行:
首先,我們修改了迭代器的類型。
我們把 const_iterator 改為 iterator。
其次,在第一個 for 循環中,把輸出語句改為了賦值語句。
這里 const_iterator 是 常量正向迭代器 的含義,它只能實現元素的訪問,不能修改元素,而 iterator 是 正向迭代器 的含義,它不僅能實現元素的訪問,還可以修改元素的值。
所以,迭代器按照定義方式分為以下四類:
1.?正向迭代器,定義方法如下:
容器類名::iterator 迭代器名;
2.?常量正向迭代器,定義方法如下:
容器類名::const_iterator 迭代器名;
3.?反向迭代器,定義方法如下:
容器類名::reverse_iterator 迭代器名;
4. 常量反向迭代器,定義方法如下:
容器類名::const_reverse_iterator 迭代器名;
我們知道了,各種迭代器都可以訪問元素,而非常量迭代器還可以修改元素,那么正向迭代器和反向迭代器有什么區別呢?
今天課程的最后,我們看一個反向迭代器的示例:
#include#include
using namespace std;
int main() {
vector<int> container{1, 2, 3};
// 迭代器的定義
vector<int>::reverse_iterator i; // 反向迭代器
// for 循環 1
cout << "--- for 1 ---" << endl;
for (i = container.rbegin(); i != container.rend(); i++) {
cout << *i << "\t";
*i *= 2; // 修改元素的值
}
// for 循環 2
cout << endl << "--- for 2 ---" << endl;
for (i = container.rbegin(); i < container.rend(); i++) {
cout << *i << "\t";
}
return 0;
}
/*
output:
--- for 1 ---
3 2 1
--- for 2 ---
6 4 2
*/
我們這次定義了一個非常量反向迭代器,在 for 循環 1 中,首先輸出元素,緊接著修改了每個元素值為原來的 2 倍,再次使用 for 循環 2 輸出修改后的值。
輸出結果表明,元素是逆序輸出的,體現了反向的含義,需要注意的是,反向迭代器的兩端使用的是 rbegin() 和 rend() 函數,而循環里的 ++ 將指向容器里的前一個元素。
關于迭代器第一部分的內容,我們就說到這,下次課我們繼續聊聊迭代器后續的內容。
「 劍指信奧 C++?系列?」
從零開始,進階信息學奧林匹克競賽
清華計算機系哥哥專業講解
趣樂博思教育
遇見你更優秀的孩子
?r
如果您喜歡?趣樂博思教育,請關注我們的公眾號,發現您更優秀的孩子!
如果您從這篇文章有所收獲,請點亮下方?在看,或轉發到朋友圈,謝謝!
總結
以上是生活随笔為你收集整理的stl clocklist 查找元素_剑指信奥 C++ 之 STL 迭代器(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python脚本自动运行失败_解决Pyt
- 下一篇: 小英雄雨来中雨来为什么要枪毙鬼子?