0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++學(xué)習(xí)筆記之順序容器

jf_78858299 ? 來(lái)源:QStack ? 作者:月下西樓 ? 2023-05-11 17:05 ? 次閱讀

背景

C++中的順序容器是一種用于存儲(chǔ)和管理元素序列的數(shù)據(jù)結(jié)構(gòu)。它們提供了一組有序的元素,并支持在序列的任意位置插入和刪除元素。C++標(biāo)準(zhǔn)庫(kù)中提供了多種順序容器,包括vector、deque、list、forward_list和array。

vector

vector是一種動(dòng)態(tài)數(shù)組,它可以在序列的末尾快速添加和刪除元素。vector的元素在內(nèi)存中是連續(xù)存儲(chǔ)的,因此可以通過(guò)指針訪問(wèn)元素,也可以使用迭代器遍歷元素。vector的大小可以動(dòng)態(tài)調(diào)整,但是在插入或刪除元素時(shí)可能需要重新分配內(nèi)存,因此可能會(huì)導(dǎo)致性能問(wèn)題。以下是vector的一些常規(guī)操作:

  • push_back:在序列的末尾添加一個(gè)元素。傳入參數(shù)為要添加的元素。
  • pop_back:從序列的末尾刪除一個(gè)元素。無(wú)需傳入?yún)?shù)。
  • insert:在序列的任意位置插入一個(gè)元素。傳入?yún)?shù)為插入位置的迭代器和要插入的元素。
  • erase:從序列的任意位置刪除一個(gè)元素。傳入?yún)?shù)為要?jiǎng)h除元素的迭代器。
  • size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
  • empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
  • clear:刪除序列中的所有元素。無(wú)需傳入?yún)?shù)。 以下是一個(gè)使用vector存儲(chǔ)整數(shù)的例子:
#include 
#include 

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    v.push_back(6);
    v.pop_back();
    auto it = v.begin();
    std::advance(it, 2);
    v.insert(it, 7);
    it = v.begin();
    std::advance(it, 4);
    v.erase(it);
    for (auto i : v) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

在這里,我們使用vector存儲(chǔ)整數(shù),并在序列的末尾添加和刪除元素,以及在序列的任意位置插入和刪除元素。我們使用push_back函數(shù)在序列的末尾添加一個(gè)元素,使用pop_back函數(shù)從序列的末尾刪除一個(gè)元素,使用begin函數(shù)獲取vector的迭代器,并使用advance函數(shù)將迭代器移動(dòng)到指定位置,然后使用insert函數(shù)在指定位置插入一個(gè)元素,使用erase函數(shù)從指定位置刪除一個(gè)元素。最后,我們使用循環(huán)遍歷vector中的元素,并將它們打印到控制臺(tái)上。

deque

deque是一種雙端隊(duì)列,它可以在序列的兩端快速添加和刪除元素。deque的元素在內(nèi)存中不一定是連續(xù)存儲(chǔ)的,因此不能使用指針訪問(wèn)元素,但是可以使用迭代器遍歷元素。deque的大小可以動(dòng)態(tài)調(diào)整,但是在插入或刪除元素時(shí)可能需要重新分配內(nèi)存,因此可能會(huì)導(dǎo)致性能問(wèn)題。以下是deque的一些常規(guī)操作:

  • push_front:在序列的前面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
  • push_back:在序列的后面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
  • pop_front:從序列的前面刪除一個(gè)元素。無(wú)需傳入?yún)?shù)。
  • pop_back:從序列的后面刪除一個(gè)元素。無(wú)需傳入?yún)?shù)。
  • insert:在序列的任意位置插入一個(gè)元素。傳入?yún)?shù)為插入位置的迭代器和要插入的元素。
  • erase:從序列的任意位置刪除一個(gè)元素。傳入?yún)?shù)為要?jiǎng)h除元素的迭代器。
  • size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
  • empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
  • clear:刪除序列中的所有元素。無(wú)需傳入?yún)?shù)。 以下是一個(gè)使用deque存儲(chǔ)字符串的例子:
