Понимание const_iterator с указателями? - PullRequest
5 голосов
/ 05 ноября 2011

Я пытаюсь понять, что означает const_iterator.У меня есть следующий пример кода:

void CustomerService::RefreshCustomers()
{
    for(std::vector<Customer*>::const_iterator it = customers_.begin();
        it != customers_.end() ; it ++)
    {
        (*it)->Refresh();
    }
}

Refresh() - это метод в классе Customer, и он не определен как const.Сначала я подумал, что const_iterator должен был запретить изменение элементов контейнера.Однако этот код компилируется без жалоб.Это потому, что происходит дополнительный уровень косвенности?Что именно делает / означает const_iterator?

ОБНОВЛЕНИЕ

И в такой ситуации лучше всего использовать const_iterator?

Ответы [ 3 ]

10 голосов
/ 05 ноября 2011

A const_iterator свыше vector<Customer*> даст вам Customer * const, а не Customer const*.Таким образом, вы не можете изменить итеративное значение (указатель), но вы можете изменить объект, на который он указывает.По сути, в вашем случае все говорит о том, что вы не можете сделать это:

*it = ..something..;
4 голосов
/ 05 ноября 2011

Вы не изменяете содержимое контейнера.Содержимое контейнера просто указатели.Однако вы можете свободно изменять все, на что указывают указатели.

Если вы не хотите иметь возможность изменять то, на что указывают указатели, вам понадобится vector<const Customer*>.

2 голосов
/ 05 ноября 2011

const_iterator равен не о том, можете ли вы изменить контейнер или нет, а о том, можете ли вы изменять объекты в контейнере или нет.В вашем случае контейнер содержит указатели, и вы не можете изменять сами указатели (больше, чем вы могли бы изменять целые числа ...). Вы все равно можете сделать вызов неконстантного Refresh () за указателем из коллекции, потому что этот вызов делаетне изменяйте указатель сам по себе .

Разница между const_iterator и итератором важна [только], когда ваш контейнер содержит, например, экземпляры классов, не указатели на них, а сами экземпляры, например, вКонтейнер

list < pair < int , int > >

Если 'it' является const_iterator в этом списке, вы не можете сделать

it->first = 5

, но если это итератор (не const_iterator), это работает.

...