C 遍歷方法

2021-09-24 17:02:40 字數 3436 閱讀 9536

下標迭代器

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的單元...