了解如何通過reverse_iterator的base得到iterator
呼叫reverse_iterator的base成員函式可以產生「對應的」iterator,但這句話有些辭不達意。舉個例子,看一下這段**,我們首先把從數字1-5放進乙個vector中,然後產生乙個指向3的reverse_iterator,並且通過
reverse_iterator的base初始化乙個iterator:
vector
v; v.reserve(5); // 參見條款14
for(int i = 1;i <= 5; ++ i)
vector
::reverse_iterator ri = // 使ri指向3
find(v.rbegin(), v.rend(), 3);
vector
::iterator i(ri.base()); // 使i和ri的base一樣
執行上述**後,可以想到產生的結果就像這樣:
當然,我們不能用ri來指定插入的地方,因為它不是乙個iterator。我們必須用i來代替。如上所述,當ri指向3時,i(就是ri.base())指向4。如果我們用ri來指定插入位置,那麼用i指向插入位置,那個假設就是正確的。結論呢?
● 要實現在乙個reverse_iterator ri指出的位置上插入新元素,在ri.base()指向的位置插入就行了。對於
insert操作而言,ri和ri.base()是等價的,而且ri.base()真的是ri對應的iterator。
現在再來考慮刪除元素的情況。回顧一下最初的vector(也就是在插入99之前)ri與i的關係:
// 向v插入1到5,同上
vecot
::reverse_iterator ri =
find(v.rbegin(), v.rend(), 3); // 同上,ri指向3
v.erase(--ri.base()); // 嘗試刪除ri.base()前面的元素;對於vector,一般來說編譯不通過
這個設計並不存在什麼問題。表示式--ri.base()確實能夠指出我們需要刪除的元素。而且,它們能夠處理除了
vector和string之外的其他所有容器。它可能也能處理vector和string,但對於大多數vector和string的實現,它無。在這樣的實現下,iterator(和const_iterator)會採用內建的指標來實現,所以ri.base()的結果是乙個指標。c和c++都規定了不能直接修改函式返回的指標,所以在string和vector的迭代器是指標的stl平台上,像--ri.base()這樣的表示式無法通過編譯。要移植從乙個由reverse_iterator指出的位置刪除元素時,你應該盡量避免修改base的返回值。沒問題。如果你不能減少呼叫base的返回值,只需要先增加reverse_iterator的值,然後再呼叫base!
// 同上
v.erase((++ri).base()); // 刪除ri指向的元素;
// 這下編譯沒問題了!
因為這個方法適用於所有的標準容器,這是刪除乙個由reverse_iterator指出的元素時首選的技巧。
現在已經很清楚了,reverse_iterator的base成員函式返回乙個「對應的」iterator的說法並不準確。對於插入操作而言,的確如此;但是對於刪除操作,並非如此。當需要把reverse_iterator轉換成iterator的時候,有一點非常重要的是你必須知道你準備怎麼處理返回的iterator,因為只有這樣你才能決定你得到的iterator是否是你需要的。
通過ActiveProcessLinks遍歷程序
程序的遍歷有多種方法。在應用程式裡可以使用createtoolhelp32snapshot函式先做個程序快照 snapshot 然後通過返回的資料進行遍歷。在核心程式設計裡可以通過核心資料結構來實現。核心結構eprocess 執行體程序塊 executive process 是乙個不透明 opaqu...
通過RestHighLevelClient操作ES
一 查詢相關 在es查詢中,must相當於sql語句中的and,should相當於or。當想要實現類似於 select from table where a and b or c or d 的功能時可以借助於es中的bool。即resthighlevelclient中的boolquerybuilde...
IEEE PDF eXpress 通過方法
ieee pdf express這個東西比較煩人 文章是用latex寫的,生成pdf後始終是不能通過 原因是有些文字無法嵌入到pdf中的,本人之前的解決方法是把所有檔案打包生成zip後上傳,讓ieee來生成pdf 但這次一直不行,不過最後找到了乙個非常簡單的方法 安裝pdfcreater,之後列印生...