日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++?基礎函數(shù)的介紹及使用(Vector+deque+STL)_C 語言

作者:還是要努力呀! ? 更新時間: 2022-08-20 編程語言

一、Vector的基礎函數(shù)

之前有學習過 vector、set、map等容器,都是需要什么搜什么,沒有詳細的了解其中的內容。最近在看 STL 的相關內容,就順手整理一些基礎性內容,避免以后遇到的時候再臨時抱佛腳。

1. 構造函數(shù)

vector<T> v; ? ? //創(chuàng)建一個空的vector
vector<T> v(int nSize, const t& t); ? ? //創(chuàng)建一個vector,元素個數(shù)為nSize,元素值均為t
vector<T> v(int nSize); ? ? //創(chuàng)建一個vector,元素個數(shù)為nSize
vector<T> v(const vector&); ? ? //復制構造函數(shù)
vector<T> v = vector(begin,end); ? ? //復制[begin,end]范圍內另一個數(shù)組的元素到 v中

2. 增加元素

v.push_back(const T& x); ? ? //在vector尾部增加一個元素x
v.insert(iterator it, const T& x); ? ? //在vector中迭代器指向的元素前插入一個元素x
v.insert(iterator it, int n,const T& x); ? ? //在vector中迭代器指向的元素前插入n個相同的元素x
v.insert(iterator it,const_iterator first,const_iterator last); ? ? //在vector中迭代器指向的元素前插入另一個相同類型vector中[first,last]間的元素

3. 刪除元素

v.erase(iterator it); ? ? //刪除vector中迭代器指向的元素
v.erase(iterator first, iterator last); ? ? //刪除vector中[first,last)的元素
v.pop_back(); ? ? //刪除vector中的最后一個元素
v.clear(); ? ? //清空向量中的所有元素

4. 遍歷vector

v.at(int nPos); ? ? //返回nPos位置元素
v.front(); ? ? //返回vector的首元素
v.back(); ? ? //返回vector的尾元素
v.begin(); ? ? //返回指向第一個元素的迭代器
v.end(); ? ? //返回指向最后一個元素下一位置的迭代器
v.rbegin(); ? ? //反向迭代器,指向最后一個元素
v.rend(); ? ? //反向迭代器,指向第一個元素的前一個位置

5. 判斷函數(shù)

v.empty(); ? ? //判斷vector是否為空

6. 大小函數(shù)

v.size(); ? ? //返回vector中元素個數(shù)
v.capacity(); ? ? //返回當前vector中所能容納的最大元素個數(shù)
v.max_size(); ? ? //返回當前vector最大可允許的元素數(shù)量個數(shù)

7. 其他函數(shù)

v.swap(vector& v2); ? ? //交換兩個同類型的vector
v.assign(int n,const T& t); ? ? //設置vector中第n個元素的值為t
v.assign(const_iterator first,const_iterator last); ? ? //vector中[first,last)中的元素設置成當前vector元素

二、deque的介紹及使用

deque(double ended queue) 作為雙端隊列,不論在尾部或頭部插入元素,都十分便捷。而在中間插入元素會比較費時,因為必須移動中間其他的元素。

雙端隊列是一種隨機訪問的數(shù)據(jù)類型,提供了在序列兩端快速插入和刪除的功能,它可以在需要的時候改變自身大小,完成了標準 C++ 數(shù)據(jù)結構中隊列的所有功能。

三、deque 和 vector的差別

  • deque 則是一種雙向開口的連續(xù)線性空間,vector是單向開口的連續(xù)線性空間。
  • deque 對象在隊列的兩端插入和刪除元素比較高效,vector 在序列末尾插入和刪除元素比較高效。
  • deque 允許在常數(shù)時間內在序列頭部進行元素的插入和刪除操作,并且 deque 沒有所有的 capacity() 觀念,它是動態(tài)地以分段連續(xù)空間組合而成,隨時可以增加一段新的空間并鏈接起來。vector會因舊空間不足而重新配置一塊更大空間,然后復制元素,再釋放舊空間,即空間預留機制。

雖然 deque 也提供 Random Access Iterator,但它的迭代器并不是普通的指針,復雜度較高。因此除非必要,應盡可能選擇使用 vector 而非 deque。對 deque 的排序操作,可以先完整復制到一個 vector 中,使用 STL 中的排序操作對 vector 排序后,再復制回 deque。

deque 通常由一些獨立的區(qū)塊組成,第一個區(qū)塊朝某方向擴展,最后一個區(qū)塊朝另一方向擴展。它允許較為快速地隨機訪問,但不像 vector 一樣把所有對象保存在一個連續(xù)的內存塊,而是多個連續(xù)的內存塊,并且在一個映射結構中保存對這些塊以及順序的跟蹤。

1、構造函數(shù)

#include<deque>
deque<type> deq; ? ? ? ? ? ?//聲明一個元素類型為 type 的雙端隊列 deq
deque<type> deq(nSize); ? ? ? ? ? ?//聲明含有 nSize 個默認初始化元素的 deq
deque<type> deq(nSize, value) ? ? ? ? ? ?//聲明含有 nSize 個值為 value 的元素的deq
deque<type> deq(MyDeque); ? ? ? ? ? ?//復制MyDeque到deq
deque<type> deq(first, last); ? ? ? ? ? ?//使用迭代器first,last范圍內的元素初始化deq

