C++之vector容器的的聲明初始化和增刪改查
C++vector容器
C++中有兩種類型的容器:順序容器和關聯(lián)容器。
順序容器主要有vector、list、deque等。其中vector表示一段連續(xù)的內存,基于數(shù)組實現(xiàn),list表示非連續(xù)的內存,基于鏈表實現(xiàn),deque與vector類似,但是對首元素提供插入和刪除的雙向支持。
關聯(lián)容器主要有map和set。map是key-value形式,set是單值。map和set只能存放唯一的key,multimap和multiset可以存放多個相同的key。
容器類自動申請和釋放內存,因此無需new和delete操作。
一、STL的基本概念
STL(Standard Template Library)標準模板庫大體上分為六大組件,分別為容器,算法,迭代器,仿函數(shù),適配器和空間配置器,其中最重要的是容器,算法和迭代器,容器和算法之間通過迭代器無縫連接。
容器:各種數(shù)據結構,比如vector,list,deque,set,map等,用來存放數(shù)據;
算法:各種常用的算法,比如sort,find,copy,for_each等;
迭代器:提供一種方法,能夠依序尋訪某個容器所含的各個元素,每個容器都有自己專屬的迭代器。迭代器的使用非常類似于指針,可以將迭代器作為指針來理解。
二、vector容器的聲明和初始化
vector<T> v; // T代表模板,可以是任意的數(shù)據類型比如int,char,string等 vector<T> Name(v.begin(), v.end()); // 將[v.begin(), v.end)之間的元素賦值創(chuàng)建的Name容器 vector<T> Name(n, elem); // 將Name初始化為包含10個elem值的容器 vector<T> Name(v); // 拷貝構造函數(shù),將容器v賦值給容器Name
三、vector容器的增刪改查
/***********************增加元素****************************/ push_back(elem); // vector尾部插入元素elem insert(const_iterator, elem); // 在迭代器指向的位置插入元素elem /***********************刪除元素****************************/ pop_vack(); // 刪除vector最后一個元素 erase(const_iterator); // 刪除迭代器指向位置的元素 erase(const_iterator start, const_iterator_end); // 刪除迭代器start和end之間所有的元素 clear(); // 刪除vector之間的所有元素 /***********************訪問元素****************************/ for(vector<int>::iterator it=v.begin(); it!=v.end(); it++) //it是vector<int>的迭代器,可以理解為指向容器內元素的指針 for(auto it=v.begin(); it!=v.end(); it++) // 通過auto自動推理出it的類型 for(auto sub_v : v) // 增強型for循環(huán),直接通過底層的迭代器訪問容器內元素 for(int i=0; i<v.size(); i++) // 普通for循環(huán),i表示元素的下標,可以與數(shù)組一樣通過"v[i]"來訪問,或者"v.at(int i)"
四、vector容器的特點
vector數(shù)據結構類似于數(shù)組,但是與普通數(shù)組不同的是:vector容器可以動態(tài)擴展,但是vector并不是在原空間之后續(xù)接新的空間,而是尋找更大的內存空間然后將元數(shù)據拷貝到新的空間,之后再釋放原空間。
但是每次vector擴展空間之后都會多預留一部分空間,當新增的元素個數(shù)不超過預留的空間時,便可以直接續(xù)接在原vector后面。
vector中使用size()函數(shù)來計算容器內元素的個數(shù),而capacity()函數(shù)則返回容器的容量。元素個數(shù)相當于vector內實際存儲的數(shù)據個數(shù),而容器的容量則代表容器開辟的內存空間個數(shù),因此容量>=元素個數(shù)。
下面我們來通過一段代碼來理解一下上述的內容:
vector<int>test; int* p = nullptr; int count=0; for(int i=0; i<10; i++){ test.push_back(i); // 通過push_back的方式存入數(shù)據,理論上每push_back一次,vector便復制一次 if(p != &test[0]){ // 如果容器進行了復制,那么首地址必然會變,記錄下首地址的變化次數(shù),便得到復制次數(shù) p = &test[0]; count++; } } cout << "vector 復制的次數(shù):" << count << endl; // 輸出復制次數(shù) cout << "vector 的容量:" << test.capacity() << endl; // 輸出vector的容量 cout << "vector 的元素個數(shù):" << test.size() << endl; // 輸出vector的元素個數(shù) /************************輸出結果***********************/ vector 復制的次數(shù):7 // 可以看出vector只復制了7次,可以判斷每次vector在復制時預留了空間 vector 的容量:13 // 此時,vector中有13個位置,比元素個數(shù)多3個,即為預留的空間 vector 的元素個數(shù):10 // 正兒八經的元素個數(shù)
總結
到此這篇關于C++之vector容器的的聲明初始化和增刪改查的文章就介紹到這了,更多相關C++vector容器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++統(tǒng)計中英文大小寫字母、數(shù)字、空格及其他字符個數(shù)的方法
這篇文章主要介紹了C++統(tǒng)計中英文大小寫字母、數(shù)字、空格及其他字符個數(shù)的方法,涉及C++字符串的遍歷與簡單判定技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-05-05C語言中指針 int *p=0;和int *p;*p=0;和”&“的關系和區(qū)別詳解
這篇文章主要介紹了C語言中指針 int *p=0;和int *p;*p=0;和”&“有什么關系和區(qū)別,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02