#include 
#include 

int main() {
    std::deque

在這里,我們使用deque存儲(chǔ)字符串,并在序列的兩端添加和刪除元素,以及在序列的任意位置插入和刪除元素。我們使用push_front函數(shù)在序列的前面添加一個(gè)元素,使用push_back函數(shù)在序列的后面添加一個(gè)元素,使用pop_front函數(shù)從序列的前面刪除一個(gè)元素,使用pop_back函數(shù)從序列的后面刪除一個(gè)元素,使用begin函數(shù)獲取deque的迭代器,并使用advance函數(shù)將迭代器移動(dòng)到指定位置,然后使用insert函數(shù)在指定位置插入一個(gè)元素,使用erase函數(shù)從指定位置刪除一個(gè)元素。最后,我們使用循環(huán)遍歷deque中的元素,并將它們打印到控制臺(tái)上。

list

list是一種雙向鏈表,它可以在序列的任意位置快速添加和刪除元素。list的元素在內(nèi)存中不一定是連續(xù)存儲(chǔ)的,因此不能使用指針訪問(wèn)元素,但是可以使用迭代器遍歷元素。list的大小可以動(dòng)態(tài)調(diào)整,但是在插入或刪除元素時(shí)不需要重新分配內(nèi)存,因此不會(huì)導(dǎo)致性能問(wèn)題。

以下是list的一些常規(guī)操作:

  • push_front:在序列的前面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
  • push_back:在序列的后面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
  • insert:在序列的任意位置插入一個(gè)元素。傳入?yún)?shù)為插入位置的迭代器和要插入的元素。
  • erase:從序列的任意位置刪除一個(gè)元素。傳入?yún)?shù)為要?jiǎng)h除元素的迭代器。
  • size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
  • empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
  • clear:刪除序列中的所有元素。無(wú)需傳入?yún)?shù)。 以下是一個(gè)使用list存儲(chǔ)浮點(diǎn)數(shù)的例子:
#include 
#include 

int main() {
    std::list<double> l = {1.1, 2.2, 3.3, 4.4, 5.5};
    l.push_front(0.0);
    l.push_back(6.6);
    auto it = l.begin();
    std::advance(it, 2);
    l.insert(it, 2.0);
    it = l.begin();
    std::advance(it, 4);
    l.erase(it);
    for (auto d : l) {
        std::cout << d << " ";
    }
    std::cout << std::endl;
    return 0;
}

在這里,我們使用list存儲(chǔ)浮點(diǎn)數(shù),并在序列的任意位置添加和刪除元素。我們使用push_front函數(shù)在序列的前面添加一個(gè)元素,使用push_back函數(shù)在序列的后面添加一個(gè)元素,使用begin函數(shù)獲取list的迭代器,并使用advance函數(shù)將迭代器移動(dòng)到指定位置,然后使用insert函數(shù)在指定位置插入一個(gè)元素,使用erase函數(shù)從指定位置刪除一個(gè)元素。最后,我們使用循環(huán)遍歷list中的元素,并將它們打印到控制臺(tái)上。

forward_list

forward_list是一種單向鏈表,它可以在序列的任意位置快速添加和刪除元素。forward_list的元素在內(nèi)存中不一定是連續(xù)存儲(chǔ)的,因此不能使用指針訪問(wèn)元素,但是可以使用迭代器遍歷元素。forward_list的大小可以動(dòng)態(tài)調(diào)整,但是在插入或刪除元素時(shí)不需要重新分配內(nèi)存,因此不會(huì)導(dǎo)致性能問(wèn)題。以下是forward_list的一些常規(guī)操作:

  • push_front:在序列的前面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
  • insert_after:在序列的任意位置插入一個(gè)元素。傳入?yún)?shù)為插入位置的迭代器和要插入的元素。
  • erase_after:從序列的任意位置刪除一個(gè)元素。傳入?yún)?shù)為要?jiǎng)h除元素的前一個(gè)元素的迭代器。
  • size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
  • empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
  • clear:刪除序列中的所有元素。無(wú)需傳入?yún)?shù)。 以下是一個(gè)使用forward_list存儲(chǔ)整數(shù)的例子:
