range-based for
gcc 4.6.1をビルドしたので動作確認。
#include <iostream> #include <list> #include <memory> struct Task{ int id; Task(int id) : id(id){ std::cout << "Create Task : " << id << std::endl; } ~Task(){ std::cout << "Delete Task : " << id << std::endl; } void update(){ std::cout << "move Task : " << id << std::endl; } }; int main(){ std::list<std::unique_ptr<Task>> task_list; task_list.emplace_back(new Task(1)); task_list.emplace_back(new Task(2)); task_list.emplace_back(new Task(3)); task_list.emplace_back(new Task(4)); task_list.emplace_back(new Task(5)); task_list.emplace_back(new Task(6)); for(auto it = task_list.begin(); it != task_list.end();){ if( (*it)->id%2 == 0 ){ it = task_list.erase(it); continue; } it++; } // range-based for。 // イテレータではなく中身がそのままitに代入して使われる(ぽい) // auto& でほぼ全て大丈夫なんじゃないか疑惑。これはいいものだ。 for(auto& it : task_list ){ it->update(); } }
実行結果:
Create Task : 1 Create Task : 2 Create Task : 3 Create Task : 4 Create Task : 5 Create Task : 6 Delete Task : 2 Delete Task : 4 Delete Task : 6 move Task : 1 move Task : 3 move Task : 5 Delete Task : 1 Delete Task : 3 Delete Task : 5
やっと……やっとC++にforeachがッ……!