Форум программистов, компьютерный форум CyberForum.ru

Проверка итератора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
30.07.2012, 17:01     Проверка итератора #1
как проверить указывает ли на что либо итератор или он уже неправильный?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 17:01     Проверка итератора
Посмотрите здесь:

[C++] Разыменование итератора. C++
Инкремент невалидного итератора C++
Ошибка в объявлении итератора C++
C++ получение void * с итератора
Возврат итератора из функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:02     Проверка итератора #2
!= xxx.end()
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
30.07.2012, 17:04  [ТС]     Проверка итератора #3
игнорит такую проверку и краш программы
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
30.07.2012, 17:06     Проверка итератора #4
слишком много исключений... лучше проверьте принадлежность промежутку [<>.begin(), <>.end());
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
30.07.2012, 17:06     Проверка итератора #5
C++
1
2
3
4
5
TContainer C;
TContainer::iterator I;
// ... работа с контейнером и итератором
if (I == C.end())
   // тут итератор недействителен
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:08     Проверка итератора #6
Цитата Сообщение от DaskOFF Посмотреть сообщение
игнорит такую проверку и краш программы
кусок контекста выложи, чтобы въехать.
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
30.07.2012, 17:19  [ТС]     Проверка итератора #7
вот в этом цикле когда всю карту проходит происходит краш
alf - символ с которого должен начинаться ключ
mapa<string, string>

C++
1
2
3
4
5
6
while ((it != mapa.end()) && (it->first[0] == alf)) {
            out << "   "<< it->second;
            if (it != mapa.end()) {
                ++it;
            }
        }
вот полный код

C++
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <map>
#include <string>
#include <fstream>
#include <sstream>
#include <utility>
 
