C++中的STL之vector的超詳細基本用法
在c++中,vector是一個十分有用的容器,下面對這個容器做一下總結。
1 基本操作
(1)標頭檔案#include<vector>.
(2)建立vector物件,vector<int> vec;
(3)尾部插入數字:vec.push_back(a);
(4)使用下標訪問元素,cout<<vec[0]<<endl;記住下標是從0開始的。
(5)使用迭代器訪問元素.
vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1個元素前面插入a;
(7)刪除元素: vec.erase(vec.begin()+2);刪除第3個元素
vec.erase(vec.begin()+i,vec.end()+j);刪除區間[i,j-1];區間從0開始
(8)向量大小:vec.size();
(9)清空:vec.clear();
2
vector的元素不僅僅可以使int,double,string,還可以是結構體,但是要注意:結構體要定義為全域性的,否則會出錯。下面是一段簡短的程式程式碼:
#include<stdio.h> #include<algorithm> #include<vector> #include<iostream> using namespace std; typedef struct rect { int id; int length; int width; //對於向量元素是結構體的,可在結構體內部定義比較函式,下面按照id,length,width升序排序。 bool operator< (const rect &a) const { if(id!=a.id) return id<a.id; else { if(length!=a.length) return length<a.length; else return width<a.width; } } }Rect; int main() { vector<Rect> vec; Rect rect; rect.id=1; rect.length=2; rect.width=3; vec.push_back(rect); vector<Rect>::iterator it=vec.begin(); cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl; return 0; }
3 演算法
(1) 使用reverse將元素翻轉:需要標頭檔案#include<algorithm>
reverse(vec.begin(),vec.end());將元素翻轉(在vector中,如果一個函式中需要兩個迭代器,
一般後一個都不包含.)
(2)使用sort排序:需要標頭檔案#include<algorithm>,
sort(vec.begin(),vec.end());(預設是按升序排列,即從小到大).
可以通過重寫排序比較函式按照降序比較,如下:
定義排序比較函式:
bool Comp(const int &a,const int &b)
{
return a>b;
}
呼叫時:sort(vec.begin(),vec.end(),Comp),這樣就降序排序。
vector初始化的幾種方法:
vector<int>::iterator int_ite; vector<string>::iterator string_ite; //vector<T> v(n,i)形式,v包含n 個值為 i 的元素 vector<int> ivec(10,0); //vector<T> v(v1)形式,v是v1 的一個副本 vector<int> ivec1(ivec); //vector<T> v(n)形式,v包含n 個值初始化的元素 vector<int> ivec2(10); //vector<T> v(n)形式,v包含n 個值初始化的元素 vector<string> svec(10); //陣列初始化vector int iarray[]={1,2,3,4,5,6,7,8,9,0}; //count: iarray陣列個數 size_t count=sizeof(iarray)/sizeof(int); //int陣列初始化 ivec3 vector<int> ivec3(iarray,iarray+count); //string陣列初始化 svec1 string word[]={"ab","bc","cd","de","ef","fe"}; //s_count: word陣列個數 size_t s_count=sizeof(word)/sizeof(string); //string陣列初始化 svec1 vector<string> svec1(word,word+s_count); //用 back_inserter 函式 vector<int> ivec4; //空物件 fill_n(back_inserter(ivec4),10,3); //10個3 填充ivec4. }C++ Reference對於memset的定義為:
void * memset ( void * ptr, int value, size_t num );
對int型別的記憶體區域進行初始化,ptr的型別是int*,舉例說明一下:
1. 將記憶體初始化為0
memset(ptr,0,sizeof(ptr));
2. 將記憶體初始化為-1
memset(ptr,0xff,sizeof(ptr));
因為按照位元組進行填充,那麼value值為0xff,將會把記憶體的每個位元組都填充為0xff,則int值的區域為全1,那麼int值就是-1。
3. 將記憶體初始化為極大值
memset(ptr,0x3f,sizeof(ptr));
這段初始化程式碼初始出來的int值大小是1061109567 使用memset初始化vector vector<int> vec(10,1); memset(vec.data(),0,vec.size()*sizeof(int));