2、常用成員函數(shù)

deq[nPos]; ? ? ? ? ? ?//訪問雙向序列中 nPos 位置上的元素
deq.front(); ? ? ? ? ? ?//返回第一個元素
deq.back(); ? ? ? ? ? ?//返回最后一個元素
deq.push_front(x); ? ? ? ? ? ?//把元素 x 插入到 deq 的頭部
deq.pop_front(); ? ? ? ? ? ?//彈出 deq 的第一個元素
deq.push_back(x); ? ? ? ? ? ?//把元素 x 插入到 deq 的尾部
deq.pop_back(); ? ? ? ? ? ?//彈出 deq 的最后一個元素

3、特點

  • 支持使用 [] 和 at() 進行隨機訪問,但性能沒有 vector 好;
  • 可以在內部進行插入和刪除操作,但性能沒有 list 好;
  • deque 的元素存取和迭代器操作會稍微較慢,因為內部結構中多一個間接過程;
  • deque 的迭代器是一種特殊的智能指針,能夠在不同區(qū)塊之間跳轉;
  • deque 不支持對容量和內存分配時機的控制。
  • deque 的內存重分配優(yōu)于 vector,因為其內部不需要復制所有元素。
  • deque 的內存塊不再被使用時,會被釋放。但是該機制由實際操作版本控制是否執(zhí)行。

四、STL中容器的通用操作函數(shù)

最近在學習 C++ 中 STL 標準庫中的東西,關于list、vector、deque、set、map等容器的操作函數(shù)中存在一些通用函數(shù),整理出來一起學習。

1. 構造函數(shù)

ContType<T> C; ? ? ? ? ? ?//創(chuàng)建一個空容器
ContType<T> C(nSIze); ? ? ? ?//創(chuàng)建一個含有 nSize 個默認元素的容器
ContType<T> C(nSize, Value); ? ?//創(chuàng)建一個含有 nSize 個值為 Value 的元素的容器
ContType<T> C1(C2); ?//復制一個同類型容器
ContType<T> C(first, last); ? ? ?//復制[first,last)范圍內的元素到新容器中
C.~ContType(); ? ? ? ? ? ?//刪除所有元素,釋放內存

2. 判斷函數(shù)

C.empty(); ? ? ? ? ? ?//判斷容器是否為空
C1==C2; ? ? ? ? ? ?//判斷c1是否等于c2

3. 訪問函數(shù)

lst.get_allocator(); ? ? ? ?//返回容器的內存模型
C.begin(); ? ? ? ?//正向迭代器,指向第一個元素
C.end(); ? ? ? ? //正向迭代器,指向最后一個元素的下一位置
C.rbegin(); ? ? //反向迭代器,指向最后一個元素
C.rend(); ? ? ?//反向迭代器,指向第一個元素的前一個位置
C.size(); ? ? ?//返回容器當前存儲的元素數(shù)量
C.max_size(); ?//返回容器能容納的最大元素數(shù)量

4. 賦值函數(shù)

C1=C2;//將c2的值賦給c1

//swap()交換函數(shù)
C1.swap(C2);//交換c1和c2的數(shù)據(jù)
Swap(C1,C2);//同上

//assign()賦值函數(shù)
C.assign(size_type nSize, const_type Value); ? ? ? ?//將list中元素替換為 nSize 個值為 Value 的元素
C.assign(iterator first,iterator last); ? ? ? ?//將[first,last)中的元素復制到當前容器中
C.assign(ContType<T> &C2); ? ? ? ? ? //將另一個容器中的元素復制到當前容器中

5. 操作函數(shù)

C.clear();//清空容器

//insert()插入元素
C.insert(iterator iter, const_type Value);//在 iter 指向的位置插入值為 Value的元素
C.insert(iterator iter,size_type num, const_type &Value);//在 iter 指向的位置插入 num 個值為 Value的元素
C.insert(iterator iter,iterator fisrt,last);//在 iter 指向的位置插入[first,end)區(qū)間內的所有元素

//erase()刪除元素
C.erase(nPos,nSize);//刪除從下標 nPos 開始的 nSize 個元素
C.erase(iterstor iter);//刪除該迭代器指向的元素
C.erase(iterator first,iterator lase);//刪除[first,last)區(qū)間的元素

//vector、deque、list
C.front(); ? ? ? ?//返回第一個元素
C.back(); ? ? ? ?//返回最后一個元素
C.resize(); ? ? ? ?//改變list的大小
//deque、list
C.pop_front(); ? ? ? ?//刪除第一個元素
C.push_front(Value); ? ? ? ?//在容器頭部添加一個元素Value
//vector、deque、list
C.front(); ? ? ? ? ? ? ? //返回第一個元素
C.back(); ? ? ? ? ? ? ? //返回最后一個元素
C.resize(); ? ? ? ? ? ? //改變list的大小
C.pop_back(); ? ? ? ? ? //刪除最后一個元素
C.push_back(Value); ? ? //在容器末尾添加一個元素Value
//vector、list
C.reverse(); ? ? ? ?//把list中的元素反轉

原文鏈接:https://blog.csdn.net/qq_33021529/article/details/123973349

欄目分類
最近更新