如何从重写的运算符迭代向量数据成员<<

时间:2012-03-29 03:36:26

标签: c++ vector iterator

这是我的测试计划。变量s1包含一个包含用户定义类型对象的向量。我想重载<<运算符很好地打印这个向量,每行一个元素。

#include <iostream>
#include "myclasses.h"
using namespace std;

int main() {

    myclass s1;

    s1.add_point(7000, 10);
    s1.add_point(8000, 11);
    s1.add_point(9000, 12);

    cout << s1 << endl;

    return 0;

}

这是类定义。基本上它只是另一个用户定义对象的数组。我想要&lt;&lt;操作员打印所有条目,每行一个。假设“anotherclass”具有所需的支持方法。

class myclass {
    vector<anotherclass> ps;
public:
    void add_point(double, double);
    friend ostream &operator<<( ostream &out, const myclass &s );
};

void myclass::add_point(double first, double second) {
    ps.push_back(anotherclass(first, second));
}

ostream &operator<<( ostream &out, const myclass &s ) {
    vector<anotherclass>::iterator itr;
    vector<anotherclass> psp=s.ps; // Why do I need this? Why can't I use s.ps.begin() and s.ps.end() in the for loop directly?
    for ( itr=psp.begin() ; itr != psp.end() ; ++itr ) {
        cout << "(" << itr->get_first() << "," << itr->get_second() << endl;
    }
    return out;
}

我已经评论了一条我需要添加的行,以便在我的程序中使用它。我不知道为什么需要那条线。有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:4)

iterator成员类型始终允许您修改引用的对象。因此,您无法从iterator参数中获取const &,例如s。您需要声明局部变量具有类型vector< anotherclass >::const_iterator。每个容器类都有const_iteratoriterator并行。

您的单行修复工作的原因是新构造的vector不是const,与它构造的函数参数不同。

在C ++ 11中,您可以使用auto itr = s.ps.begin()而不是命名迭代器类型。或者只使用for ( auto const &obj : s.ps )并完全放弃迭代器。

答案 1 :(得分:1)

我的猜测是因为你将s声明为const,所以不允许访问它的迭代器。 当你使用vector psp = s.ps时,你的程序基本上将s.ps复制到一个可修改的新向量psp。