一、頭文件 #include<vector>
二、常用方法:
// 在這個向量的尾部插入x的考貝,平均時間為常數,最壞時間為O(n);
1: void push_back(const T& x);
比如:vector<string> fruits;
fruits.pusb_back ("orange");
fruits.push_back("apples");
fruits.push_back("grapes");
fruits.pusb_back("apples");
那麼向量fruits現在包含了下列順序的項:"orange", "apples", "grapes", "apples";
//前置條件:迭代器位於向量頭和向量尾後的下一個位子之間
//後置條件:X的拷貝放入迭代器所指的位置; 調用前,每個大於等於該位置下標的位置一次向後移動;返回位於新插入位置的迭代器;O(n);
2: iterator insert(iterator position, const T& X);
假設迭代器 ite 位於小標為2的位置上,實行操作:vector<cstring>::iterator new_ite = fruits.insert(ite, "kiwi");後 fruits 向量變為如下:
"orange", "apples", "kiwi", "grapes", "apples";
迭代器 new_ite 位於下標為2 的“kiwi”上; 並且 ite 失效(即:ite 不再存在 或 不確定其位置);
//後置條件: 調用後向量尾部的項被刪除;
3: void pop_back();
實行操作:fruits.pop_back();後 向量 fruits 如下:"orange", "apples", "kiwi", "grapes";
//前置條件:迭代器位於向量的某一項位置上;
//後置條件:這次調用前位於迭代器上的項被刪除; 調用後次迭代器下標後面的所有下標一次向前移動; O(n);
4: void erase (iterator position);
如果迭代器 ite 位於項 “apples” 的位置,實行操作:fruits.erase(ite);後向量 fruits 如下: "orange", "kiwi", "grapes";
迭代器 ite 失效(即:ite 不再存在 或 不確定其位置);
此外,void erase(iterator first, iterator last)還用一個擁有兩個迭代器參數的版本----first和last, 所有在first(包括first)和 last(不包括 last)之間的項將被刪除;
若我們假設 fruits 向量中有項:"orange", "apples", "kiwi", "grapes"; 並且 first 位於“apples”, last 位於 “grapes”上;
執行操作:fruits.erase (first, last) 後向量 fruits 如下:"orange", “grapes";
同樣,迭代器 first 和 last 也要失效;
// 返回向量中項的 個數;
5: unsigned size ();
繼續接著 4 第一個erase() 後的操作執行:unsigned cnt = fruits.size(); 那麼 cnt 將是 3;
// 返回位於向量開頭的迭代器
6: iterator begin ();
執行操作: vector <cstring> :: iterator ite = fruits.being();
那麼迭代器 ite 位於 項 “orange” 上;
// 返回恰好位於位於向量最後一項的下一個位置,(注意不是在最後一個項的位置,而是其後)
7: iterator end();
執行操作:
vector <cstring>::iterator ite = fruits.end ();
fruits.insert(ite, "lemons");
向量fruits如下: "orange", "kiwi", "grapes", "lemons";
// 返回向量開頭項的引用
8: T& front()
繼續執行: cout << fruits.front(); 那麼輸出的是:“orange”;
// 如果這個向量中不包含任何項,則返回 真, 否則返回假;
9: bool empty ();
// 清空向量中所有項
10: void clear ();
繼續執行操作: fruits.clear (); 則向量法 fruits 建為空
此外,對於數組的 [] 運算符 也完全使用與 vector 且方法完全一樣,這裡不再贅述;
提供你一個辦法:
在文件 <vector>
中,下一個斷點
~vector()
{
}
看看會不會運行到,這樣,你就知道,你不必自己調用 ~vector(),系統會做的。
我的機器上,是第 386 行。
試試看
STL中為我們提供的最重要的兩個內容是容器(vector,list等)和一系列的算法。在這些算法中有許多需要遍歷容器中的所有元素,如search,sort等算法。STL的設計者希望將算法和容器分離開來,一個算法可以幫不同的容器實現功能。為此目的,STL應用到了《設計模式》中提到的迭代器模式。
《設計模式》中將迭代器模式定義為:提供一種方法,使之能依序遍歷容器中的每個元素,而不需要暴露容器內部的信息。在面向對象的設計裡,實現迭代器,我們會為所有的迭代器提供一個統一的接口,然後更個容器的迭代器繼承這個接口,然後在使用處通過接口來實現對不同迭代器的調用。但STL是采用泛型思維,利用摸版來實現的類庫,所以它的迭代器的實現和面向對象稍有不同,但原理類似。在此將通過例子來具體看看STL中迭代器的實現。
我們先來看看find()函數的實現:
//摘自stl_algo.h
template<typename _InputIter, typename _Tp>
inline _InputIter
find(_InputIter __first, _InputIter __last,
const _Tp& __val,
input_iterator_tag)
{
while (__first != __last && !(*__first == __val))
++__first;
return __first;
}
find()函數的功能是在一個容器中查找一個元素,需要遍歷兩個迭代器對象_first和_last所在的區間。在此我們看到它對區間的遍歷是通過++__first來實現的。也就是說迭代器需要重載++運算符來實現對容器的遍歷。來具體看看vector和list中的迭代器實現。
我們知道vector中的元素是連續存放的,類似於數組,在數組中可以通過指針很容易的實現對數組的遍歷,在vector中也一樣,並不需要提供給它專門的迭代器類,通過指針就可以實現迭代器的功能。看看例子:
#include<iostream>
#include<vector>
using namespace std;
template<typename _InputIter, typename _Tp>
inline _InputIter
myfind(_InputIter __first, _InputIter __last,
const _Tp& __val)
{
while (__first != __last && !(*__first == __val))
++__first;
return __first;
}
int main()
{
vector<int> vec;
for( int i = 0; i < 10 ; i ++ )
vec.push_back(i);
int *p0 = &vec[0];
int *p1 = &vec[10];
int *p2 = myfind(p0,p1,6);
if ( p2 != &vec[10])
cout << *p2 << endl;
system("pause");
return 0;
}
例子中,我對find......余下全文>>