1. 程式人生 > >《條目三十:確保目標區間足夠大》

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

才會 需要 個數 大小 end 小時 src 一個 足夠

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

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

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

例如:
int transmogrify(int x);
vector src;
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 src;
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 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,但只是把容器的容量強行設置了,而沒有改變容器的大小,所以在使用算法時會發生沒有元素操作結果,運行錯誤。

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