日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

stl clocklist 查找元素_剑指信奥 C++ 之 STL 迭代器(上)

發布時間:2024/10/8 c/c++ 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stl clocklist 查找元素_剑指信奥 C++ 之 STL 迭代器(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

趣樂博思劍指信奧 C++ 系列

?

趣樂博思劍指信奧系列,專門針對全國青少年信息學奧林匹克聯賽 NOIP 而開展的專業教育方案。開設的課程有 C 語言基礎,C++ 語言基礎,算法設計入門與進階,經典試題分析與詳解等系列課程。面向10 - 16 歲少兒的編程教育,培養扎實的 C++ 語言基礎,靈活運用算法的能力,分析解決問題的能力。

?

劍指信奧 | C++ 之 STL - 迭代器(上)

各個容器統一的訪問接口

什么是迭代器

還記得我們在介紹 C++ STL 的概念時,提到了 STL 包含四個組件嗎?

它們分別是 容器迭代器算法函數,到目前為止,我們關于容器部分的內容已經基本結束了,它們分別是:

  • string
  • vector
  • stack
  • queue
  • list
  • set
  • map

這些容器的主要作用就是用來存儲數據,依據它們底層不同的數據結構,存儲的方式也各不相同,因此帶來增查改刪各種操作時間和空間上的差異,人們在使用時就可以根據具體的需求做出最佳的選擇。

雖然都是不同的容器,但從這幾次課的學習,我們不難發現,我們對容器的很多操作都是類似的,比如在容器中查找一個特定的元素,查找滿足需求的一部分元素,修改元素等等。

如果為每一種容器都重新定義一套函數,實在是麻煩而且沒有必要,如果能有一個統一的方式能對所有的容器提供訪問功能就好了,而這,就是我們今天要學習的內容 — 迭代器 iterator

迭代器(iterator)有時又稱游標(cursor)是程序設計的軟件設計模式。?

迭代器是可在容器(container,例如鏈表或陣列)上遍歷的接口,設計人員無需關心容器內存分配的實現細節。

Wikipedia

所以,迭代器就是訪問容器的統一接口。

一個迭代器的示例

在開始介紹迭代器的具體內容之前,我們先來看一個迭代器使用的實例:

#include
#include

using namespace std;

int main() {

// 容器的初始化
vector<int> container{1, 2, 3};

// 迭代器的定義
vector<int>::const_iterator i;

// for 循環 1
cout << "--- for 1 ---" << endl;
for (i = container.begin(); i != container.end(); i++) {
cout << *i << "\t";
}

// for 循環 2
cout << endl << "--- for 2 ---" << endl;
for (i = container.begin(); i < container.end(); i++) {
cout << *i << "\t";
}

// while 循環
cout << endl << "--- while ---" << endl;
i = container.begin();
while (i != container.end()) {
cout << *i << "\t";
i++;
}

return 0;
}

/*
output:
--- for 1 ---
1 2 3
--- for 2 ---
1 2 3
--- while ---
1 2 3
*/

在這段代碼中,我們先是初始化了一個具有 3 個元素的向量,然后使用 vector::iterator = i; 的方式聲明了一個關于這個容器的迭代器 i。

之后,以兩種 for 循環和一個 while 循環的方式輸出了這個容器的所有元素,三次遍歷的輸出結果都是一樣的。

現在,我們改動上述代碼中的 3 行,仔細觀察一下是在哪里:

#include
#include

using namespace std;

int main() {

// 容器的初始化
deque<int> container{1, 2, 3};

// 迭代器的定義
deque<int>::const_iterator i;

// for 循環 1
cout << "--- for 1 ---" << endl;
for (i = container.begin(); i != container.end(); i++) {
cout << *i << "\t";
}

// for 循環 2
cout << endl << "--- for 2 ---" << endl;
for (i = container.begin(); i < container.end(); i++) {
cout << *i << "\t";
}

// while 循環
cout << endl << "--- while ---" << endl;
i = container.begin();
while (i != container.end()) {
cout << *i << "\t";
i++;
}

return 0;
}

/*
output:
--- for 1 ---
1 2 3
--- for 2 ---
1 2 3
--- while ---
1 2 3
*/

找到了嗎?是這樣的 3 行:

  • #include 改為 #include
  • vector container{(1, 2, 3}; 改為 deque container{1, 2, 3};
  • vector::const_iterator i; 改為 deque::const_iterator i;
  • 簡單一點說,我們是把容器由向量 vector 改為了雙端隊列 deque,三處循環代碼沒有任何改變,同樣實現了容器的遍歷。

    這就體現了迭代器的作用:為容器提供統一的訪問接口。

    迭代器的定義分類

    迭代器是有分類的,我們先看一段代碼:

    #include
    #include

    using namespace std;

    int main() {

    // 容器的初始化
    vector<int> container{1, 2, 3};

    // 迭代器的定義
    vector<int>::iterator i; // 正向迭代器

    // for 循環 1
    cout << "--- for 1 ---" << endl;
    for (i = container.begin(); i != container.end(); i++) {
    *i += 1; // 修改元素的值
    }

    // for 循環 2
    cout << endl << "--- for 2 ---" << endl;
    for (i = container.begin(); i < container.end(); i++) {
    cout << *i << "\t";
    }

    return 0;
    }

    /*
    output:
    --- for 1 ---
    --- for 2 ---
    2 3 4
    */

    這段代碼和之前第一個代碼片段很像,不同在以下兩行:

  • vector::const_iterator i; 改為 vector::iterator i;
  • cout << *i << "\t"; 改為 *i += 1;
  • 首先,我們修改了迭代器的類型。

    我們把 const_iterator 改為 iterator。

    其次,在第一個 for 循環中,把輸出語句改為了賦值語句。

    這里 const_iterator 是 常量正向迭代器 的含義,它只能實現元素的訪問,不能修改元素,而 iterator 是 正向迭代器 的含義,它不僅能實現元素的訪問,還可以修改元素的值。

    所以,迭代器按照定義方式分為以下四類:

    1.?正向迭代器,定義方法如下:

    容器類名::iterator 迭代器名;

    2.?常量正向迭代器,定義方法如下:

    容器類名::const_iterator 迭代器名;

    3.?反向迭代器,定義方法如下:

    容器類名::reverse_iterator 迭代器名;

    4. 常量反向迭代器,定義方法如下:

    容器類名::const_reverse_iterator 迭代器名;

    我們知道了,各種迭代器都可以訪問元素,而非常量迭代器還可以修改元素,那么正向迭代器和反向迭代器有什么區別呢?

    今天課程的最后,我們看一個反向迭代器的示例:

    #include
    #include

    using namespace std;

    int main() {

    vector<int> container{1, 2, 3};

    // 迭代器的定義
    vector<int>::reverse_iterator i; // 反向迭代器

    // for 循環 1
    cout << "--- for 1 ---" << endl;
    for (i = container.rbegin(); i != container.rend(); i++) {
    cout << *i << "\t";
    *i *= 2; // 修改元素的值
    }

    // for 循環 2
    cout << endl << "--- for 2 ---" << endl;
    for (i = container.rbegin(); i < container.rend(); i++) {
    cout << *i << "\t";
    }

    return 0;
    }

    /*
    output:
    --- for 1 ---
    3 2 1
    --- for 2 ---
    6 4 2
    */

    我們這次定義了一個非常量反向迭代器,在 for 循環 1 中,首先輸出元素,緊接著修改了每個元素值為原來的 2 倍,再次使用 for 循環 2 輸出修改后的值。

    輸出結果表明,元素是逆序輸出的,體現了反向的含義,需要注意的是,反向迭代器的兩端使用的是 rbegin() 和 rend() 函數,而循環里的 ++ 將指向容器里的前一個元素。

    關于迭代器第一部分的內容,我們就說到這,下次課我們繼續聊聊迭代器后續的內容。


    「 劍指信奧 C++?系列?

    從零開始,進階信息學奧林匹克競賽

    清華計算機系哥哥專業講解


    趣樂博思教育

    遇見你更優秀的孩子

    ?r

    如果您喜歡?趣樂博思教育,請關注我們的公眾號,發現您更優秀的孩子!

    如果您從這篇文章有所收獲,請點亮下方?在看,或轉發到朋友圈,謝謝!

    總結

    以上是生活随笔為你收集整理的stl clocklist 查找元素_剑指信奥 C++ 之 STL 迭代器(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。