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

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

Войти
Регистрация
Восстановить пароль
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

Работа с итераторами - C++

24.06.2013, 19:12. Просмотров 446. Ответов 4
Метки нет (Все метки)

Добрый вечер.
Есть класс для работы с документами. Итераторы для него описаны не совсем верно и при использовании функции print() выдаётся ошибка. Подскажите, пожалуйста, что и как поправить.
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
63
64
65
66
67
68
typedef vector<char> Line;  
 
class Text_iterator {               //итератор для перемещения по документу
    list<Line>::iterator ln;
    Line::iterator pos;
public:
    Text_iterator(list<Line>::iterator ll, Line::iterator pp)
        :ln(ll), pos(pp) { }
 
    char& operator*() { return *pos; }
    Text_iterator& operator++();
    bool operator==(const Text_iterator& other) const;
    bool operator!=(const Text_iterator& other) const { return !(*this==other); }
};
 
Text_iterator& Text_iterator::operator++()
{
    if (pos==(*ln).end()) {
        ++ln;            
        pos = (*ln).begin();
    }
    else
        ++pos;
    return *this;
}
 
bool Text_iterator::operator==(const Text_iterator& other) const
{ 
    return ln == other.ln && pos == other.pos;
}
 
 
struct Document {
    list<Line> line; 
    Document() { line.push_back(Line()); }
 
    Text_iterator begin() 
    { return Text_iterator(line.begin(), line.begin()->begin()); }    
 
    Text_iterator end()        
    { 
        list<Line>::iterator last = line.end(); 
        --last;
        Line::iterator last_pos=last->end();
        --last_pos;
        return Text_iterator(last,last_pos);
    }
};
 
istream& operator>>(istream& is, Document& d)
{
    char ch;
    int nline(1);
    while (is.get(ch)) {
        cout<<nline++<<": "<<ch<<endl;
        d.line.back().push_back(ch);    
        if (ch=='\n') {                     //'\n' показатель конца строки
            d.line.push_back(Line());  
        }
    }
    d.line.back().push_back('\n');  //для описания end() в Document
    return is;
}
 
void print(Document& d)
{
    for (Text_iterator p = d.begin(); p!=d.end(); ++p)  cout << *p;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2013, 19:12     Работа с итераторами
Посмотрите здесь:

итераторами для std::set C++
C++ Помогите разобраться с итераторами
Действие с итераторами C++
Непонятки с итераторами C++
C++ Работа с Итераторами
C++ Запутался с итераторами
Считать посимвольно файл стандартными средствами и итераторами C++
C++ Инициализировать вектор итераторами множества
C++ Перемещение элементов итераторами
Ошибка с итераторами C++
Работа с итераторами C++
Не до конца понимаю работу с итераторами C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
25.06.2013, 19:22     Работа с итераторами #2
Цитата Сообщение от PG94 Посмотреть сообщение
при использовании функции print() выдаётся ошибка
А какая ошибка? У меня вот этот код не выдаёт никаких ошибок:
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    Document d;
 
    cin >> d;
 
    print(d);
 
    return 0;
}
Работа с итераторами
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
25.06.2013, 21:22  [ТС]     Работа с итераторами #3
Спасибо, что откликнулись. Ниже полный текст программы, запускал в Visul Studio, заканчивал ввод с помощью Ctrl + Z. После вывода выдается следующий текст:
Debug assertion faild!...Exprission: vector iterator is not dereferencable
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<list>
#include<array>
using namespace std;
 
typedef vector<char> Line;  
 
class Text_iterator {               //итератор для перемещения по документу
    list<Line>::iterator ln;
    Line::iterator pos;
public:
    Text_iterator(list<Line>::iterator ll, Line::iterator pp)
        :ln(ll), pos(pp) { }
 
    char& operator*() { return *pos; }
    Text_iterator& operator++();
    bool operator==(const Text_iterator& other) const;
    bool operator!=(const Text_iterator& other) const { return !(*this==other); }
};
 
Text_iterator& Text_iterator::operator++()
{
    if (pos==(*ln).end()) {
        ++ln;            
        pos = (*ln).begin();
    }
    else
        ++pos;
    return *this;
}
 
bool Text_iterator::operator==(const Text_iterator& other) const
{ 
    return ln == other.ln && pos == other.pos;
}
 
 
struct Document {
    list<Line> line; 
    Document() { line.push_back(Line()); }
 
    Text_iterator begin() 
    { return Text_iterator(line.begin(), line.begin()->begin()); }    
 
    Text_iterator end()        
    { 
        list<Line>::iterator last = line.end(); 
        --last;
        Line::iterator last_pos=last->end();
        --last_pos;
        return Text_iterator(last,last_pos);
    }
};
 
istream& operator>>(istream& is, Document& d)
{
    char ch;
    int nline(1);
    while (is.get(ch)) {
        cout<<nline++<<": "<<ch<<endl;
        d.line.back().push_back(ch);    
        if (ch=='\n') {                     //'\n' показатель конца строки
            d.line.push_back(Line());  
        }
    }
    d.line.back().push_back('\n');  //для описания end() в Document
    return is;
}
 
void print(Document& d)
{
    for (Text_iterator p = d.begin(); p!=d.end(); ++p)  cout << *p;
}
 
int main()
try {
    Document d;
    
    cin>>d;
    cout<<"result:\n";
    print(d);
 
    system("pause");
    return 0;
}
catch(runtime_error& e) {
    cerr<<e.what()<<endl;
    system("pause");
    return 1;
}
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
26.06.2013, 05:27     Работа с итераторами #4
У вас ошибка в перегрузке инкремента итератора. Посмотрите, вы допускаете обращение к последнему элементу .end(). Так нельзя делать. Попробуйте так:
C++
1
2
3
4
5
6
7
8
9
Text_iterator& Text_iterator::operator++()
{
   if (++pos == ln->end())
   {
      ++ln;
      pos = ln->begin();
   }
   return *this;
}
Gepar
 Аватар для Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
26.06.2013, 15:16     Работа с итераторами #5
Обращайте внимание на ошибки, Debug assertion faild это вспомогательные проверялки от студии, часто они могут серъёзно сэкономить вам нервы за счёт того что укажут причину ошибки до того как вы на эту ошибку наступите.
Yandex
Объявления
26.06.2013, 15:16     Работа с итераторами
Ответ Создать тему
Опции темы

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