《條目三十:確保目標區間足夠大》

《條目三十:確保目標區間足夠大》

在使用STL中的算法時,確保目標區間足夠,這個應該怎麼理解?算法

在我看來就是,容器,在初始化時使用reserve()強制設定容器的容量,和在目標容器比源容器size()元素個數更小時,在使用的時候,若是是直接對目標容器操做,會因爲目標容器與源容器大小不匹配的問題,從而報錯。code

例如:
int transmogrify(int x);
vector src;
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}
orm

vector<int> results;
transform(src.begin(), src.end(), results.end(), transmogrify);//報錯

報錯。。。由於results.end()是目標容器的最後,後面沒有元素了,因此訪問出錯。form

int transmogrify(int x);
vector<int> src;
for(int i = 0; i < 10; ++i)
{
    src.push_back(i);
}

vector<int> results;
results.reserve(10);
for(int i = 0; i < 3; ++i)
{
    src.push_back(i);
}

transform(src.begin(), src.end(), results.begin()+results.size()/2, transmogrify);//報錯

報錯。。。由於reserve()只是把容器的容量強制設置了,而不是容器的大小,容器的大小須要在真正插入、刪除元素後纔會改變。容器

對於第一個例子的正確方法是實用插入型的迭代器。
int transmogrify(int x);
vector src;
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}
transform

vector<int> results;
transform(src.begin(), src.end(), back_inserter(results), transmogrify);

對於第二個例子正確方法是實用插入型的迭代器。
int transmogrify(int x);
vector src;
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}
迭代器

vector<int> results;
results.reserve(10);
transform(src.begin(), src.end(), back_inserter(results, results.begin()+results.size()/2), transmogrify);

在使用算法的時候,必須使容器的區間大小足夠大。若是是想在沒有區間大小,只有容量的容器中使用算法,須要使用插入型迭代器,push_inserter,front_inserter。方法

由於即便用了reserve,但只是把容器的容量強行設置了,而沒有改變容器的大小,因此在使用算法時會發生沒有元素操做結果,運行錯誤。co

相關文章
相關標籤/搜索