通过std :: vector迭代

时间:2013-03-27 10:47:28

标签: c++ stdvector

enter image description here

为什么要求我重载运算符=? 我之前已经遍历过std :: list而我没有遇到过这样的问题。

class Grup : public Shape {

private:

    std::vector<Shape*> continut;

public:

    static const std::string identifier;

    Grup();
    ~Grup();

    void add(Shape *shape);
    void remove(Shape *shape);
    void output(std::ostream &outs) const;
    void readFrom(std::istream &ins);
    void moveBy(int x, int y);

    friend std::ostream &operator<<(std::ostream &outs, const Grup &grup);
};


std::ostream &operator<<(std::ostream &outs, const Grup &grup)
{

 std::vector<Shape*>::iterator it;

    outs << "Grupul este format din: " << std::endl;

    for (it = continut.begin(); it != continut.end(); it++)
    {

    }    

    return outs;
}

错误:“没有可行的重载'='。”

2 个答案:

答案 0 :(得分:5)

(放大屏幕截图后)grup作为const传递,因此begin()将返回const_iterator,无法将其分配给{{1} }}

iterator的声明更改为:

it

注意在C ++ 11中,您可以使用std::vector<Shape*>::const_iterator it; 指示编译器推导出类型:

auto

C ++ 11中的其他替代方案是range-based for loop

for (auto it = grup.continut.begin(); it != grup.continut.end(); it++)
{
    outs << **s << std::endl;
}
带有std::for_each()

lambda

for (auto& shape: grub.continut)
{
    outs << *s << std::endl;
}

答案 1 :(得分:3)

更改:

std::vector<Shape *>::iterator it;

为:

std::vector<Shape *>::const_iterator it;
                      ^^^^^^

当您传递const Grup参考时。

或者如果您使用的是C ++ 11:

for (auto it = grup.continut.begin(); it != grup.continut.end(); ++it)
{
     ...
}