С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
#1

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

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

как проверить указывает ли на что либо итератор или он уже неправильный?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 17:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка итератора (C++):

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

Валидность итератора - C++
Допустимо ли делать такие проверки? Код то отрабатывает, но можно ли так делать? std::vector<int> vec = {1, 2, 3, 4, 5}; auto it =...

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

Ошибка в объявлении итератора - C++
Пытаюсь создать класс deque на основе класса vector. Создал итераторы для deque(все работало) vector<double> ::iterator begin() ...

Ошибка в классе итератора - C++
В общем, решил я написать для своего класса, реализующего двунаправленный список, написать итератор. Вроде бы все правильно, но при попытке...

Собственный класс итератора - C++
Добрый день! Пишу сейчас одну библиотеку (не использующею STL и другие библиотеки) и для контейнеров решил написать класс итератора: ...

14
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:02 #2
!= xxx.end()
1
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
30.07.2012, 17:04  [ТС] #3
игнорит такую проверку и краш программы
0
salam
171 / 152 / 16
Регистрация: 10.07.2012
Сообщений: 751
30.07.2012, 17:06 #4
слишком много исключений... лучше проверьте принадлежность промежутку [<>.begin(), <>.end());
1
John Prick
824 / 757 / 152
Регистрация: 27.07.2012
Сообщений: 2,156
Завершенные тесты: 3
30.07.2012, 17:06 #5
C++
1
2
3
4
5
TContainer C;
TContainer::iterator I;
// ... работа с контейнером и итератором
if (I == C.end())
   // тут итератор недействителен
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:08 #6
Цитата Сообщение от DaskOFF Посмотреть сообщение
игнорит такую проверку и краш программы
кусок контекста выложи, чтобы въехать.
1
DaskOFF
112 / 112 / 9
Регистрация: 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
novi4ok
551 / 504 / 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;
  }
}
1
DaskOFF
112 / 112 / 9
Регистрация: 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
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 17:53 #10
ну давай тогда и свой input.txt. желательно не просто содержимое, а файл
и укажи, какой номер ты удалить пытаешься, чтобы я в точности все воспроизвести мог.

посмотрел твой код. ты не переписал так, как я просил. перепиши цикл итерации в точности как я описал.
1
DaskOFF
112 / 112 / 9
Регистрация: 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
novi4ok
551 / 504 / 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;
1
DaskOFF
112 / 112 / 9
Регистрация: 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
novi4ok
551 / 504 / 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() (другими словами - указывает на память ЗА последним элементом), а ты с ним действия произовдишь.
1
DaskOFF
112 / 112 / 9
Регистрация: 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
30.07.2012, 18:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 18:21
Привет! Вот еще темы с ответами:

Безопасное использование итератора С++ - C++
перебираем в цикле контейнер: for (auto it = A.begin(); it != A.end(); ++it) потом где то внутри удаляем его элемент, при чем не...

Наследование стандартного итератора - C++
Добрый день! Хочу сделать класс &quot;Фильтрующий Итератор&quot; - наследованный от std::vector&lt;int&gt;::iterator, который будет перечислять только...

Отличие итератора от foreach - C++
Есть ли разница между циклами? std::vector&lt;int&gt; vec; vec.push_back(4); vec.push_back(5); vec.push_back(6); for...

Получение void* с итератора - C++
собственно как вытащить адресс void* Добавлено через 22 секунды контейнер вектор


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

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

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