Как перебрать элемент вектора данных из переопределенного оператора < - PullRequest
0 голосов
/ 29 марта 2012

Это моя тестовая программа. Переменная s1 содержит вектор, который содержит объекты определенного пользователем типа. Я хочу перегрузить оператор <<, чтобы красиво печатать этот вектор, по одному элементу в строке. </p>

#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;

}

Вот определение класса. По сути, это просто массив других пользовательских объектов. Я хочу, чтобы оператор << печатал все записи, по одной на строку. Предположим, что «anotherclass» имеет необходимые методы поддержки. </p>

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 ]

4 голосов
/ 29 марта 2012

Тип элемента iterator всегда позволяет изменять объект, на который есть ссылка.Поэтому вы не можете получить iterator из аргумента const &, такого как s.Вам необходимо объявить локальную переменную типа vector< anotherclass >::const_iterator.Каждый контейнерный класс имеет const_iterator параллельно с iterator.

. Причина, по которой ваше однострочное исправление работает, состоит в том, что вновь созданный vector не является const, в отличие от параметра функциипостроен из.

В C ++ 11 вы можете просто использовать auto itr = s.ps.begin() и никогда не называть тип итератора.Или просто используйте for ( auto const &obj : s.ps ) и полностью воздержитесь от итераторов.

1 голос
/ 29 марта 2012

Я предполагаю, что вы объявляете s как const, поэтому доступ к его итератору запрещен. Когда вы используете вектор psp = s.ps, ваша программа по существу копирует s.ps в новый вектор psp, который можно изменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...