int main()
{
    std::string autor, book, line,quest;
    std::multimap<std::string, std::string> mapa;
    std::ifstream in;
    std::ofstream out;
    char alf;
    
    //заполняем карту авторами с их произведениями
    in.open("input.txt");
    while (std::getline(in, line)) {
        std::istringstream stream(line);
        stream >> autor;
        while(stream >> book) {
            mapa.insert(std::make_pair(autor, book));
        }
    }
    in.close();
 
    //Спрашиваем какого автора удалить
    std::cout << "sec.name autor for delete: ";
    std::cin >> quest;
    int count = mapa.count(quest);
    if (count != 0) {
        //Удаление диапазона
        for (int i = count; i !=0; --i) {
            mapa.erase(mapa.find(quest));
        }
        std::cout << "Delete " << count << " elements!" << std::endl;
    } else {
        std::cout << "Elements not found!" << std::endl;
    }
    //Выводим список в алфавитном порядке по фамилии автора
    out.open("output.txt");
    std::multimap<std::string, std::string>::iterator it = mapa.begin();
    while (it != mapa.end()) {
        alf = it->first[0];
        out << "Autor Names Beginning with " << alf << " : " << std::endl << "\t" << it->first;
        while ((it <= mapa.end()) && (it >= mapa.begin()) && (it->first[0] == alf)) {
            out << "   "<< it->second;
            if (it != mapa.end()) {
                ++it;
            }
        }
        out << std::endl;
    }
    out.close();
 
    system("PAUSE");
    
    return 0;
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:30     Проверка итератора #8
it->first[0] ссылается ни на что, если строка пустая
а что если по-простому переписать?
C++
1
2
3
4
5
6
7
8
std::map <string, string> const_iterator cit;
for (cit = mapa.begin(); cit != mapa.end(); cit++){
  if (!it->first.empty() && it->first.at(0) == alf){
    out << "   "<< it->second;
  } else {
    break;
  }
}
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
30.07.2012, 17:52  [ТС]     Проверка итератора #9
хм, ща попробую

Добавлено через 15 минут
C++
1
2
if (it->first.empty())
                break;
при такой проверке неправильный указатель опять крашит программу

C++
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <map>
#include <string>
#include <fstream>
#include <sstream>
#include <utility>
 
int main()
{
    std::string autor, book, line,quest;
    std::multimap<std::string, std::string> mapa;
    std::ifstream in;
    std::ofstream out;
    char alf;
    
    //заполняем карту авторами с их произведениями
    in.open("input.txt");
    while (std::getline(in, line)) {
        std::istringstream stream(line);
        stream >> autor;
        while(stream >> book) {
            mapa.insert(std::make_pair(autor, book));
        }
    }
    in.close();
 
    //Спрашиваем какого автора удалить
    std::cout << "sec.name autor for delete: ";
    std::cin >> quest;
    int count = mapa.count(quest);
    if (count != 0) {
        //Удаление диапазона
        for (int i = count; i !=0; --i) {
            mapa.erase(mapa.find(quest));
        }
        std::cout << "Delete " << count << " elements!" << std::endl;
    } else {
        std::cout << "Elements not found!" << std::endl;
    }
    //Выводим список в алфавитном порядке по фамилии автора
    out.open("output.txt");
    std::multimap<std::string, std::string>::iterator it = mapa.begin();
    while (it != mapa.end()) {
        if (it->first.empty())
            break;
        alf = it->first[0];
        out << "Autor Names Beginning with " << alf << " : " << std::endl << "\t" << it->first;
        while (it->first[0] == alf) {
            out << "   "<< it->second;          
            if (it != mapa.end())
                ++it;
            if (it->first.empty())
                break;
        }
        out << std::endl;
    }
    out.close();
 
    system("PAUSE");
    
    return 0;
}
Добавлено через 7 минут
Можно ли как то проверять равен ли итератор пред последнему элементу карты ?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:53     Проверка итератора #10
ну давай тогда и свой input.txt. желательно не просто содержимое, а файл
и укажи, какой номер ты удалить пытаешься, чтобы я в точности все воспроизвести мог.

посмотрел твой код. ты не переписал так, как я просил. перепиши цикл итерации в точности как я описал.
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
30.07.2012, 17:56  [ТС]     Проверка итератора #11
Цитата Сообщение от novi4ok Посмотреть сообщение
ну давай тогда и свой input.txt. желательно не просто содержимое, а файл
там ничего особенного

содержимое
Lippman one two three
Nadoedov four five
Nipi six
Noli hert tur tyr hjr
Poly pol polk klop hipo
Albert Poo Loo
вот что должен выводить если удалить автора Poly
Autor Names Beginning with A :
Albert Poo Loo
Autor Names Beginning with L :
Lippman one two three
Autor Names Beginning with N :
Nadoedov four five six hert tur tyr hjr
Выводить выводит и крашится
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 18:01     Проверка итератора #12
вот этот фокус, например, будет 100% вываливать все в конце:
C++
1
2
3
4
 if (it != mapa.end())
                ++it;
            if (it->first.empty())
                break;
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
30.07.2012, 18:05  [ТС]     Проверка итератора #13
Цитата Сообщение от novi4ok Посмотреть сообщение
вот этот фокус, например, будет 100% вываливать все в конце:

C++
1
2
3
4
 if (it != mapa.end())
                ++it;
            if (it->first.empty())
                break;
чет не понял
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 18:16     Проверка итератора #14
напиши хотя бы так:

if (it == mapa.end() || it->first.empty())
break;

а то твой итератор уже == end(), а ты спрашиваешь it->что-то
а вообще так стараются избегать писать, что даже сам не понимаешь, что там делается. есть давно отработанный код, который позволяет итерировать контейнеры, а ты экспериментируешь, потом вопросы задаешь.

Добавлено через 2 минуты
Цитата Сообщение от DaskOFF Посмотреть сообщение
чет не понял
что не понятного? погда ты доходишь до конца, твой итератор становится равным end() (другими словами - указывает на память ЗА последним элементом), а ты с ним действия произовдишь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 18:21     Проверка итератора
Еще ссылки по теме:

C++ реализация итератора
C++ Удаление end() итератора
C++ Валидность итератора

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

Или воспользуйтесь поиском по форуму:
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
30.07.2012, 18:21  [ТС]     Проверка итератора #15
Цитата Сообщение от novi4ok Посмотреть сообщение
напиши хотя бы так:

if (it == mapa.end() || it->first.empty())
break;
так по условию он из цикла должен выходить если it == mapa.end()

PS: все понял, спасибо за помощь)
Yandex
Объявления
30.07.2012, 18:21     Проверка итератора
Ответ Создать тему
Опции темы

Текущее время: 08:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru