きままにブログ

プログラミングを主とした私のメモ帳です。寂しいのでコメントください笑

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;
}