C vector反向迭代器的使用

2021-06-28 16:31:01 字數 3691 閱讀 8922

反向迭代器其實沒什麼特殊的,他只是在遍歷的方向上和普通迭代器不通而已:

每乙個容器裡面都有iterator(迭代器),可以從容器的begin位置到end-1位置,通過++來遍歷。

同樣也有個反向迭代器reverse_iterator,從rbegin(=end)到rend(=begin-1)反向遍歷,仍然通過++來遍歷.  

c++ primer (中文版第四版)

第273頁

9.3.2 begin和end成員

c.begin() 返回乙個迭代器,它指向容器c的第乙個元素

c.end() 返回乙個迭代器,它指向容器c的最後乙個元素的下乙個位置

c.rbegin() 返回乙個逆序迭代器,它指向容器c的最後乙個元素

c.rend() 返回乙個逆序迭代器,它指向容器c的第乙個元素前面的位置

上述每個操作都有兩個不同的版本:乙個是const成員,另乙個是非const成員。這些操作返回什麼型別取決於容器是否為const。如果容器不是const,則這些操作返回iterator或reverse_iterator型別。如果容器是const,則其返回型別要加上const_字首,也就是const_iterator和const_reverse_iterator型別。

第353頁

11.3.3 反向迭代器

反向迭代器是一種反向遍歷容器的迭代器。也就是,從最後乙個元素到第乙個元素遍歷容器。反向迭代器將自增(和自減)的含義反過來了:對於反向迭代 器,++ 運算將訪問前乙個元素,而 -- 運算則訪問下乙個元素。

回想一下,所有容器都定義了 begin 和 end 成員,分別返回指向容器首元素和尾元素下一位置的迭代器。容器還定義了 rbegin 和 rend 成員,分別返回指向容器尾元素和首元素前一位置的反向迭代器。與普通迭代器一樣,反向迭代器也有常量(const)和非常量(nonconst)型別。圖 11.1 使用乙個假設名為 vec 的 vector 型別物件闡明了這四種迭代器之間的關係。

順序遍歷:

//方法i:

for (size_t i = 0; i < vecint.size(); ++i)

逆序遍歷:

//方法i:倒序遍歷

//[注意]必須用int,無符號會導致--i異常

//通常用於listctrl列表項批量刪除(按照索引從後往前刪除)

int nsize = (int)vecint.size();

for (int i = (nsize - 1); i >= 0; --i)

//方法ii:普通迭代器逆序輸出

vector::iterator iter = vecint.end();

for (; iter != vecint.begin(); ++iter)

//方法iii:反向迭代器輸出

vector::reverse_iterator iter = vecint.rbegin();

for (; iter != vecint.rend(); ++iter)

反向迭代器的一些應用①    用反向迭代器逆向輸出vector中的內容:

#include

#include

using namespace std;

int main()

cout << "反向迭代器輸出: " << endl;

vector::reverse_iterator it= vec.rbegin();

while (it != vec.rend())

cout << endl << "普通的迭代器逆序輸出: "<< endl;

vector::iterator iter= vec.end();

while( iter != vec.begin())

return 0;

}②  反向迭代器和sort函式結合可以對資料進行降序排列

如#include

#include

#include

#include

using namespace std;

int main()

;vectorvec(num,num+7);

cout << "排序前: "<

for (vector::iterator it= vec.begin();it != vec.end(); ++it)

sort(vec.begin(),vec.end());

cout << endl << "普通迭代器排序後: "<

for (it = vec.begin();it != vec.end();++it)

cout << endl;

sort(vec.rbegin(),vec.rend());

cout << "反向迭代器排序後: " << endl;

for ( it = vec.begin();it != vec.end();++it)

return 0;

}③   反向迭代器和copy和流迭代器結合的例子

#include

#include

#include

using namespace std;

int main()

;vectortest(10);

vector::reverse_iterator ri;

ostream_iteratoros_iter(cout," ");//宣告乙個輸出流迭//代器,以空格間隔

copy(casts, casts + 10, test.begin());//將陣列內容copy到容器內

cout << " 採用輸出流迭代器輸出陣列元素:" << endl;

copy(casts, casts + 10, os_iter);

cout << endl << " 採用輸出流迭代器輸出容器元素:"<< endl;

copy(test.begin(), test.end(), os_iter);

cout << endl << " 採用輸出流迭代器和反向迭代器反序輸出容器元素:"<< endl;

copy(test.rbegin(), test.rend(), os_iter);

cout << endl << " 直接採用反向迭代器輸出容器元素: "<< endl;

for(ri = test.rbegin(); ri != test.rend(); ++ri)

return 0;

}④  利用反向迭代器獲得字串末尾的乙個單詞

如我們用乙個string字串儲存了一些單詞列表,裡面各個單詞以』,』間隔。我們可以利用反向迭代器和find演算法結合獲得最後乙個單詞。

我們先來利用普通的迭代器獲得第乙個單詞。

#include

#include

#include

using namespace std;

int main()

用反向迭代器獲得最後乙個單詞

#include

#include

#include

#include

using namespace std;

int main()

迭代器 反向迭代器

c primer 中文版第四版 第273頁 9.3.2 begin和end成員 begin和end操作產生指向容器內第乙個元素和最後乙個元素的下乙個位置的迭代器,如下所示。這兩個迭代器通常用於標記包含容器中所有元素的迭代範圍。c.begin 返回乙個迭代器,它指向容器c的第乙個元素 c.end 返回...

C vector 迭代器失效原因

眾所周知,vector在記憶體中是順序儲存的,那麼當vector的長度增加時,也就是往裡面繼續pushback新的資料,當前塊的記憶體不夠,vector不得不重新申請一塊新的更大的記憶體,然後把之前的資料複製過來,再插入新的資料。為了驗證這個可以看看下面的測試 上面的 非常簡單,都是在插入乙個新的資...

C vector迭代器及用法

vector 容器的迭代器是隨機訪問迭代器。當然,也可以通過全域性函式獲取它們。vector 有成員函式 push back 所以能夠通過使用 back insert iterator 來新增新的值。從前面章節了解到,可以通過呼叫全同的 back inserter 函式來獲取乙個後向插入迭代器。無法...