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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++_顺序容器

發布時間:2024/7/5 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++_顺序容器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

順序容器類型

順序容器

  • vector: 支持快速隨機訪問
  • list: 支持快速插入與刪除
  • deque: 雙端隊列

順序適配器
- stack: 后進先出(LIFO)堆棧
- queue: 先進先出(FIFO)隊列
- priority_queue: 有優先級管理的隊列

上述順序容器包含于以下頭文件中:< vector >,< list >,< deque >;
所有的容器類型都定義了默認的構造函數,用于創建指定的空容器類型, 默認構造函數不帶參數

容器構造函數
//C為容器名, T元素類型(T也可以是容器類型), c容器

  • C< T > c; 創建一個空容器,適用所有容器
  • C c(c2); 創建容器c2的副本, c與c2具有相同的容器類型, 用于存放相同類型元素,適用所有容器
  • C c(begin,end); 創建c,其元素為begin到end內元素副本,適用所有容器
  • C c(n,t); 創建n個值為t的容器, t必須是C的元素類型值, 只適用于順序容器
  • C c(n); 創建n個值初始化元素的容器,只適用于順序容器

    注: 將一個容器復制給另一個容器的時候, 容器類型,元素類型必須匹配;
    容器內元素類型必須支持賦值運算, 元素對象必須可以復制(IO流對象就不可以作為元素類型,不支持復制或賦值)
    例:

  • vector<int> v1; vector<int> v2(v1);//ok list<int> l(v1);//error 容器類型不匹配 vector<double> v3(v1);//error 元素類型不匹配

    迭代器
    所有迭代器都具有相同接口, 迭代器可看做指針;
    迭代器常用運算

    • *iter : 返回迭代器iter所指向元素的引用
    • ++iter/iter++/iter–/–iter : 給iter加1或減1,使其指向容器中前一個元素與后一個元素
    • iter==/!= : 比較兩個迭代器是否相等, 兩個迭代器指向容器中同一個元素時,迭代器相等

    vector與deque容器中提供額外運算, 可進行+/-n的算術運算,以及比較大小, 等同于數組中元素地址的運算
    注: 在迭代器范圍中遵守: [begin, end) ,end表示最后一個元素的后一個位置, 當begin等于end的時候則容器為空; 在元素的添加或刪除的時候, 應該相應調整迭代器的值,避免產生無效的迭代器

    容器定義的類型

    • size_type: 無符號整數,表示容器的最大存儲長度
    • iterator: 容器迭代器類型
    • const_iterator: 只讀迭代器,類似于 const TYPE* iter
    • reverse_iterator: 按逆序查找元素
    • difference_type: 存儲兩個迭代器的差值(包含負數)

      在順序容器中添加元素

    • c.push_back(t): 尾部插入t, 返回void

    • c.push_front(t): 前端插入t, 返回void, 只適用于list ,deque (其主要原因在于list,deque可基于鏈表實現,而vector為數組,其擴容方式與鏈表不同)
    • c.insert(p,t): 在迭代器p所指向的元素前面插入元素為t的新元素, 返回添加新元素的迭代器
    • c.insert(p,n,t): 在迭代器p所指向的元素前面插入n個值為t的新元素, 返回void
    • c.insert(p,b,e): 在迭代器p所指向元素的前面插入由迭代器b和e標記的范圍元素, 返回void

    注:push_back與push_fron 也可寫成: c.insert(c.end(), t)與c.insert(c.begin(),t) ,vector不可push_front;
    在插入元素后應注意迭代器的更新, 當新元素插入后迭代器都將出現失效, 在循環使用insert的時候應注意迭代器的更新
    例:

    vector<int>::iterator first=v.begin(), last=v.end(); while(first!=last){cin>>t;first=v.insert(first,t);++first; } //上述操作將出現死循環,每次元素的添加將導致last迭代器的改變,last未更新,需每次添加后將last=v.end()

    容器之間的比較
    容器之間的比較必須二者具有相同容器類型和元素類型;
    容器之間的比較是基于元素類型的比較運算,若當前元素類型不支持大小比較, 那容器就不能進行比較操作
    所有容器都通過比較其元素對來實現關系運算

    容器大小容量操作

    • c.size() : 返回容器c中元素個數,返回類型為c::size_type
    • c.max_size(): 返回容器的最大容納量,返回c::size_type
    • c.empty(): 返回標記容器大小是否為0的bool值
    • c.resize(n): 重新調整容器大小,使其能容納n個元素,超出范圍時,刪除多余元素(屬于壓縮容器)
    • c.resize(n,t): 重新調整容器大小,使其能容納n個元素,所添加的新元素的值都為t

    注: resize操作將導致迭代器失效

    訪問順序容器元素

    • c.back(): 返回c最后一個元素的引用,c為空時, 該操作未定義
    • c.front(): 返回第一個元素的引用,c為空, 則操作未定義
    • c[n] : 返回下標為n的元素的引用, n<0||n>c.size(), 則操作未定義,只適用于vector與deque
    • c.at(n):與c[n]一致

    順序容器元素刪除

    • c.erase(p): 刪除迭代器p所指向的元素,返回一個迭代器, 指向被刪除元素的后一位置, p若超出末端則操作未定義
    • c.erase(b,e): 刪除迭代器b,e標記的范圍內所有元素, 返回一個迭代器,指向被刪除元素的后一位置,超出末端的時候返回超出末端的下一位置
    • c.clear(): 刪除所有元素,返回void
    • c.pop_back(): 刪除容器c的最后一個元素,返回void,c為空時則操作未定義
    • c.pop_front():刪除c的第一個元素,返回void,只適用于list或deque

    注:采用pop_front與front結合使用,可實現棧結構

    list<int>ll; while(!ll.empty()){cout<<ll.front();ll.pop_front(); }

    當使用erase刪除時,必須保證迭代器位置正確
    刪除操作也會導致迭代器失效

    容器的選擇

  • 程序要求隨機訪問元素,使用vector或deque
  • 必須在中間位置插入元素,采用list
  • 在首位插入元素,采用deque
  • 若既要支持隨機訪問且可較快插入,可將list容器作為vector的類型,或者將vector容器作為list的類型( 類似于java中的ArrayList)
  • 總結

    以上是生活随笔為你收集整理的C++_顺序容器的全部內容,希望文章能夠幫你解決所遇到的問題。

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