標準庫 插入迭代器 詳解 插入迭代器作用:copy等函數不能改變容器的大小,所以有時copy先容器是個空的容器,如果不使用插入迭代器,是無法使用copy等函數的。 例如下麵的代碼就是錯誤的: lst2是個空的容器,copy函數不能擴容容器lst2,所以會發生運行時錯誤。 用插入迭代器就可以很好的解決 ...
標準庫 插入迭代器 詳解
插入迭代器作用:copy等函數不能改變容器的大小,所以有時copy先容器是個空的容器,如果不使用插入迭代器,是無法使用copy等函數的。
例如下麵的代碼就是錯誤的:
list<int> lst{1,2,3,4};
list<int> lst2,lst3;
copy(lst.cbegin(), lst.cend(), lst2.begin());
lst2是個空的容器,copy函數不能擴容容器lst2,所以會發生運行時錯誤。
用插入迭代器就可以很好的解決上面的問題
list<int> lst{1,2,3,4};
list<int> lst2,lst3;
copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));
三種插入迭代器
迭代器 | 功能描述 |
---|---|
back_inserter | 創建一個使用push_back的迭代器 |
front_inserter | 創建一個使用push_front的迭代器 |
inserter | 創建一個使用insert的迭代器,元素插入到指定位置之前 |
inserter的特殊之處:
//假設it是有inserter生成的迭代器
*it = val;//其效果同下麵二行代碼一樣
it = c.insert(it, val);//it指向新加入的元素
++it;//遞增it,使它指向原來的元素
例子:
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
int main(){
//copy函數不會改變容器的大小,但是使用了插入迭代器後,
//就會改變容器的大小了
/*
list<int> lst{1,2,3,4};
list<int> lst2,lst3;
//運行錯誤,因為lst2是空list,copy函數不會增加容器的大小
//copy(lst.cbegin(), lst.cend(), lst2.begin());
//結果:4,3,2,1
copy(lst.cbegin(), lst.cend(), front_inserter(lst2));
//結果:1,2,3,4
copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));
for(auto const &s : lst2){
cout << s << " ";
}
cout << endl;
for(auto const &s : lst3){
cout << s << " ";
}
cout << endl;
*/
//unique_copy 拷貝不重覆的元素到新的容器
vector<int> ivec{1,2,1,2,3,4,3,3,3,2,2,1,1,1};
list<int> lst;
sort(ivec.begin(),ivec.end());
unique_copy(ivec.cbegin(), ivec.cend(),back_inserter(lst));
for(auto const &s : lst){
cout << s << " ";
}
cout << endl;
}