if (isbn==0)
break;
if (n==size) // 數(shù)組是否到達(dá)上限?
reallocate(p, size);
p[n]=isbn; // 將元素插入擴(kuò)容的數(shù)組
}
delete [] p; // 不要忘了這一步!
}
注意上述這個(gè)向數(shù)組插入數(shù)據(jù)的過(guò)程是多么的繁瑣。每次反復(fù),循環(huán)都要檢查緩存是否達(dá)到上限。如果是,則程序調(diào)用用戶定義的函數(shù) reallocate(),該函數(shù)實(shí)現(xiàn)如下:
#include
int reallocate(int* &p, int& size)
{
size*=2; // double the array''s size with each reallocation
int * temp = new int[size];
std::copy(p, p+(size/2), temp);
delete [] p; // release original, smaller buffer
p=temp; // reassign p to the newly allocated buffer
}
reallocate() 使用 STL std::copy() 算法對(duì)緩存進(jìn)行合理的擴(kuò)充——每次擴(kuò)充都放大一倍。這種方法可以避免預(yù)先分配過(guò)多的內(nèi)存,從量上減少需要重新分配的內(nèi)存。這個(gè)技術(shù)需要得到充分的測(cè)試和調(diào)試,當(dāng)初學(xué)者實(shí)現(xiàn)時(shí)尤其如此。此外,reallocate() 并不通用,它只能處理整型數(shù)組的情形。對(duì)于其它數(shù)據(jù)類型,它無(wú)能為力,你必須定義該函數(shù)額外的版本或?qū)⑺0寤。幸運(yùn)的是,有一個(gè)更巧妙的辦法來(lái)實(shí)現(xiàn)。
創(chuàng)建和優(yōu)化 vector
每一個(gè) STL 容器都具備一個(gè)分配器(allocator),它是一個(gè)內(nèi)建的內(nèi)存管理器,能自動(dòng)按需要重新分配容器的存儲(chǔ)空間。因此,上面的程序可以得到大大簡(jiǎn)化,并擺脫 reallocator 函數(shù)。
第一步:創(chuàng)建 vector
用 vector 對(duì)象取代內(nèi)建的數(shù)組來(lái)保存獲取的數(shù)據(jù)。main() 中的循環(huán)讀取 ISBN,檢查它是否為 0,如果不為 0 ,則通過(guò)調(diào)用 push_back() 成員函數(shù)將值插入
vector: #include
#include
using namespace std;
int main()
{
vector
int isbn;
while(true)
{
cout << "enter an ISBN; press 0 to stop ";
cin >> isbn;
if (isbn==0)
break;
vi.push_back(isbn); // insert element into vector
}
}
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試成績(jī)查詢時(shí)間匯總
2011年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)筆記匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |