日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時(shí)間:2025/3/21 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ vector多维数组初始化及清零 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

vector常用方法


assign() 對(duì)Vector中的元素賦值

void assign( input_iterator start, input_iterator end ); //
void assign( size_type num, const TYPE &val );

reserve() 設(shè)置Vector最小的元素容納數(shù)量 函數(shù)為當(dāng)前vector預(yù)留至少共容納size個(gè)元素的空間.(譯注:實(shí)際空間可能大于size)

resize() 改變Vector元素?cái)?shù)量的大小 函數(shù)改變當(dāng)前vector的大小為size,且對(duì)新創(chuàng)建的元素賦值val

swap() 交換兩個(gè)Vector

capacity() 返回vector所能容納的元素?cái)?shù)量(在不重新分配內(nèi)存的情況下)

max_size() 返回Vector所能容納元素?cái)?shù)量的最大值(譯注:包括可重新分配內(nèi)存).

size() 返回Vector元素?cái)?shù)量的大小

get_allocator() 返回vector的內(nèi)存分配器?

http://blog.csdn.net/qingqinglanghua/article/details/5035763

?

初始化及清零


定義空二維vector,再賦值
vector<vector <int> > ivec(m ,vector<int>(n)); //m*n的二維vector,注意兩個(gè) "> "之間要有空格!

void assign(const_iterator first, const_iterator last);

void assign( size_type _Count, const Type& _Val ); // 賦值,用指定元素序列替換容器內(nèi)所有元素

定義并初始化二維數(shù)組

vector<vector <int> > ivec(m ,vector<int>(n,0)); //m*n的二維vector,所有元素初始化為0

vector<string> v1; // 創(chuàng)建空容器,其對(duì)象類(lèi)型為string類(lèi) vector<string> v2(10); // 創(chuàng)建有10個(gè)具有初始值(即空串)的string類(lèi)對(duì)象的容器 vector<string> v3(5, "hello"); // 創(chuàng)建有5個(gè)值為“hello”的string類(lèi)對(duì)象的容器 vector<string> v4(v3.begin(), v3.end()); // v4是與v3相同的容器(完全復(fù)制)

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

iterator erase(iterator it); // 刪除指定元素,并返回刪除元素后一個(gè)元素的位置(如果無(wú)元素,返回end())
iterator erase(iterator first, iterator last); // 注意:刪除元素后,刪除點(diǎn)之后的元素對(duì)應(yīng)的迭代器不再有效。

void clear() const; // 函數(shù)刪除當(dāng)前vector中的所有元素,相當(dāng)于調(diào)用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() 函數(shù)要么將區(qū)間[first, last)的元素賦到當(dāng)前vector,或者賦n個(gè)值為u的元素到vector中.這個(gè)函數(shù)將會(huì)清除掉為vector賦值以前的內(nèi)容.

注意:assign操作首先刪除vector容器內(nèi)的所有元素,然后將參數(shù)指定的新元素插入到該容器中。

參數(shù)

first, last

標(biāo)記一段范圍的一對(duì)迭代器,即將[first,last)標(biāo)記范圍內(nèi)所有元素復(fù)制到當(dāng)前的vector中.包含first所指向的元素,不包含last所指向的元素。

n,u

表示將當(dāng)前vector中重新設(shè)置為存儲(chǔ)n個(gè)值為t的元素

?

void resize ( size_type sz, T c = T() );

改變長(zhǎng)度

把當(dāng)前 vector容器的的長(zhǎng)度大小重設(shè)為sz
如果sz小于當(dāng)前vector容器的size,則刪除多出來(lái)的元素,否則采用值為 T 來(lái)初始化新添加的元素

參數(shù)

sz

要設(shè)置當(dāng)前vector的size的值
Member type?size_type?is an unsigned integral type.

c

用初始化的新添加的元素的值。

可為空,為空則表示采用值初始化來(lái)初始化新添加的元素

?

resize函數(shù)有2個(gè)重載版本,一個(gè)只有一個(gè)size_type參數(shù),一個(gè)除了size_type參數(shù)外還有_Ty _val,即“可選”新元素值。

先說(shuō)第一個(gè)版本:

void resize(size_type _Newsize)
{ // determine new length, padding with _Ty() elements as needed
resize(_Newsize, _Ty());
}

可見(jiàn)它用_Ty()做第2個(gè)參數(shù),調(diào)用了它的第2個(gè)版本。第2個(gè)版本的定義如下:

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());
}

