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

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

Восстановить пароль Регистрация
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
24.06.2013, 19:12     Работа с итераторами #1
Добрый вечер.
Есть класс для работы с документами. Итераторы для него описаны не совсем верно и при использовании функции 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++ Запутался с итераторами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
26.06.2013, 15:16     Работа с итераторами #5
Обращайте внимание на ошибки, Debug assertion faild это вспомогательные проверялки от студии, часто они могут серъёзно сэкономить вам нервы за счёт того что укажут причину ошибки до того как вы на эту ошибку наступите.
Yandex
Объявления
26.06.2013, 15:16     Работа с итераторами
Ответ Создать тему
Опции темы

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