vector常用方法
assign() 對Vector中的元素賦值
void assign( input_iterator start, input_iterator end ); //
void assign( size_type num, const TYPE &val );
reserve() 設置Vector最小的元素容納數量 函數為當前vector預留至少共容納size個元素的空間.(譯注:實際空間可能大於size)
resize() 改變Vector元素數量的大小 函數改變當前vector的大小為size,且對新創建的元素賦值val
swap() 交換兩個Vector
capacity() 返回vector所能容納的元素數量(在不重新分配內存的情況下)
max_size() 返回Vector所能容納元素數量的最大值(譯注:包括可重新分配內存).
size() 返回Vector元素數量的大小
get_allocator() 返回vector的內存分配器
http://blog.csdn.net/qingqinglanghua/article/details/5035763
初始化及清零
定義空二維vector,再賦值
vector<vector <int> > ivec(m ,vector<int>(n)); //m*n的二維vector,注意兩個 "> "之間要有空格!
void assign(const_iterator first, const_iterator last);
void assign( size_type _Count, const Type& _Val ); // 賦值,用指定元素序列替換容器內所有元素
定義並初始化二維數組
vector<vector <int> > ivec(m ,vector<int>(n,0)); //m*n的二維vector,所有元素初始化為0
vector<string> v1; // 創建空容器,其對象類型為string類
vector<string> v2(10); // 創建有10個具有初始值(即空串)的string類對象的容器
vector<string> v3(5, "hello"); // 創建有5個值為“hello”的string類對象的容器
vector<string> v4(v3.begin(), v3.end()); // v4是與v3相同的容器(完全復制)
iterator erase(iterator it); // 刪除指定元素,並返回刪除元素后一個元素的位置(如果無元素,返回end())
iterator erase(iterator first, iterator last); // 注意:刪除元素后,刪除點之后的元素對應的迭代器不再有效。
void clear() const; // 函數刪除當前vector中的所有元素,相當於調用erase( begin(), end())
http://hi.baidu.com/ljjyxz123/blog/item/c3bab7f50aabbc05bd31096e.html
assign和resize
template <class InputIterator>
void assign ( InputIterator first, InputIterator last );
void assign ( size_type n, const T& u );
assign() 函數要么將區間[first, last)的元素賦到當前vector,或者賦n個值為u的元素到vector中.這個函數將會清除掉為vector賦值以前的內容.
注意:assign操作首先刪除vector容器內的所有元素,然后將參數指定的新元素插入到該容器中。
參數
first, last
標記一段范圍的一對迭代器,即將[first,last)標記范圍內所有元素復制到當前的vector中.包含first所指向的元素,不包含last所指向的元素。
n,u
表示將當前vector中重新設置為存儲n個值為t的元素
void resize ( size_type sz, T c = T() );
改變長度
把當前 vector容器的的長度大小重設為sz
如果sz小於當前vector容器的size,則刪除多出來的元素,否則采用值為 T 來初始化新添加的元素
參數
sz
要設置當前vector的size的值
Member type size_type is an unsigned integral type.
c
用初始化的新添加的元素的值。
可為空,為空則表示采用值初始化來初始化新添加的元素
resize函數有2個重載版本,一個只有一個size_type參數,一個除了size_type參數外還有_Ty _val,即“可選”新元素值。
先說第一個版本:
void resize(size_type _Newsize)
{ // determine new length, padding with _Ty() elements as needed
resize(_Newsize, _Ty());
}
可見它用_Ty()做第2個參數,調用了它的第2個版本。第2個版本的定義如下:
void resize(size_type _Newsize, _Ty _Val)
{ // determine new length, padding with _Val elements as needed
if (size() < _Newsize)
_Insert_n(end(), _Newsize - size(), _Val);
else if (_Newsize < size())
erase(begin() + _Newsize, end());
}
由定義可知,對於第一個版本:
若_Newsize小於oldsize,則剩余元素值不變。
若_Newsize大於oldsize,則新添加的元素值用元素的默認構造參數初始化(特別的,int型的將被初始化為0)。
對於第2個版本:
若_Newsize小於oldsize,則剩余元素值不變。(全部調用erase(begin() + _Newsize, end())擦除掉多余元素)
若_Newsize大於oldsize,則新添加的元素值用提供的第2個參數初始化。
不管用哪個版本,[0,min(_Newsize,oldsize))范圍內的值均保持不變。
capcity和size
CAPCITY是此容器當前可以容納的最大元素個數,就是不用重新分配內存是可以容納的個數
SIZE是現在容器中已經存在的元素個數
所以容量>=長度
vector <int> a(10);
a.push_back(1);
此時a.size()=1,a.capacity()=10
reverse和resize
vector 的reverse只是增加了vector的capacity,但是size沒有改變!
resize同時改變了vector的capacity和size!
reserve是容器預留空間,但並不真正創建元素對象,在創建對象之前,不能引用容器內的元素,因此當加入新的元素時,需要用push_back()/insert()函數。
resize是改變容器的大小,並且創建對象,因此,調用這個函數之后,就可以引用容器內的對象了,因此當加入新的元素時,用operator[]操作符,或者用迭代器來引用元素對象。
再者,兩個函數的形式是有區別的,reserve函數之后一個參數,即需要預留的容器的空間;resize函數可以有兩個參數,第一個參數是容器新的大小,第二個參數是要加入容器中的新元素,如果這個參數被省略,那么就調用元素對象的默認構造函數。
vector<int> myVec;
myVec.reserve( 100 ); // 新元素還沒有構造,
// 此時不能用[]訪問元素
for (int i = 0; i < 100; i++ )
{
myVec.push_back( i ); //新元素這時才構造
}
myVec.resize( 102 ); // 用元素的默認構造函數構造了兩個新的元素
myVec[100] = 1; //直接操作新元素
myVec[101] = 2;
為實現resize的語義,resize接口做了兩個保證:
一是保證區間[0, new_size)范圍內數據有效,如果下標index在此區間內,vector[indext]是合法的。
二是保證區間[0, new_size)范圍以外數據無效,如果下標index在區間外,vector[indext]是非法的。
reserve只是保證vector的空間大小(capacity)最少達到它的參數所指定的大小n。在區間[0, n)范圍內,如果下標是index,vector[index]這種訪問有可能是合法的,也有可能是非法的,視具體情況而定。
resize和reserve接口的共同點是它們都保證了vector的空間大小(capacity)最少達到它的參數所指定的大小。
http://blog.sina.com.cn/s/blog_749f55cd0100p5qw.html
http://bbs.bccn.net/thread-91130-1-1.html
vector list 賦值速度比較
v2 = v1;//用賦值操作符賦值vector()(3rd)
l2 = l1;//用賦值操作符賦值list
v2.assign(v1.begin(), v1.end());//用assign給vector賦值(1st)
l2.assign(l1.begin(), l1.end());//用assign給list賦值
copy(v1.begin(), v1.end(), inserter(v2, v2.begin()));//用copy算法給vector賦值(插入迭代器方式)(5nd)
copy(l1.begin(), l1.end(), inserter(l2, l2.begin()));//用copy算法給list賦值(插入迭代器方式)
v2.resize(v1.size());
copy(v1.begin(), v1.end(), v2.begin());//用copy算法給vector賦值(resize)(2nd)
l2.resize(l1.size());
copy(l1.begin(), l1.end(), l2.begin());//用copy算法給list賦值(resize)
v2.assign(l1.begin(), l1.end());//用assign給vector賦值(從list)(4st)
l2.assign(v1.begin(), v1.end());//用assign給list賦值(從vector)
總結:
vector:對於vector賦值方式中,assign的速度是最快的,其次是resize以后用copy算法賦值,而最先能夠想到的賦值操作符,速度卻並不快,只能夠排名第三,目前還不知道這是為什么,采用插入迭代器再用copy的方式是速度最慢的一種。
list:對於list賦值,賦值操作符的速度是最快的,其次是assign,然后是采用resize的copy,最后一位同樣是采用插入迭代子方式的copy。