由定義可知,對(duì)于第一個(gè)版本:

若_Newsize小于oldsize,則剩余元素值不變。

若_Newsize大于oldsize,則新添加的元素值用元素的默認(rèn)構(gòu)造參數(shù)初始化(特別的,int型的將被初始化為0)。

對(duì)于第2個(gè)版本:

若_Newsize小于oldsize,則剩余元素值不變。(全部調(diào)用erase(begin() + _Newsize, end())擦除掉多余元素)

若_Newsize大于oldsize,則新添加的元素值用提供的第2個(gè)參數(shù)初始化。

不管用哪個(gè)版本,[0,min(_Newsize,oldsize))范圍內(nèi)的值均保持不變。

?

capcity和size


CAPCITY是此容器當(dāng)前可以容納的最大元素個(gè)數(shù),就是不用重新分配內(nèi)存是可以容納的個(gè)數(shù)?
SIZE是現(xiàn)在容器中已經(jīng)存在的元素個(gè)數(shù)
所以容量>=長(zhǎng)度

vector <int> a(10);?
a.push_back(1);?
此時(shí)a.size()=1,a.capacity()=10

?

reverse和resize


vector 的reverse只是增加了vector的capacity,但是size沒(méi)有改變!
resize同時(shí)改變了vector的capacity和size!

reserve是容器預(yù)留空間,但并不真正創(chuàng)建元素對(duì)象,在創(chuàng)建對(duì)象之前,不能引用容器內(nèi)的元素,因此當(dāng)加入新的元素時(shí),需要用push_back()/insert()函數(shù)。

resize是改變?nèi)萜鞯拇笮?#xff0c;并且創(chuàng)建對(duì)象,因此,調(diào)用這個(gè)函數(shù)之后,就可以引用容器內(nèi)的對(duì)象了,因此當(dāng)加入新的元素時(shí),用operator[]操作符,或者用迭代器來(lái)引用元素對(duì)象。

再者,兩個(gè)函數(shù)的形式是有區(qū)別的,reserve函數(shù)之后一個(gè)參數(shù),即需要預(yù)留的容器的空間;resize函數(shù)可以有兩個(gè)參數(shù),第一個(gè)參數(shù)是容器新的大小,第二個(gè)參數(shù)是要加入容器中的新元素,如果這個(gè)參數(shù)被省略,那么就調(diào)用元素對(duì)象的默認(rèn)構(gòu)造函數(shù)。

vector<int> myVec; myVec.reserve( 100 ); // 新元素還沒(méi)有構(gòu)造, // 此時(shí)不能用[]訪問(wèn)元素 for (int i = 0; i < 100; i++ ) { myVec.push_back( i ); //新元素這時(shí)才構(gòu)造 } myVec.resize( 102 ); // 用元素的默認(rèn)構(gòu)造函數(shù)構(gòu)造了兩個(gè)新的元素 myVec[100] = 1; //直接操作新元素 myVec[101] = 2;

為實(shí)現(xiàn)resize的語(yǔ)義,resize接口做了兩個(gè)保證:
一是保證區(qū)間[0, new_size)范圍內(nèi)數(shù)據(jù)有效,如果下標(biāo)index在此區(qū)間內(nèi),vector[indext]是合法的。
二是保證區(qū)間[0, new_size)范圍以外數(shù)據(jù)無(wú)效,如果下標(biāo)index在區(qū)間外,vector[indext]是非法的。


reserve只是保證vector的空間大小(capacity)最少達(dá)到它的參數(shù)所指定的大小n。在區(qū)間[0, n)范圍內(nèi),如果下標(biāo)是index,vector[index]這種訪問(wèn)有可能是合法的,也有可能是非法的,視具體情況而定。


resize和reserve接口的共同點(diǎn)是它們都保證了vector的空間大小(capacity)最少達(dá)到它的參數(shù)所指定的大小。

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)

總結(jié):
vector:對(duì)于vector賦值方式中,assign的速度是最快的,其次是resize以后用copy算法賦值,而最先能夠想到的賦值操作符,速度卻并不快,只能夠排名第三,目前還不知道這是為什么,采用插入迭代器再用copy的方式是速度最慢的一種。
list:對(duì)于list賦值,賦值操作符的速度是最快的,其次是assign,然后是采用resize的copy,最后一位同樣是采用插入迭代子方式的copy。


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

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。