#include 
#include 

int main() {
    std::forward_list<int> fl = {1, 2, 3, 4, 5};
    fl.push_front(0);
    auto it = fl.before_begin();
    std::advance(it, 2);
    fl.insert_after(it, 2);
    it = fl.before_begin();
    std::advance(it, 4);
    fl.erase_after(it);
    for (auto i : fl) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

在這里,我們使用forward_list存儲(chǔ)整數(shù),并在序列的任意位置添加和刪除元素。我們使用push_front函數(shù)在序列的前面添加一個(gè)元素,使用before_begin函數(shù)獲取forward_list的前向迭代器,并使用advance函數(shù)將迭代器移動(dòng)到指定位置的前一個(gè)位置,然后使用insert_after函數(shù)在指定位置插入一個(gè)元素,使用erase_after函數(shù)從指定位置刪除一個(gè)元素。最后,我們使用循環(huán)遍歷forward_list中的元素,并將它們打印到控制臺(tái)上。

array

rray是一種固定大小的數(shù)組,它可以快速訪問(wèn)元素。array的元素在內(nèi)存中是連續(xù)存儲(chǔ)的,因此可以通過(guò)指針訪問(wèn)元素,也可以使用迭代器遍歷元素。array的大小是固定的,因此不能動(dòng)態(tài)調(diào)整大小。

以下是array的一些常規(guī)操作:

  • at:訪問(wèn)指定位置的元素。傳入?yún)?shù)為元素的索引。
  • operator[]:訪問(wèn)指定位置的元素。傳入?yún)?shù)為元素的索引。
  • front:訪問(wèn)序列的第一個(gè)元素。無(wú)需傳入?yún)?shù)。
  • back:訪問(wèn)序列的最后一個(gè)元素。無(wú)需傳入?yún)?shù)。
  • size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
  • empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。

以下是一個(gè)使用array存儲(chǔ)字符的例子:

#include 
#include 

int main() {
    std::array<char, 5> a = {'h', 'e', 'l', 'l', 'o'};
    std::cout << a.at(0) << " ";
    std::cout << a[1] << " ";
    std::cout << a.front() << " ";
    std::cout << a.back() << " ";
    std::cout << a.size() << " ";
    std::cout << std::boolalpha << a.empty() << std::endl;
    return 0;
}

在這里,我們使用array存儲(chǔ)字符,并訪問(wèn)序列的元素。我們使用at函數(shù)和operator[]運(yùn)算符訪問(wèn)指定位置的元素,使用front函數(shù)和back函數(shù)訪問(wèn)序列的第一個(gè)元素和最后一個(gè)元素,使用size函數(shù)返回序列中元素的數(shù)量,使用empty函數(shù)檢查序列是否為空。最后,我們將訪問(wèn)到的元素和序列的信息打印到控制臺(tái)上。

最后

