std::listとstd::vectorの相互変換

例えばJavaだと、java.util.ArrayListjava.util.Vectorはどちらもjava.util.Listインタフェースを持っているので、そもそも相互に変換する必要は無いのだが、C++の場合だとどうもそうじゃないようなので。

C++の場合、listとvectorのコンストラクタにイテレータを渡せるのでそれで対応。template使えばクラスとかメソッドの呼び出し部分で抽象化は出来そうな気もするけど、なんかあまりスマートでは無い気がする。

サンプルコード

#include <iostream>
#include <list>
#include <vector>

using namespace std;

int main() {
	{
		vector<string> v;
		v.push_back("hoge");
		v.push_back("foo");
		v.push_back("bar");
		for (vector<string>::iterator it=v.begin();  it !=v.end(); it++) {
			cout << "v:" << *it << endl;
		}

		list<string> l(v.begin(), v.end());
		for (list<string>::iterator it=l.begin();  it !=l.end(); it++) {
			cout << "l:" << *it << endl;
		}
	}
	cout << "----" << endl;
	{
		list<string> l;
		l.push_back("hoge");
		l.push_back("foo");
		l.push_back("bar");
		for (list<string>::iterator it=l.begin();  it !=l.end(); it++) {
			cout << "l:" << *it << endl;
		}

		vector<string> v(l.begin(), l.end());
		for (vector<string>::iterator it=v.begin();  it !=v.end(); it++) {
			cout << "v:" << *it << endl;
		}
	}
	return 0;
}

実行結果

v:hoge
v:foo
v:bar
l:hoge
l:foo
l:bar
----
l:hoge
l:foo
l:bar
v:hoge
v:foo
v:bar