Головна Обговорення Лінки Пошук Prykladna СС Прикладна _КОЛЕДЖ 28.07.2026 08:09:19 (EEST=GMT+2)
ACM -
Навігація -
Теми форуму +
Чи знали ви, що... ? (beta) -
На відміну від більшості слов’янських мов, у болгарській та македонській немає відмінків.
Події
ПнВтСрЧтПтСбНд
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Перегляд теми
ACM Контестер | Технічні Питання | Тестувалка
Автор The problem with STL
inpfss
Користувач

Повідомлень: 6
Звідки: LNU
Зареєстрований: 02.05.10
Опубліковано 18-09-2010 01:27
:o
Чому я отримую повідомлення про помилку компіляції, коли в моїй програмі є наступний код, пробував через ітератор - програма не працює, тому змушений був написате щось таке:


list<Tree>::_Nodeptr ptr=nodes->_Myhead->_Next;
unsigned int i=0;
while(i++<nodes->size() && ptr!=0)
{
Prepair(ptr->_Myval);
if(ptr->_Myval.GetItem().GetChar()=='[' )
MoveOnNewPlace(t,ptr->_Myval);
ptr=ptr->_Next;
}





У мене VS 2010 і все компілюється без проблем ?
Змінив(ла) inpfss, 18-09-2010 01:28
Надіслати приватне повідомлення
Автор RE: The problem with STL
Ostap
Модератор

Повідомлень: 426
Звідки: ЛНУ, Прикладна, ПМІ-81
Зареєстрований: 03.03.06
Опубліковано 18-09-2010 23:56
_Nodeptr, _Myhead, _Myval (і інші, що починаються з підкруслення) всі оголошені як protected члени класу list, тому в тому контексті в якому ви їх використовуєте вони недоступні.
Подивившись ваш код, я побачив відразу над вище приведеним куском коду закоментованою ту саму логіку реалізовану через ітератори. Вона чудово компілюється, чому ви не використали її?


Не помиляється той, хто нічого не робить!
Ostap 200-738-699 Ostap Korkuna (Lviv NU) Надіслати приватне повідомлення
Автор RE: The problem with STL
inpfss
Користувач

Повідомлень: 6
Звідки: LNU
Зареєстрований: 02.05.10
Опубліковано 20-09-2010 20:09
Ostap написав:
_Nodeptr, _Myhead, _Myval (і інші, що починаються з підкруслення) всі оголошені як protected члени класу list, тому в тому контексті в якому ви їх використовуєте вони недоступні.
Подивившись ваш код, я побачив відразу над вище приведеним куском коду закоментованою ту саму логіку реалізовану через ітератори. Вона чудово компілюється, чому ви не використали її?


Тому, що в цьому коді відбувається модифікація елементів списку: можливе видалення, або додавання.
Я пробував через ітератори => вилітає memory access violation.
Якщо знаєте спосіб перегляду всієї колекції за допомогою ітераторів з можливістю їх модифікації підкажіть, буду вдячний.
Надіслати приватне повідомлення
Автор RE: The problem with STL
Ostap
Модератор

Повідомлень: 426
Звідки: ЛНУ, Прикладна, ПМІ-81
Зареєстрований: 03.03.06
Опубліковано 22-09-2010 10:09
Перш за все, я думаю, що варто змінити алгоритм програми так, щоб не потрібно було додавати/видаляти елементи з контейнера в той час як ви проходите по ньому ітератором.
Який би ви не взяли контейнер, видалення елемента як мінімум робить ітератор який вказував на цей елемент некоректним, тобто будь який доступ до цього елемента після видалення заборонений, оскільки він вказує на неіснуючий елемент. Поведінка щодо інших елементів контейнера є різною залежно від контейнера.
Скажімо, в вашому випадку для контейнера list видалення елемента робить ітератор некоректним лише якщо він вказував на цей елемент, у всіх інших випадках ітератор залишиться коректним. У контейнера vector, наприклад, ситуація трохи складніша, бо при видаленні ітератори на видалений елемент і всі наступні елементи стають некоректними. Тобто у кожного контейнера поведінка інша.
Так каже С++ стандарт. На кожному окремому компіляторі можуть бути свої особливості виділення/звільнення пам'яті, тому інколи ті ітератори, які мали стати некоректними можуть все ще вказувати на якесь місце в пам'яті, з якого вам навіть вдасться дістати якесь значення. Але на це не варто покладатися, бо в загальному поведінка вашої програми непередбачувана, якщо ви використовуєте ітератори, що стали некоректними після зміни контейнера.


Не помиляється той, хто нічого не робить!
Ostap 200-738-699 Ostap Korkuna (Lviv NU) Надіслати приватне повідомлення
Перейти на форум:
Голосування
Що Ви б хотіли отримати в якості подарунку на змаганні з програмування?

Медалі

настільні ігри

торт

клавіатура, навушники, флешки і т.д.

квитки в кіно

квитки в аквапарк

квитки на пейнтбол

книги

футболки з логотипом змагання

Для участі в голосуваннях Ви повинні залогуватись.
Міні-чат +
Зараз на сайті -
Гостей: 1
На сайті немає зареєстрованних користувачів

Користувачів: 5,103
новачок: NataEvgten
Powered by PHP-Fusion © 2003-2006
LNU ACMania © 2004-2011 e-mail: webmaster@acm.lviv.ua
26,045,106 унікальних відвідувачів
Our projects: ACM Contester, _College.