在實(shí)際編程中,我們需要根據(jù)不同的需求選擇合適的順序容器。例如,如果需要快速在序列的末尾添加和刪除元素,可以選擇vector;如果需要快速在序列的兩端添加和刪除元素,可以選擇deque;如果需要快速在序列的任意位置添加和刪除元素,可以選擇list或forward_list;如果需要快速訪問(wèn)元素,可以選擇array。在選擇容器時(shí),需要考慮容器的特點(diǎn)、用法和性能,以便選擇最合適的容器。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73405
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    569

    瀏覽量

    40063
  • Vector
    +關(guān)注

    關(guān)注

    3

    文章

    53

    瀏覽量

    8536
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    c++vector容器

    1.vector容器介紹 ? ? ? 向量(Vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對(duì)象。
    的頭像 發(fā)表于 07-13 19:36 ?1336次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>vector<b class='flag-5'>容器</b>

    C++set/multiset容器

    set/multiset容器又稱為關(guān)聯(lián)式容器,底層是通過(guò)二叉樹實(shí)現(xiàn)。set/multiset容器在插入數(shù)據(jù)時(shí)就會(huì)做排序處理,默認(rèn)是從小到大的順序。其中set
    的頭像 發(fā)表于 07-17 09:43 ?470次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>set/multiset<b class='flag-5'>容器</b>

    C++STL算法(二)

    C++STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?918次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    c++STL算法(三)

    c++STL算法(三)
    的頭像 發(fā)表于 07-18 15:00 ?1144次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b>STL算法(三)

    C++文件操作

    C++文件操作
    的頭像 發(fā)表于 07-21 10:52 ?1056次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    在main文件中怎樣去使用C++

    ESP32 ESP-IDF 學(xué)習(xí)筆記(五 - 2)【使用C++的工程】文章目錄ESP32 ESP-IDF
    發(fā)表于 01-07 07:44

    C語(yǔ)言學(xué)習(xí)筆記數(shù)據(jù)類型

    學(xué)習(xí)C語(yǔ)言時(shí)的筆記
    發(fā)表于 12-17 16:04 ?1次下載

    C語(yǔ)言學(xué)習(xí)筆記運(yùn)算符優(yōu)先性

    C語(yǔ)言學(xué)習(xí)筆記運(yùn)算符優(yōu)先性
    發(fā)表于 12-17 16:04 ?1次下載

    C++語(yǔ)言學(xué)習(xí)提綱

    C++語(yǔ)言學(xué)習(xí)提綱
    發(fā)表于 12-30 14:50 ?0次下載

    C++“指針”學(xué)習(xí)建議

    C++“指針”學(xué)習(xí)建議
    發(fā)表于 03-31 15:53 ?3次下載

    OpenStackCinder學(xué)習(xí)筆記

    OpenStackCinder學(xué)習(xí)筆記(開關(guān)電源技術(shù)教程ppt)-該文檔為OpenStackCinder學(xué)習(xí)
    發(fā)表于 09-23 12:40 ?5次下載
    OpenStack<b class='flag-5'>之</b>Cinder<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    Linux C/C++ 學(xué)習(xí)路線

    一、秋招 Linux C/C++ offer 情況二、Linux C/C++ 方向的一些思考三、計(jì)算機(jī)基礎(chǔ)知識(shí)的梳理四、C++ 方向的深入
    發(fā)表于 11-06 19:36 ?14次下載
    Linux <b class='flag-5'>C</b>/<b class='flag-5'>C++</b> <b class='flag-5'>學(xué)習(xí)</b>路線

    C++學(xué)習(xí)筆記c++的基本認(rèn)識(shí)

    自這篇文章我們即將開始C++的奇幻之旅,其內(nèi)容主要是讀C++ Primer的總結(jié)和筆記,有興趣可以找原版書看看,對(duì)于學(xué)習(xí)C++還是有很大幫助
    的頭像 發(fā)表于 03-17 13:57 ?675次閱讀

    C++入門通用算法

    C++ 是一種強(qiáng)大的編程語(yǔ)言,它提供了許多通用算法,可以用于各種容器類型。這些算法是通過(guò)迭代器來(lái)操作容器中的元素,因此它們是通用的,可以用于不同類型的容器。在本篇博客中,我們將詳細(xì)介紹
    的頭像 發(fā)表于 05-17 09:40 ?595次閱讀

    動(dòng)態(tài)數(shù)組和C++ std::vector詳解

    std::vector是C++的默認(rèn)動(dòng)態(tài)數(shù)組,其與array最大的區(qū)別在于vector的數(shù)組是動(dòng)態(tài)的,即其大小可以在運(yùn)行時(shí)更改。std::vector是封裝動(dòng)態(tài)數(shù)組的順序容器,且該容器
    的頭像 發(fā)表于 07-19 11:07 ?913次閱讀