下標迭代器
stl演算法
基於範圍迴圈
條款參考資料
序列式容器的資料結構是線性結構
中文名英文名
向量vector
雙向鍊錶
list
雙端佇列
deque
關聯式容器的資料結構是非線性結構
中文名英文名
集合set
多重集合
multiset
對映map
多重對映
multimap
介面卡用於適配容器,作為特殊用途的容器,允許自由指定介面匹配的容器。
中文名英文名
預設容器
棧stack
deque
佇列queue
deque
優先佇列
priority_queue
vector
下述所有示例以下標例子為模板,其改動只有函式print和標頭檔案。下標適用於遍歷連續性的線性結構容器,對於非連續性的線性結構和非線性結構容器,可以過載operator 或者增加介面函式,並且構建索引表訪問對應元素。
以vector和map為例:
#include
#include
using dynamicarray = std::vector<
long
>
;void
print
(const dynamicarray &dynamicarray)
intmain()
;print
(dynamicarray)
;return0;
}
#include
#include
#include
#include
intmain()
; std::map map =,,
};for(stringarray::size_type index =
0; index < keys.
size()
;++index)
return0;
}
stl由容器、迭代器、演算法三層結構組成,為不同的容器定製介面相同的迭代器,線性結構與非線性結構的容器都能夠通過迭代器進行遍歷。
#include
#include
using dynamicarray = std::vector<
long
>
;void
print
(const dynamicarray &dynamicarray)
intmain()
;print
(dynamicarray)
;return0;
}
對於一些容器,如果使用迭代器遍歷,向容器新增或刪除元素,將導致迭代器失效(不同容器的迭代器失效的時機不同),後續遍歷操作是未定義行為,因此每次在插入或刪除元素之後都應該重新定位迭代器。
演算法由於以迭代器為基礎,因此對線性結構和非線性結構的容器都適用,以for_each和copy為例:
引用標頭檔案algorithm
#include
#include
#include
using dynamicarray = std::vector<
long
>
;void
print
(const dynamicarray &dynamicarray));
cout << dynamicarray.
size()
;}intmain()
;print
(dynamicarray)
;return0;
}
引用標頭檔案algorithm和iterator
#include
#include
#include
#include
using dynamicarray = std::vector<
long
>
;void
print
(const dynamicarray &dynamicarray)
intmain()
;print
(dynamicarray)
;return0;
}
c++11標準新增range-for語法,其底層實現依賴於迭代器,對於線性結構和非線性結構的容器通用。
#include
#include
using dynamicarray = std::vector<
long
>
;void
print
(const dynamicarray &dynamicarray)
intmain()
;print
(dynamicarray)
;return0;
}
當使用range-for遍歷容器時,不可以減少容器容量,也不可以任意新增或者刪除元素,只有在迭代器不失效的情況下可以進行這些操作。
c++標準並不支援以下語法:
for each (
auto var in collect)
visual studio中使用c++17標準,編譯此語法**,提示下述錯誤資訊:
error c4496: 使用了非標準擴充套件「for each」: 替換為 ranged-for 語句qt運用巨集模仿此語法:
qstringlist words =
;foreach (qstring word, words)
c#也有類似用法,其語法格式如下:
foreach
(type object
in collection/array)
呼叫演算法相比於手寫迴圈,具有以下優勢:
stl演算法使用複雜的電腦科學演算法,有些演算法非常複雜,並非一般程式設計師所能夠達到。
類庫實現者比使用者更清楚內部實現細節,能夠根據對於容器實現的了解程度優化遍歷過程,這是庫的使用者難以做到的事情。
如果**作用與演算法功能相近,呼叫演算法有利於提高**清晰度。但是,若迴圈**簡單清晰,用以顯示實現細節,而呼叫演算法可能需要混合繫結器和配接器,或者封裝單獨的函式子類,則手寫迴圈更合適。
[1] effective stl 中文版:50條有效使用stl的經驗 / (美) 梅耶 (meyers,s.) 著;潘愛民,陳銘,鄒開紅譯. --北京:電子工業出版社,2013.5
C 遍歷系統程序的方法
建立乙個listbox將程序名稱遍歷進去 this.listbox1.items.clear process myprocesses process.getprocesses foreach process myprocess in myprocesses this.listbox1.selecte...
c 遍歷資料夾深度 C 遍歷目錄下所有檔案方法
c 遍歷指定資料夾中的所有檔案 directoryinfo thefolder new directoryinfo folderfullname 遍歷資料夾 foreach directoryinfo nextfolder in thefolder.getdirectories this.listb...
遍歷同輩節電的方法 DOM遍歷方法
為標題行新增樣式 document ready function th parent addclass table heading tr not th odd addclass odd tr not th even addclass even 取得某一行的其他所有單元格 1.取得包含henry的單元...