Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170

Найти ошибку в работе итератора после изменения одной строки

02.03.2017, 19:28. Показов 533. Ответов 14

Студворк — интернет-сервис помощи студентам
Решил переписать код:
C++
1
2
3
4
5
6
7
8
        for(vector<string>::iterator iter1(f1.begin()); ++iter1 != f1.end(); cout << "\b\b\b\b\b\b\b" << 0.01*(2000 + 8000*(iter1 - f1.begin()) / (f1.end() - f1.begin())) << "%]")
            for(vector<string>::iterator iter2(f2.begin()); ++iter2 != f2.end();)
                if(!(*iter1).compare(*iter2))
                {
                    f1.erase(iter1--);
                    f2.erase(iter2--);
                    break;
                }
- верно работал

на код:
C++
1
2
3
4
5
6
7
8
        for(vector<string>::iterator iter1(f1.begin()), iter2(f2.begin()); ++iter1 != f1.end(); cout << "\b\b\b\b\b\b\b" << 0.01*(2000 + 8000*(iter1 - f1.begin()) / (f1.end() - f1.begin())) << "%]")
            for(; ++iter2 != f2.end();)
                if(!(*iter1).compare(*iter2))
                {
                    f1.erase(iter1--);
                    f2.erase(iter2--);
                    break;
                }
-вывалилась ошибка
Миниатюры
Найти ошибку в работе итератора после изменения одной строки  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2017, 19:28
Ответы с готовыми решениями:

После удаления одной строки HTML-кода на сайте произошли глобальные изменения
Ребята, помогите пожалуйста. Залез в HTML-код страницы и там нечаянно удалил одну строку, после чего на сайте произошли глобальные...

Вопрос по работе итератора.
есть вот такой кусочек кода, но ,к моему стыду, я не совсем понимаю как он работает. Буду оч признателен за разъяснения)) import...

Обновление данных на одной форме, после изменения на другой
Что конкретно должна делать процедура обновления DataSet. Уточняю: данные отображаются в первой форме, чтобы добавить запись, открывается...

14
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.03.2017, 19:41
Мне кажется, строки 5-6 не верны в обоих вариантах.
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.03.2017, 19:44  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Мне кажется, строки 5-6 не верны в обоих вариантах.
для этого я сделал:
C++
1
++iter1 != f1.end()
Добавлено через 1 минуту
Просто, зачем проверять строки, которые до этого были уже проверены, подумал я
(заодно это исключит случай совпадения текста где то в конце и в начале другого документа)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.03.2017, 19:52
После erase() итератор недействителен, а у тебя декремент. Вопрос в том, что раньше отработает.
Возврат надо учитывать. Типа
C++
1
iter1 = f1.erase(iter1);
И только после остальное.
0
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
02.03.2017, 20:01  [ТС]
ok переписав код,

ошибка вывалилась ещё раньше,
на этапе (код тот что посередке):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
        for(vector<string>::iterator iter2 = f2.begin(); iter2 != f2.end(); iter2++)
            if(!((*iter2).compare(0,10,"        <German>")&&(*iter2).compare(0,11,"     <Spanish>")&&(*iter2).compare(0,11,"        <Italian>")))
            {
                cout << "\b\b\b\b\b" << .1*(10 + 90*(iter2 - f2.begin()) / (f2.end() - f2.begin())) << "%]";
                iter2 = f2.erase(iter2);
            }
 
        cout << "\b\b\b\b\b10.0%]";
