C++ vector多維數組初始化及清零


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相同的容器(完全復制)

使用STL vector的幾種清空容器(刪除)辦法

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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM