備忘録

プログラムやゲーム関連に関すること

【C++】標準コンテナでの範囲処理

コンテナが持つ値をイテレータを使用してループ処理ではなく
コンテナが持つメンバ関数の範囲処理で効率的に走査する

test.cpp

#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

int main(int argc, char *argv[])
{
	auto show = [](const vector<int> &v)
	{
		copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
		cout << endl;
	};

	vector<int> v1{ 0, 1, 2, 3, 4 };
	vector<int> v2{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	vector<int> v3{ 0, 1, 2, 3, 4 };

	// コンテナの要素を置き換える(入れ替えるではない!)
	v1.assign(v2.begin() + v2.size() / 2, v2.end());

	show(v1); // 5 6 7 8 9
	show(v2); // 0 1 2 3 4 5 6 7 8 9

	// コンテナの要素を追加する
	v1.insert(v1.end(), v3.begin(), v3.end());

	// NGコード
	// copy(v3.begin(), v3.end(), back_inserter(v1));

	// for ループを使ったものより冗長ではないが copy 内部でループ処理しているので効率は上がらない
	// 挿入反復子によりコピー先範囲を指定するほとんどの場合、範囲メンバ関数の呼び出しに置き換えるべきである。

	show(v1); // 5 6 7 8 9 0 1 2 3 4

	getchar();

	return 0;
}

参考:Effective STL