C++
1
2
3
4
5
6
7
8
9
10
11
12
for(vector<string>::iterator iter1 = f1.begin(); iter1 != f1.end(); iter1++)
            if(!((*iter1).compare(0,10,"        <German>")&&(*iter1).compare(0,11,"     <Spanish>")&&(*iter1).compare(0,11,"        <Italian>")))
            {
                cout << "\b\b\b\b\b" << 9.9*(iter1 - f1.begin()) / (f1.end() - f1.begin()) << "%]";
                iter1 = f1.erase(iter1);
            }
            else
                if(!(*iter1).compare(0,10,"     <French>"))
                {
                    (*iter1).erase(3,6).insert(3,"Russian").erase((*iter1).length()-6,7);
                    (*iter1) += "Russian>";
                }
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
        cout << " " << setprecision(2) << setiosflags(ios::fixed | ios::showpoint);
 
        for(vector<string>::iterator iter1(f1.begin()); ++iter1 != f1.end(); cout << "\b\b\b\b\b\b\b" << 0.01*(2000 + 8000*(iter1 - f1.begin()) / (f1.end() - f1.begin())) << "%]")
            for(vector<string>::iterator iter2(f2.begin()); ++iter2 != f2.end();)
                if(!(*iter1).compare(*iter2))
                {
                    iter1 = f1.erase(iter1);
                    iter2 = f1.erase(iter2);
                    break;
                }
Миниатюры
Найти ошибку в работе итератора после изменения одной строки  
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2017, 13:31
Цитата Сообщение от eXPonent Посмотреть сообщение
- верно работал
странно. eXPonent, а зачем, если есть трудности выполнять столько действий в скобках оператора for ?
Легче же отлаживать когда выражения и операторы в теле.
И не понял момента с erase(it--) Если начальное значение, скажем begin() то вы его удалите и получите новый begin()... далее это будет продолжаться пока вектор не опустеет и begin() не станет равен end(), а для пустого вектора ваше условие мне кажется слабовато (не уверен, не могу сейчас скомпилировать). То есть может:
C++
1
 for(vector<string>::iterator iter2(f2.begin()); iter2!= f2.end() && ++iter2 != f2.end();)
?
0
03.03.2017, 13:57

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Если начальное значение, скажем begin() то вы его удалите и получите новый begin()...
Нет, ТС получит невалидный итератор. Но сколько ему этого не говори, он не поймет, как об стенку горох. :)
Expression: vector iterator not decrementable
Expression: vector iterator not decrementable
Тут(в следующей теме) видим опять это же самое:
Некорректно работает find
Ну и до сюда дошли опять же с этим. :)

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2017, 14:29
Цитата Сообщение от GbaLog- Посмотреть сообщение
Нет, ТС получит невалидный итератор.
У меня в ушах бананы?
Я же об том и говорю. Удаляем начало и уходим на одну позицию в грязь. Потом инкрементируемся на "старый begin()", а он то уже новый. Старый же удалён и на его месте тоже грязь.
Впрочем, если лечебная, то ещё куда ни шло.
ps а почему аффтостопом? По теме же говорим вродь?
ps ps ps
А... да - я в уме сразу не вполне правильно представил как оно квакнется. Оно сразу же на второй итерации и квакнется.
0
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
03.03.2017, 14:33
В случае с итераторами лучше использовать auto, а иногда и вовсе не определять их вручную, а использовать range based for
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
03.03.2017, 16:14
Цитата Сообщение от IGPIGP Посмотреть сообщение
уходим на одну позицию в грязь. Потом инкрементируемся на "старый begin()", а он то уже новый.
Мы не можем полагаться на то, что итератор - просто указатель. Он легко может иметь совершенно иную реализацию, чем мы с вами себе представляем.
Так что куда мы там уходим определяется реализацией.
Итератор - просто паттерн для обхода элементов, а как он там устроен внутри нас волновать не должно. Должно только то, что после erase итератор становится невалидным и им уже пользоваться нельзя.
1
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
03.03.2017, 19:01  [ТС]
так... если запустить этот цикл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        for(vector<string>::iterator iter1(f1.begin()), iter2(f2.begin()); ++iter1 != f1.end(); cout << "\b\b\b\b\b\b\b" << 0.01*(2000 + 8000*(iter1 - f1.begin()) / (f1.end() - f1.begin())) << "%]")
            while(true)
                if(++iter2 != f2.end())
                {
                    if(*iter1 == *iter2)
                    {
                        f1.erase(iter1--);
                        f2.erase(iter2--);
                        break;
                    }
                }
                else
                {
                    iter2 = f2.begin();
                    break;
                }
а потом его же второй раз, цикл вроде работает быстрее в раза 3

