vector容器是類似與一個線性數組,索引效率高,插入,刪除的效率很低,需要遍歷數據列表,一般情況下vector的刪除操作由一下函數完成:
iterator erase(iterator position) //刪除一個位置
iterator erase(iterator first, iterator last) //刪除迭代器起始位置到最終位置
void resize(size_type new_size, const T& x) // 修改容器大小
看看STL的源碼文件中這幾個函數中的操作:
// 將迭代器 position 所指之元素移除 iterator erase(iterator position) { if (position + 1 != end()) // 如果 p 不是指向最後一個元素 // 將 p 之後的元素一一向前遞移 copy(position + 1, finish, position); --finish; // 調整水位 destroy(finish); // 全域函式,建構/解構基本工具。 return position; } iterator erase(iterator first, iterator last) { iterator i = copy(last, finish, first); destroy(i, finish); // 全域函式,建構/解構基本工具。 finish = finish - (last - first); return first; } void resize(size_type new_size, const T& x) { if (new_size < size()) erase(begin() + new_size, end()); else insert(end(), new_size - size(), x); } void resize(size_type new_size) { resize(new_size, T()); } // 清除全部元素。注意,並未釋放空間,以備可能未來還會新加入元素。 void clear() { erase(begin(), end()); }
很明顯:已知需要刪除的位置的時候,erase()函數刪除當期位置,然后將后面的數據前移,這也是為什么vector插入刪除操作速度慢的原因。resize()函數根據參數重新容器的大小,如果設定的尺寸小於原先的則將多余的數據直接erase。
今天意外中開發一種比較巧的避免刪除時候位移的方法:把需要刪除的元素和最后一個元素交換位置,然后通過resize() 來刪除數據,不過這種辦法沒法保證列表中數據的順序。
1循環刪除操作
vector<int>::iterator it = ilist.begin();
while(it != ilist.end())
{
it = ilist.erase(it); //刪除當前位置的元素,后面的元素前移
if(it != ilist.end())
++it;
}
2提高刪除的效率
it = ilist.begin();
while(!ilist.empty())
{
*it = *(ilist.end()-1); //先移動位置,然后刪除
ilist.resize(ilist.size()-1);
}
細雨淅淅 標簽:
c++