Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
1

Проверка итератора

30.07.2012, 17:01. Просмотров 4132. Ответов 14
Метки нет (Все метки)

как проверить указывает ли на что либо итератор или он уже неправильный?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2012, 17:01
Ответы с готовыми решениями:

Валидность итератора
Допустимо ли делать такие проверки? Код то отрабатывает, но можно ли так делать? ...

Разыменование итератора
Делаю предикат-функцию поиска внутри вектора,состоящего из экземпляров класса.Решил использовать...

реализация итератора
Реализация класса List и его итератора: #ifndef LIST_H #define LIST_H #include<iostream> ...

Отличие итератора от foreach
Есть ли разница между циклами? std::vector<int> vec; vec.push_back(4); vec.push_back(5);...

14
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:02 2
!= xxx.end()
1
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
30.07.2012, 17:04  [ТС] 3
игнорит такую проверку и краш программы
0
193 / 173 / 30
Регистрация: 10.07.2012
Сообщений: 799
30.07.2012, 17:06 4
слишком много исключений... лучше проверьте принадлежность промежутку [<>.begin(), <>.end());
1
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
30.07.2012, 17:06 5
C++
1
2
3
4
5
TContainer C;
TContainer::iterator I;
// ... работа с контейнером и итератором
if (I == C.end())
   // тут итератор недействителен
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:08 6
Цитата Сообщение от DaskOFF Посмотреть сообщение
игнорит такую проверку и краш программы
кусок контекста выложи, чтобы въехать.
1
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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;
}
0
554 / 508 / 25
Регистрация: 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;
  }
}
1
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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 минут
Можно ли как то проверять равен ли итератор пред последнему элементу карты ?
0
554 / 508 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:53 10
ну давай тогда и свой input.txt. желательно не просто содержимое, а файл
и укажи, какой номер ты удалить пытаешься, чтобы я в точности все воспроизвести мог.

посмотрел твой код. ты не переписал так, как я просил. перепиши цикл итерации в точности как я описал.
1
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 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
Выводить выводит и крашится
0
554 / 508 / 25
Регистрация: 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;
1
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
30.07.2012, 18:05  [ТС] 13
Цитата Сообщение от novi4ok Посмотреть сообщение
вот этот фокус, например, будет 100% вываливать все в конце:

C++
1
2
3
4
 if (it != mapa.end())
                ++it;
            if (it->first.empty())
                break;
чет не понял
0
554 / 508 / 25
Регистрация: 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() (другими словами - указывает на память ЗА последним элементом), а ты с ним действия произовдишь.
1
112 / 112 / 42
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
30.07.2012, 18:21  [ТС] 15
Цитата Сообщение от novi4ok Посмотреть сообщение
напиши хотя бы так:

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

PS: все понял, спасибо за помощь)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2012, 18:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Инкремент невалидного итератора
Привет. Этот вопрос задали знакомому на собеседовании... Что произойдет при инкременте...

Позиция итератора в цикле
Всем привет, как можно узнать позицию итератора в цикле? Есть код, что-то ищем в целочисленном...

Возврат итератора из функции
в чем заключается проблема с возвратом итератора и как ее исправить? заранее спасибо за ответ =) ...

Возврат итератора из функции
На строке 123 все работает, выводит то что нужно. На строке 106 программа зависает и ничего не...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.