日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

C++ vector多维数组初始化及清零

發布時間:2025/3/21 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。


from: http://www.cnblogs.com/wei-li/archive/2012/06/08/2541576.html

總結

以上是生活随笔為你收集整理的C++ vector多维数组初始化及清零的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。