vtkのコンテナであるが妙に使いにくい。
イテレータをつくるとfor_eachなどで回すことができるようになる。
一度作ればvtkCollection独特の回し方に悩まなくてよい。
他にはoperator[]やsize()もつくっておけば、よりその後の効率はよくなるだろう。
vtkActorCollection* pActorCollection = pvtkRenderer->GetActors(); pActorCollection->InitTraversal(); //The data pointer is set at the beginning of the list. while( ( vtkActor* pActor = pActorCollection ) != nullptr ) { //Some }
イテレータをつくるとfor_eachなどで回すことができるようになる。
class SomeClass { public; class Iterator : std::iterator< std::forward_iterator_tag, vtkProp*> { public: Iterator() : mpCollection(nullptr), mpProp(nullptr) {}; explicit Iterator( vtkProp3DCollection* pPropCollection ) : mpCollection( pPropCollection ) { mpProp = mpCollection->GetNextProp(); } Iterator(const Iterator& other) : mpCollection(other.mpCollection), mpProp(other.mpProp) {}; Iterator& operator++() { Increment(); return *this; }; Iterator& operator++(int) { Iterator old(*this); Increment(); return old; }; bool operator==(const Iterator& other) { return Equal( other ); }; bool operator!=(const Iterator& other) { return !Equal( other ); }; vtkProp* operator->() { return mpProp;}; vtkProp* operator*() { return mpProp;}; protected: void Increment() { mpProp = mpCollection->GetNextProp(); }; bool Equal( const Iterator& other ) { return mpProp == other.mpProp ? true : false; }; vtkProp3DCollection* mpCollection; vtkProp3D* mpProp; }; Iterator begin() { return Iterator(this); }; Iterator end() { return Iterator(); }; protected: vtkSmartPointer<vtkProp3DCollection> mpProps; }; //Sample std::for_each( someClass.begin(), someClass.end(), [](vtkProp3D* prop) { double* pos = prop->GetPosition(); std::for_each( pos, pos+3, []( double p ) { std::cout << std::setw(15) << p; } ); std::cout << std::endl; } );
一度作ればvtkCollection独特の回し方に悩まなくてよい。
他にはoperator[]やsize()もつくっておけば、よりその後の効率はよくなるだろう。
コメントをかく