首先我們要明白以下幾點:
1.vector陣列是乙個能存放任意資料型別(類,結構,普通變數型別等)的動態陣列!,在資料結構中就相當於順序儲存的線性表,尋找元素非常快,但是插入元素的時間卻很大(list是乙個雙向鍊錶,在同乙個為止插入大量的資料時速度很快,但是查詢的速度就會慢很多)
2.和普通陣列一樣可以通過下標索引來進行訪問!
3.與其它動態序列容器相比(deques, lists and forward_lists),vector在訪問元素的時候更加高效,在末尾新增和刪除元素相對高效。對於其它不在末尾的刪除和插入操作,效率更低。比起lists和forward_lists統一的迭代器和引用更好。
4.vector動態陣列可以通過陣列名進行直接賦值! vectorc; vector
b; b = c;
5.他的缺點:當新元素插入時候,這個陣列需要被重新分配大小為了增加儲存空間。其做法是,分配乙個新的陣列,然後將全部元素移到這個陣列。就時間而言,這是乙個相對代價高的任務,因為每當乙個新的元素加入到容器的時候,vector並不會每次都重新分配大小。(比普通的陣列具有更高的時間複雜度和空間複雜度)
#include//標頭檔案一定要有using namespace std;//其所在的命名空間
vectorvec; //宣告乙個int型向量
vectorvec1(4,1); //vec1的內容為1,1,1,1
vectorvec1; //vec1內容1,2,3,4,5,6
vectorvec(tmp); //宣告並用tmp向量初始化vec向量(也可以用vec=t,p)
int arr[5] = ;
vectorvec(arr, arr + 5); //將arr陣列的元素用於初始化vec向量
//這個主要是為了和vec.end()指標統一。
vectorvec(&arr[1], &arr[4]); //將arr[1]~arr[4]範圍內的元素作為vec的初始值
1.vec.push_back(同型別量);作用是在vector的末尾插入新元素;
2.insert()第乙個引數為迭代器,作用為在迭代器前面插入新元素;
3.assign(5,1)向vector中加入5個1,同時清除掉以前的元素。
std::vectorvec1;vec1.push_back(1);
vec1.push_back(2);
//vec1元素:1,2
std::vectorvec2(vec1); //將vec1賦值給vec2
std::vector::iterator it;
it=vec2.begain();
vec2.insert(it,5); //在第乙個元素前新增5
it=vec2.begain(); //每當新插入乙個元素時記憶體重新分配所以要重新為迭代器分配指標
vec2.insert(it,2,6);
std::vectorvec3(vec2);
vec3.assign(2,5); //清楚所有元素只留兩個5
1.pop_back()刪除最後乙個元素。
2.erase()刪除指定位置元素。(其中的引數要是指標變數,比如begain(),end(),以及迭代器值),例如vec.erase(vec.begin()+2);刪除第3個元素
3.clear()清除所有元素。
4.empty()判斷該陣列是否為空
1.front()訪問第乙個元素(第乙個元素的值而不是位址!begin()相反)
2.back()訪問最後乙個元素(最後乙個元素的值而不是位址!end()相反)
3.size()陣列的元素個數
vectora;//像陣列一樣以下標訪問
for(int i = 0; i < a.size(); i++)
//以迭代器訪問
vector::iterator it;
for(it=a.begin(); it!=a.end(); it++)
#include reverse(vec.begin(), vec.end())//將元素翻轉,即逆序排列!#include sort(vec.begin(), vec.end()); //採用的是從小到大的排序
//如果想從大到小排序,可以採用上面反轉函式,也可以採用下面方法:
bool comp(const int& a, const int& b)
sort(vec.begin(), vec.end(), comp);
//c++ 構建二維動態陣列int **p;
p = new int*[10]; //注意,int*[10]表示乙個有10個元素的指標陣列
for (int i = 0; i < 10; ++i)
//用vector構建二維陣列
vector> matrix;
vectora;
a.push_back(1);
a.push_back(3);
a.push_back(1);
matrix.push_back(a);
//或者用下面的方法
int i,j;
vector> array(5);
for (i = 0; i < array.size(); i++)
array[i].resize(3);//這裡一定要使用resize其相當於每行的元素數並已經初始化過了
刪除元素:
std::vector< int> vec;std::vector< int>::iterator itvec;
for( itvec = vec.begin(); itvec != vec.end(); )
else
itlist++;
}
對vector、queue等,每次erase操作,函式會刪除指定迭代器位置的元素,然後將後面的元素前移一位,erase返回指向被刪除元素下一元素的迭代器。(其實,我認為,返回的還是指定的迭代器,只不過它現在指向了被刪除元素的下一元素,如有不對,懇請大家指正!)
對於erase操作,還有一種寫法是:vec.erase(itvec++)
不過需要注意,這種寫法對vector、deque等容器無效!
上面兩種寫法,第一種對各種容器都有效,第二種寫法只對map,list等容器有效。為了方便統一,還是建議採取第一種寫法。
增加元素:
出於學習的目的,現在提出乙個要求,如原有vector為{1,2,3,4,5},現在要在每個元素前加乙個8,使vector變為{8,1,8,2,8,3,8,4,8,5}.用迴圈表示,**如下:
#include#include using namespace std;int main()
; auto iter = vec.begin();
for (; iter != vec.end();)
for (auto num : vec)
cout << num << endl;
return 0;
}
需要注意的是,insert會將指定物件插入指定迭代器之前的位置,並返回這個位置的迭代器,要想該迭代器指向之前的下乙個元素,需要遞增兩次。
如果需要在每個元素之後插入元素,該怎麼操作?
#include#include using namespace std;int main()
; auto iter = vec.begin();
iter++;
for (; iter != vec.end();)
vec.insert(vec.end(),8);
for (auto num : vec)
cout << num << endl;
return 0;
}
這裡需要對iter首先自增一次,在迴圈最後,由於iter自加兩次,已經和end()函式返回迭代器位置一致,所以需要再insert一次,才能在尾部再插入乙個元素。
關於迭代器失效有一篇總結:
C vector陣列使用
主要是記住一維和二維陣列的定義以及區別,它們初始化,和新增刪除元素是有點不太一樣的。vectorarr arr.size arr.begin arr.insert arr.push back arr.end vector a 錯誤的定義方式 vector a 正缺的定義方式 vector v 注意 ...
C Vector 動態陣列
constructors 建構函式 operators 對vector進行賦值或比較 assign 對vector中的元素賦值 at 返回指定位置的元素 back 返回最末乙個元素 begin 返回第乙個元素的迭代器 capacity 返回vector所能容納的元素數量 在不重新分配記憶體的情況下 ...
C Vector的使用誤區
初始化vector並傳引用到dll中,dll中為該引用新增節點,vector記憶體釋放時會報堆疊錯誤,原因?這個問題其實挺好避免的,說白了就是不要乙個模組new,另乙個模組delete,不要認為你的vector的節點資料在棧上,vector的本質就是乙個變長陣列,怎麼會在棧上呢,資料肯定是在堆上的,...