C 裡面的不常用的iterator

2021-06-13 00:30:41 字數 2505 閱讀 5955

1.操作 iteraor 的兩個函式 advance distance 

advance 用來 對迭代器進行 + -,只是各種迭代器的 +- 不同

distance 用來獲取來個迭代器直接的元素數量

2  back_inserter 是iterator介面卡,它使得元素被插入到作為實參的某種容器的尾部,如vector等

back_inserter

生成乙個繫結在該容器上的插入迭代器,在試圖通過該迭代器給元素賦值時,賦值運算子將呼叫

push_back

新增乙個具有指定值的元素

front_inserter 則是呼叫 push_front 原理同上

inserter 則是在容器指定位置插入元素 但是容器必須提供insert 函式

必須要提到的一點是,這三種迭代器是對容器有要求的,分別要求容器提供insert,push_back,push_front方法才行

3 reverse_iterator

逆向迭代器 4

標準程式庫定義有供輸入及輸出用的iostream iterator類

,稱為istream_iterator

和ostream_iterator

,分別支援單一型別的元素讀取和寫入。

5假設我們要把乙個文字檔案拷貝到乙個字串物件中。似乎可以用一種很有道理的方法完成

ifstream inputfile("interestingdata.txt");

string filedata((istream_iterator(inputfile)),

istream_iterator()); // filedata;關

很快你就會發現這種方法無法把檔案中的空格拷貝到字串中。那是因為istream_iterators使用operator《函式來進行真的讀取,而且operator《函式在預設情況下忽略空格。假如你想保留空格,你要的做就是覆蓋預設情況。只要清除輸入流的skipws標誌就行了:

ifstream inputfile("interestingdata.txt");

inputfile.unset(ios::skipws); // 關閉inputfile的

// 忽略空格標誌

string filedata((istream_iterator(inputfile)), istream_iterator());

現在inputfile中的所有字元都拷貝到filedata中了。

唉,你會發現它們的拷貝速度不像你想象的那麼快。istream_iterators所依靠的operator《函式進行的是格式化輸入,這意味著每次你呼叫的時候它們都必須做大量工作。它們必須建立和銷毀崗哨(sentry)物件(為每個operator《呼叫進行建立和清除活動的特殊的iostream物件),它們必須檢查可能影響它們行為的流標誌(比如skipws),它們必須進行全面的讀取錯誤檢查,而且如果它們遇到問題,它們必須檢查流的異常掩碼來決定是否該拋乙個異常。如果進行格式化輸入,那些都是重要的活動,但如果你需要的只是從輸入流中抓取下乙個字元,那就過度了。

乙個更高效的方法是使用stl最好的秘密**之一:istreambuf_iterators。你可以像istream_iterator一樣使用istreambuf_iterator,但istream_iterator物件使用operator《來從輸入流中讀取單個字元。istreambuf_iterator物件進入流的緩衝區並直接讀取下乙個字元。(更明確地說,乙個istreambuf_iterator物件從乙個istream s中讀取會呼叫s.rdbuf()->sgetc()來讀s的下乙個字元。)把我們的檔案讀取**改為使用istreambuf_iterator相當簡單,大多數visual basic程式設計師都可以在兩次嘗試內做對:

ifstream inputfile("interestingdata.txt");

string filedata((istreambuf_iterator(inputfile)),

istreambuf_iterator());

注意這裡不需要「unset」skipws標誌,istreambuf_iterator不忽略任何字元。它們只抓取流緩衝區的下乙個字元。

相對於istream_iterator,它們抓取得更快——在我進行的簡單測試中能快40%,如果你的結果不同也不用驚奇。如果隨時間流逝,速度優勢不斷增加也不必奇怪,因為istreambuf_iterator存在於stl的乙個不常訪問的角落,所以實現還沒有花很多時間來優化。比如,在我用過的乙個實現中,istreambuf_iterator在我的主要測試中只比istream_iterator快了大約5%。那樣的實現顯然還有很多餘地來優化它們的istreambuf_iterator實現。如果你需要乙個乙個地讀取流中的字元,你不需要格式化輸入的威力,你關心的是它們花多少時間來讀取流,和明顯的效能提高相比,為每個迭代器多鍵入三個字元的代價是微弱的。對於無格式的乙個乙個字元輸入,你總是應該考慮使用istreambuf_iterator。

當你了解它之後,你也應該考慮把ostreambuf_iterator用於相應的無格式乙個乙個字元輸出的作。它們沒有了ostream_iterator的開銷(和彈性),所以它們通常也做得更好。

C 裡面的編碼問題

1 net中的string只有unicode一種。所以編碼格式的位元組序列轉換成string時最終都是以unicode表示。2 system.text.encoding.default 是取系統的當前ansi 頁的編碼,即當前系統的編碼。在我們的機子上一般都是 gb2312 這就每次用default...

C語言 C語言裡面的冒號

原博 看下面一段 cpp view plain copy struct test 這裡提出的問題是,結構體裡面的冒號的作用是什麼。這種冒號的用法不是我隨便杜撰的,而是在實際的 裡面看到的。在c 的函式定義時,引數列表之後可以使用冒號來給變數賦值,這裡的冒號是不是也起著給結構體成員賦預設值的作用呢?是...

c 裡面的namespace基礎(一)

面我門說說如何建立乙個namespace!定義乙個namespace首先需要包含 namespace 格式如下 namespace your nsname namespase主體內容 呵呵,給我的感覺就好象和class或struct一樣。不過他們除了形式有類似外,確實在很多方面都不相同,具體我們以後...