迭代器用于自定义对象的容器

时间:2011-01-26 04:58:42

标签: c++ stl iterator

如果我已经构建了一个我想要包含在其中的类,例如一个集合,我将如何遍历所述集合?我可以说

 std::set<customObject>::iterator it

我以为我可以这样做,但我收到以下一系列错误......

drawing.h:110: error: no match for ‘operator=’ in ‘it = ((object*)this)->object::objects. std::vector<_Tp, _Alloc>::begin [with _Tp = object, _Alloc = std::allocator<object>]()’
/usr/include/c++/4.2.1/bits/stl_tree.h:225: note: candidates are: std::_Rb_tree_const_iterator<object>& std::_Rb_tree_const_iterator<object>::operator=(const std::_Rb_tree_const_iterator<object>&)
drawing.h:110: error: no match for ‘operator!=’ in ‘it != ((object*)this)->object::objects. std::vector<_Tp, _Alloc>::end [with _Tp = object, _Alloc = std::allocator<object>]()’
/usr/include/c++/4.2.1/bits/stl_tree.h:292: note: candidates are: bool std::_Rb_tree_const_iterator<_Tp>::operator!=(const std::_Rb_tree_const_iterator<_Tp>&) const [with _Tp = object]
drawing.h:111: error: ‘struct std::_Rb_tree_const_iterator<object>’ has no member named ‘sketch’

这是我的代码:

void draw_in_place()
        {
            place();
            std::set<object>::const_iterator it;
            for(it = objects.begin(); it != objects.end(); it++){
                *it.draw_in_place();
            }
        }

2 个答案:

答案 0 :(得分:4)

((object*)this)->object::objects. std::vector<_Tp, _Alloc>::begin

objects显然是std::vector<object>,而不是std::set<object>。因此,您需要使用std::vector<object>::const_iterator

*it.draw_in_place();

这是不正确的:你需要取消引用迭代器来首先访问元素,然后使用元素:

(*it).draw_in_place();
// or
it->draw_in_place();

答案 1 :(得分:2)

我认为(至少)你的一个问题是这一行:

*it.draw_in_place();

编译器将其解释为

*(it.draw_in_place());

与您的预期

(*it).draw_in_place();

要解决此问题,请考虑使用箭头操作符,如

it->draw_in_place();

将自定义对象存储在STL集中是完全合法的,只要它们可以默认与<运算符进行比较。如果他们不能,则您需要在其上定义operator <,或者为set提供自定义比较器,或为您的特定类型提供std::less