general inserter允许用户在指定位置插入。
实现代码如下:
1 #ifndef ITERATOR_H 2 #define ITERATOR_H 3 #include <iterator> 4 5 //BackInsertIterator 6 template <typename Container> 7 class InsertIterator 8 { 9 public: 10 typedef typename Container::value_type value_type; 11 typedef typename Container::iterator iterator; 12 13 explicit InsertIterator(Container &cont, iterator iter) 14 :_cont(cont), _iter(iter) 15 { } 16 17 InsertIterator<Container> &operator= (const value_type &val) 18 { 19 _cont.insert(_iter, val); 20 ++ _iter; 21 return *this; 22 } 23 24 InsertIterator<Container> &operator*() 25 { return *this; } 26 27 InsertIterator<Container> &operator++() 28 { return *this; } 29 30 InsertIterator<Container> &operator++(int) 31 { return *this; } 32 private: 33 Container &_cont; 34 iterator _iter; 35 }; 36 37 template <typename Container> 38 InsertIterator<Container> inserter(Container &c) 39 { return InsertIterator<Container>(c); } 40 41 42 43 #endif
可以看出,赋值操作使得内部存储的迭代器前移,而++操作同样什么都没有做。
注意: 不在赋值操作符中改变迭代器,而到++操作中改变————这种做法是不行的。
执行insert操作时,有个特殊位置为end(),它指向最后一个元素的下一个位置,也就是第一个非法的位置。这也是唯一一个合法的非法位置。
按照上面源码的实现,仅仅在赋值时迭代器前移,iter++无实质操作,而赋值时前移,iter实际指向了新的end()位置,就保证了无论用户怎么执行++操作,都丝毫不会影响iter的有效性。
测试代码如下:
1 #include "inser.hpp" 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 using namespace std; 6 7 template <typename T> 8 void printElems(const T &t, const string &s = "") 9 { 10 cout << s << " "; 11 for(typename T::const_iterator it = t.begin(); 12 it != t.end(); 13 ++it) 14 { 15 cout << *it << " "; 16 } 17 cout << endl; 18 } 19 20 int main(int argc, char const *argv[]) 21 { 22 vector<int> coll; 23 coll.push_back(12); 24 coll.push_back(34); 25 coll.push_back(32); 26 printElems(coll); 27 28 29 inserter(coll, coll.begin()) = 99; 30 inserter(coll, coll.begin()) = 88; 31 32 printElems(coll); 33 34 inserter(coll, coll.end()) = 34; 35 inserter(coll, coll.end()) = 21; 36 37 printElems(coll); 38 39 return 0; 40 }
测试结果为:
12 34 32 88 99 12 34 32 88 99 12 34 32 34 21
时间: 2024-11-06 15:58:08