《條目三十:確保目標區間足夠大》
阿新 • • 發佈:2019-04-01
才會 需要 個數 大小 end 小時 src 一個 足夠
vector src;
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}
《條目三十:確保目標區間足夠大》
在使用STL中的算法時,確保目標區間足夠大,這個大應該怎麽理解?
在我看來就是,容器,在初始化時使用reserve()強制設定容器的容量,和在目標容器比源容器size()元素個數更小時,在使用的時候,如果是直接對目標容器操作,會由於目標容器與源容器大小不匹配的問題,從而報錯。
例如:
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()是目標容器的最後,後面沒有元素了,所以訪問出錯。
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);
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,但只是把容器的容量強行設置了,而沒有改變容器的大小,所以在使用算法時會發生沒有元素操作結果,運行錯誤。
《條目三十:確保目標區間足夠大》