青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

什么是數(shù)組? 簡單來說數(shù)組代表一塊連續(xù)的內(nèi)存,內(nèi)部包含連續(xù)的一排相同的對象, 因為內(nèi)存分布連續(xù)且對象大小相同,所以我們可以高效的根據(jù)索引隨機訪問和賦值。

數(shù)組是我們平時用的最多的數(shù)據(jù)結(jié)構(gòu), 因為它很符合我們程序運行時的平坦內(nèi)存布局,使用起來簡單而高效。可以這樣說,只要恰當?shù)氖褂茫瑪?shù)組可以滿足我們工作中的大部分需要。

數(shù)組包括靜態(tài)數(shù)組和動態(tài)數(shù)組, C/C++語言內(nèi)置支持數(shù)組, 我們平時一般這樣用:
void test()
{
    
int ar[5= {12345};
    
int v = a[2];

    
int* pAr = new int[3];
    pAr[
1= v;
    delete []pAar;
}

其中ar是靜態(tài)數(shù)組,它分配在該線程的堆棧上, 而pAr是動態(tài)分配的,它內(nèi)存分配在堆上, 詳細內(nèi)存分配可以看我這篇《C++中new和delete的背后》

對于數(shù)組,我們要注意的是C++數(shù)組不支持多態(tài), 這里他們討論過這個問題《C++的數(shù)組不支持多態(tài)?》

上面我們討論的動態(tài)數(shù)組是C++語言內(nèi)置支持的, 但是因為內(nèi)置數(shù)組大小固定且容易越界, 另外還有上面的多態(tài)問題, C++標準庫為我們提供了另一種封裝vector, 我們可以這樣用:
void test()
{
    vector
<int> ar;
    ar.push_back(
1);
    ar.push_back(
2);
    
int d = ar[1];
    ar[
2= 10;
}

我們可以看到, vector使用起來非常方便, 一方面我們可以像內(nèi)置數(shù)組一樣使用, 另一方面我們不用再擔心容量問題, 因為它會在大小不夠時自動增加。

vector雖然簡單,但是實際上它有 不少陷井和技巧, 下面列舉一些常見問題:

1。小心迭代器失效
void test()
{
 vector
<int> ar;
 ar.push_back(
1);
 vector
<int>::iterator itr = ar.begin();
 
for(int i=0; i<100++i)
 {
  ar.push_back(i);
 }
 
 
int d = *itr;
}

你看出上面代碼的問題了嗎? 
不錯, 可能在我們push_back過程中, 內(nèi)存重新分配了, 導致我們原先記錄的迭代器itr已經(jīng)失效, 后面再重新訪問就出錯了。
這種bug有時很難定位,參見《一次痛苦的Coredump定位過程》
2。防止內(nèi)存多次分配
我們知道在push_back過程中, 當數(shù)組容量不夠時, 我們就會重新分配內(nèi)存, 然后將已有的元素進行拷貝, 效率很低。
所以最好的方法是用reserve()方法對需要的大小進行正確的估計,然后預留足夠的空間, 防止重新內(nèi)存分配。

3。釋放已分配空間
有些時候某個vector對象已經(jīng)分配了挺大空間,當用的差不多時, 我們需要釋放這些空間, 但是要保留該對象,要怎么做?
有人可能會說用成員函數(shù)clear(), 但那只能清除內(nèi)容卻不會釋放空間, 這里有個挺實用的swap技巧:
vector<int> vec;
void test()
{
    
for(int i=0; i<10000++i)
        vec.push_back(i);


    vector
<int> temp;
    vec.swap(temp);
}

4。刪除某些符合條件的元素
void test()
{
 vector
<int> ar;
 
for(int i=0; i<100++i)
 {
  ar.push_back(i);
 }

vector
<int>::iterator itr = ar.begin();
 
for(;itr != ar.end();)
 {
  
if(*itr > 10)
  {
   itr 
= ar.erase(itr);
  }
  
else
  {
   
++itr;
  }
 }
}

上面的代碼刪除數(shù)組中大于10的所有item, 實際上我們可以下面更簡單的方法替代:
ar.erase(remove_if(ar.begin(), ar.end(), bind2nd(greater<int>(), 10)), ar.end());

從上面的一些技巧,我們可以看到, 只有真正理解了vector的內(nèi)部實現(xiàn)原理, 我們才能規(guī)避一些使用陷井, 更簡單而高效的開發(fā)程序。

上面我們討論的vector主要針對的模擬C++內(nèi)置的動態(tài)數(shù)組部分, 而對于靜態(tài)數(shù)組部分,我們是不是也有相應的類? 
是的,C++11里新增的array就是做這個事的, 我們可以這樣用:
void test()
{
 std::array
<int10> ar = {1234}; 
 ar[
5= 33;
}

其中array<int, 10>在內(nèi)部存儲實際上是int data[10];

最后, 簡單總結(jié)下,我們從C++的內(nèi)置數(shù)組講到標準庫提供的vector, 最后談到C++11新增的array, 數(shù)組這個最基本的數(shù)據(jù)結(jié)構(gòu)在C++中終于有了完整的支持。
posted on 2014-05-12 22:05 Richard Wei 閱讀(2647) 評論(1)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法

FeedBack:
# re: 理解數(shù)組
2014-05-19 16:33 | 歲月漫步
henhao  回復  更多評論
  

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美精品日韩| 国产视频丨精品|在线观看| 欧美一区影院| 久久aⅴ国产紧身牛仔裤| 久久久久久精| 久久综合精品一区| 欧美激情性爽国产精品17p| 91久久精品www人人做人人爽| 欧美不卡高清| 一本大道久久a久久精品综合| 一区二区免费在线视频| 欧美一区二区精品久久911| 久久久夜精品| 久久久.com| 欧美激情女人20p| 日韩视频免费看| 午夜精品久久久久久久白皮肤| 久久国产黑丝| 欧美理论大片| 麻豆国产精品va在线观看不卡| 国产一区二区精品丝袜| 麻豆成人综合网| 免费观看国产成人| 一区二区黄色| 亚洲综合成人在线| 国产原创一区二区| 欧美肥婆bbw| 欧美日韩高清在线| 校园春色国产精品| 美女成人午夜| 欧美精品免费在线观看| 亚洲精品婷婷| 亚洲一区二区四区| 午夜精品理论片| 亚洲第一黄网| 久久九九热免费视频| 国产精品大全| 一区二区免费在线视频| 老色批av在线精品| 亚洲第一天堂无码专区| 久久久久久伊人| 一区二区三区视频免费在线观看| 亚洲一区二区三区免费视频| 在线播放豆国产99亚洲| 亚洲精品欧洲| 韩国欧美一区| 一区二区三区久久网| 黄网站免费久久| 一区二区三区成人精品| 韩国三级在线一区| 夜夜嗨网站十八久久| 樱桃成人精品视频在线播放| 日韩亚洲欧美一区二区三区| 伊人成年综合电影网| 亚洲视频在线免费观看| 亚洲黄色成人网| 校园春色国产精品| 亚洲一区二区三区四区五区黄 | 亚洲丰满在线| 国产亚洲欧美一区在线观看| 亚洲欧洲精品一区二区三区不卡| 国产欧美激情| 99国产精品久久| 亚洲激情在线观看视频免费| 亚洲综合精品| 亚洲午夜91| 欧美国产极速在线| 老司机精品福利视频| 国产日韩av在线播放| 99这里有精品| 9i看片成人免费高清| 中文亚洲字幕| 久久久久久久综合色一本| 欧美日韩一区二区高清| 亚洲一区二区三区在线| 亚洲午夜一区二区三区| 国产中文一区| 亚洲精品国产精品国自产在线 | 国内精品亚洲| 香蕉亚洲视频| 欧美一区激情视频在线观看| 欧美日韩在线播放三区四区| 亚洲人成亚洲人成在线观看图片 | 亚洲欧美日韩人成在线播放| 欧美韩日精品| 91久久黄色| 99这里有精品| 欧美欧美天天天天操| 亚洲国产精品国自产拍av秋霞| 在线观看视频免费一区二区三区| 永久免费精品影视网站| 亚洲精品国产日韩| 国产综合在线看| 亚洲日韩中文字幕在线播放| 国产精品亚洲欧美| 亚洲国产精品美女| 国产亚洲精品资源在线26u| 欧美黄色免费| 国产视频在线一区二区| 亚洲另类在线一区| 亚洲风情亚aⅴ在线发布| 一区二区三区日韩欧美精品| 1024国产精品| 欧美一站二站| 欧美一级理论性理论a| 欧美激情视频网站| 麻豆乱码国产一区二区三区| 欧美天天综合网| 亚洲激情偷拍| 伊人久久噜噜噜躁狠狠躁 | 亚洲国产岛国毛片在线| 亚洲另类在线一区| 欧美性做爰猛烈叫床潮| 午夜精品久久久久久久99樱桃| 久久综合九色综合欧美狠狠| 亚洲欧洲日夜超级视频| 欧美日韩精品一区二区天天拍小说| 亚洲最新视频在线| 久久精品国产免费看久久精品| 亚洲高清不卡在线观看| 国产精品一区二区在线| 亚洲国产高清aⅴ视频| 亚洲网站在线观看| 欧美激情精品久久久久久黑人| 亚洲欧美中文字幕| 亚洲欧美一区二区在线观看| 美日韩精品视频免费看| 久久爱另类一区二区小说| 欧美日韩一区二区三区在线观看免| 久久综合五月| 伊甸园精品99久久久久久| 美女精品在线| 亚洲区一区二| 国产日韩欧美二区| 欧美日韩成人免费| 久久国产精品一区二区三区| 亚洲级视频在线观看免费1级| 午夜精品视频| 亚洲精选91| 精品动漫3d一区二区三区免费| 欧美日韩国产另类不卡| 久久久精品tv| 午夜精品久久久久久久蜜桃app| 亚洲国产精品一区二区第一页| 欧美专区日韩视频| 亚洲一级高清| 亚洲日本成人网| 国内精品久久久久久影视8| 欧美日韩中文字幕精品| 麻豆国产精品va在线观看不卡| 亚洲欧美影音先锋| 99一区二区| 亚洲精品国产精品国自产观看浪潮| 久久青青草综合| 久久精品国产视频| 亚洲在线网站| 一本到12不卡视频在线dvd| 亚洲承认在线| 在线看成人片| 精品不卡一区| 狠狠色狠狠色综合人人| 国产欧美日韩亚洲精品| 国产精品成人va在线观看| 欧美激情精品久久久六区热门| 久久婷婷蜜乳一本欲蜜臀| 欧美一区二区高清| 亚洲欧美日韩视频一区| 亚洲综合精品一区二区| 亚洲性感激情| 亚洲综合欧美| 午夜日韩福利| 欧美一区二区三区在线视频| 亚洲综合三区| 国精品一区二区| 欧美日韩另类综合| 久久久免费精品| 亚洲自拍啪啪| 99精品视频免费观看视频| 亚洲国产综合视频在线观看| 欧美精品免费观看二区| 亚洲欧美精品伊人久久| 亚洲高清不卡av| 欧美在线视频a| 亚洲视频专区在线| 欧美电影打屁股sp| 欧美理论电影在线播放| 欧美日韩精品免费在线观看视频| 欧美日韩国产一区精品一区 | 亚洲一区成人| 欧美在线观看视频在线| 欧美一级视频| 久久天天躁狠狠躁夜夜爽蜜月| 久久综合电影| 亚洲高清资源| 一区二区毛片| 欧美中文字幕在线观看| 猛男gaygay欧美视频| 欧美日韩1区| 欧美 日韩 国产 一区| 欧美一区二区三区视频免费播放|