在使用STL中的算法時,確保目標區間足夠大,這個大應該怎麼理解?算法
在我看來就是,容器,在初始化時使用reserve()強制設定容器的容量,和在目標容器比源容器size()元素個數更小時,在使用的時候,若是是直接對目標容器操做,會因爲目標容器與源容器大小不匹配的問題,從而報錯。code
例如:
int transmogrify(int x);
vector
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}
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
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}
vector<int> results; transform(src.begin(), src.end(), back_inserter(results), transmogrify);
對於第二個例子正確方法是實用插入型的迭代器。
int transmogrify(int x);
vector
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