Добавлено через 1 килосекунду
Цитата Сообщение от IGPIGP Посмотреть сообщение
И не понял момента с erase(it--) Если начальное значение, скажем begin()
Цитата Сообщение от GbaLog- Посмотреть сообщение
Нет, ТС получит невалидный итератор. Но сколько ему этого не говори, он не поймет, как об стенку горох.
итератор не может быть begin() т.к.
Цитата Сообщение от eXPonent Посмотреть сообщение
C++
1
2
++iter1 != f1.end()
 ++iter2 != f2.end()
Цитата Сообщение от IGPIGP Посмотреть сообщение
iter2!= f2.end() && ++iter2 != f2.end()
первое условие никогда не сработает (только второе)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.03.2017, 19:17
Цитата Сообщение от eXPonent Посмотреть сообщение
итератор не может быть begin() т.к.
Вы инициализируете его begin(), a ++ будет во второй итерации, в остальном прав GbaLog-.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.03.2017, 19:23
eXPonent, Я для вашего проекта логотип нашел:

Есть же std::set_difference(), std::remove_if()
Но если уж хотите велосипед:
C++
1
2
3
4
5
6
7
8
9
10
11
    for (auto it = f1.begin(); it != f1.end();)
    {
        auto it2 = std::find(f2.begin(), f2.end(), *it);
        if (it2 != f2.end()) {
            it = f1.erase(it);
            f2.erase(it2);
        }
        else {
            ++it;
        }
    }
1
 Аватар для eXPonent
99 / 52 / 27
Регистрация: 21.05.2012
Сообщений: 1,170
03.03.2017, 19:36  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
a ++ будет во второй итерации
нет, в первой
вот запустив этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
        for(vector<string>::iterator iter1(f1.begin()); ++iter1 != f1.end(); cout << "\b\b\b\b\b\b\b" << 0.01*(2000 + 8000*(iter1 - f1.begin()) / (f1.end() - f1.begin())) << "%]")
            for(vector<string>::iterator iter2(f2.begin()); ++iter2 != f2.end();)
            {
                if((iter1 == f1.begin()) || (iter2 == f2.begin()))
                    cin.get();
                if(!(*iter1).compare(*iter2))
                {
                    f1.erase(iter1--);
                    f2.erase(iter2--);
                    break;
                }
            }
не разу не сработала строчка:
C++
1
                    cin.get();
Прога отработала на одном файле (на других будет так же)

Добавлено через 1 килосекунду
Цитата Сообщение от avgoor Посмотреть сообщение
find(
что делает эта строчка?
а то я find-ам стал не доверять, после позовчерашнего вечера...

Цитата Сообщение от avgoor Посмотреть сообщение
Есть же std::set_difference(), std::remove_if()
поподробней можно, как вы предлагаете их использовать
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.03.2017, 19:44
Цитата Сообщение от eXPonent Посмотреть сообщение
поподробней можно, как вы предлагаете их использовать
По назначению.
Вы в разных темах кидаете куски кода, состоящего из костылей и велосипедов чуть менее чем полностью, и спрашиваете "почему не работает", даже не говоря как, по вашему мнению, они должны работать.
Прочитайте про <algorithm>. Там все ваши задачи уже давно решены. Хотите велосипедить свою, не побоюсь этого слова, убогую реализацию половины STL - да, пожалуйста. Но хоть отлаживайте тогда сами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.03.2017, 19:44
Помогаю со студенческими работами здесь

Найти ошибку в работе программы
Что не так ? не могу понять #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;clocale&gt; using namespace std; ...

Найти ошибку в работе со структурами
#include &lt;iostream&gt; struct string { char* p; int size; string(int size){p = new char;} ~string(){delete p;} string&amp;...

Помогите найти ошибку в работе foreach
Почему не работает foreach? QList&lt;int&gt; list; QTime time; int count; list.clear(); for(int...

Найти ошибку в работе системы исключений
Криво работают исключения using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Найти ошибку в работе с текстовым файлом
ПОДСКАЖИТЕ, ПОЖАЛУЙСТА, В ЧЕМ ОШИБКА??? #include &lt;iostream.h&gt; #include &lt;fstream.h&gt; int main() { const int N = 7; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru