Чому я отримую повідомлення про помилку компіляції, коли в моїй програмі є наступний код, пробував через ітератор - програма не працює, тому змушений був написате щось таке:
_Nodeptr, _Myhead, _Myval (і інші, що починаються з підкруслення) всі оголошені як protected члени класу list, тому в тому контексті в якому ви їх використовуєте вони недоступні.
Подивившись ваш код, я побачив відразу над вище приведеним куском коду закоментованою ту саму логіку реалізовану через ітератори. Вона чудово компілюється, чому ви не використали її?
Ostap написав:
_Nodeptr, _Myhead, _Myval (і інші, що починаються з підкруслення) всі оголошені як protected члени класу list, тому в тому контексті в якому ви їх використовуєте вони недоступні.
Подивившись ваш код, я побачив відразу над вище приведеним куском коду закоментованою ту саму логіку реалізовану через ітератори. Вона чудово компілюється, чому ви не використали її?
Тому, що в цьому коді відбувається модифікація елементів списку: можливе видалення, або додавання.
Я пробував через ітератори => вилітає memory access violation.
Якщо знаєте спосіб перегляду всієї колекції за допомогою ітераторів з можливістю їх модифікації підкажіть, буду вдячний.
Перш за все, я думаю, що варто змінити алгоритм програми так, щоб не потрібно було додавати/видаляти елементи з контейнера в той час як ви проходите по ньому ітератором.
Який би ви не взяли контейнер, видалення елемента як мінімум робить ітератор який вказував на цей елемент некоректним, тобто будь який доступ до цього елемента після видалення заборонений, оскільки він вказує на неіснуючий елемент. Поведінка щодо інших елементів контейнера є різною залежно від контейнера.
Скажімо, в вашому випадку для контейнера list видалення елемента робить ітератор некоректним лише якщо він вказував на цей елемент, у всіх інших випадках ітератор залишиться коректним. У контейнера vector, наприклад, ситуація трохи складніша, бо при видаленні ітератори на видалений елемент і всі наступні елементи стають некоректними. Тобто у кожного контейнера поведінка інша.
Так каже С++ стандарт. На кожному окремому компіляторі можуть бути свої особливості виділення/звільнення пам'яті, тому інколи ті ітератори, які мали стати некоректними можуть все ще вказувати на якесь місце в пам'яті, з якого вам навіть вдасться дістати якесь значення. Але на це не варто покладатися, бо в загальному поведінка вашої програми непередбачувана, якщо ви використовуєте ітератори, що стали некоректними після зміни контейнера.