標籤:stl 成員函數 區間 單元素 效率
例子:使v1的內容和v2的後半部分相同的最簡單操作是什嗎?看下面四個答案:
①v1.assign(v2.begin()+v2.size()/2,v2.end());
②v1.clear();
copy(v2.begin()+v2.size()/2,v2.end(),back_inserter(v1));
③v1.insert(v1.end(),v2.begin()+v2.size()/2,v2.end());
④vector<int>v1,v2;
…
v1.clear();
for(vector<int>::const_iterator ci = v2.begin()+v2.size()/2;ci !=v2.end();++ci)
v1.push_back(*ci);
⑤vector<int>::iteratorinsertLoc(v.begin());
for(int i = 0;i < numValues;++i )
{
insertLoc= v.insert(insertLoc,data[i]);
++insertLoc;
}
太多的STL程式員濫用了copy,通過利用插入迭代器的方式來限定目標區間的copy調用,幾乎都應該被替換為對區間成員函數的調用。因為當copy模板被執行個體化之後,基於copy的代碼和使用顯示迴圈的代碼幾乎是相同的。
第⑤種方式每次調用insert把新元素插入到v中時,插入點後的每個元素都要向後移動一個位置,以便為新元素騰出空間。與此不同的是,C++標準要求區間insert函數把現有容器中的元素直接移動到他們最終的位置上,即只需付出每個元素移動一次的代價。
優先選擇區間成員函數而不是其對應的單元素成員函數由三條充分的理由:
區間成員函數寫起來更容易
更能清楚地表達我們的意圖
它們表現出了更高的效率
支援區間的成員函數有:
區間建立:所有的標準容器都提供了如下形式的建構函式:
container::container(InputIterator begin,InputIterator end);
區間插入:所有的標準序列容器都提供了如下形式的insert:
void container::insert(iterator position,InputIterator begin,InputIteratorend);
關聯容器利用比較函數來決定元素該插入何處,它們提供了一個省去position參數的函數原型:
void container::insert(InputIterator begin,InputIterator end);
區間刪除:所有的標準容器都提供了區間形式的刪除操作,但對於序列和關聯容器,其返回值有所不同。序列容器提供了這樣的形式:
iterator container::erase(iterator begin,iterator end);
關聯容器則提供了如下形式:
void container::erase(iterator begin,iterator end);
區間賦值:所有的標準容器都提供了區間形式的assign:
void container::assign(InputIterator begin,InputIterator end);