reverseの実装例
2つのイテレータを与えて、その間の要素を全て逆順に並び替えるreverse関数は、
template <class T> void reverse(T begin, T end) { for(; begin != end && begin != --end; begin++) { iter_swap(begin, end); } }
のように実装できます。iter_swapは2つのイテレータを与えて、イテレータの指すオブジェクトを入れ替えます。
template <class T> void my_iter_swap(T before, T after) { swap(*before, *after); }
イテレータの指すオブジェクトを直接swapに与えて、それらを交換します。swapは次のように実装できます。
template <class T> void swap(T& before, T& after) { T temp(move(before)); before = move(after); after = move(temp); }
tempにはムーブできる場合、ムーブして渡します。ムーブが関係ない場合は無視され、コピーが行われます。その後、beforeにafterをムーブし、afterにtempをムーブします。
unique_ptrのreverse
このようなreverseのおかげで、unique_ptrを格納したvector等のコンテナをreverseできます。
struct C { void create(int x) { vec.push_back(make_unique<R>(x)); } void reverse() { std::reverse(vec.begin(), vec.end()); } vector<unique_ptr<R>> vec; };
例えば次のように用いられます。
int main() { C* c = new C(); c->create(1); c->create(2); c->create(3); c->create(4); c->reverse(); delete c; // vectorはもちろん、そのunique_ptr<R>も開放される cin.get(); return 0; }