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

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

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

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

24.06.2013, 19:12. Просмотров 485. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2013, 19:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с итераторами (C++):

Работа с Итераторами - C++
Здравствуйте, у меня возникла следующая проблема. У меня есть list&lt;pair&lt;int, int&gt; &gt; snake; Мне надо, чтобы следующий элемент...

Работа с итераторами - C++
QVector &lt;CDevice*&gt; *arrayDevice; Как сделать итератор на такой объект и потом обращаться к функциям CDevice ?

Ошибка с итераторами - C++
Как пройтись по контейнеру и вызвать функции из класса? main.cpp|15|error: request for member 'Area' in '*...

Запутался с итераторами - C++
Привет. Никак не могу понять почему ошибка? std::string s = &quot;sEReGA&quot;; for (std::string::iterator i = s.begin(); i != s.end();...

Непонятки с итераторами - C++
Здравствуйте, господа программисты. Пытался написать вот эту задачку, но получается что-то нехорошее. Помогите, пожалуйста! #include...

Действие с итераторами - C++
Добрый вечер, потихоньку разбираюсь в книге Липпмана &quot;С++ Вводный курс&quot;, и тут вот какая штука. Там приведён следующий пример...

4
anmartex
...
1708 / 1201 / 496
Регистрация: 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;
}
Работа с итераторами
1
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;
}
1
anmartex
...
1708 / 1201 / 496
Регистрация: 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;
}
1
Gepar
1178 / 534 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
26.06.2013, 15:16 #5
Обращайте внимание на ошибки, Debug assertion faild это вспомогательные проверялки от студии, часто они могут серъёзно сэкономить вам нервы за счёт того что укажут причину ошибки до того как вы на эту ошибку наступите.
1
26.06.2013, 15:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2013, 15:16
Привет! Вот еще темы с ответами:

Перемещение элементов итераторами - C++
всем привет, можно ли как-то идя по коллекции итератором, переместить определенный(ые) эллементы в конец коллекции ? int main() { ...

Помогите разобраться с итераторами - C++
У меня есть шаблон класса контейнер. Я использую vector из stl. Так вот мне нужен итератор для поиска find ( first, last, value ) но...

Не до конца понимаю работу с итераторами - C++
Реализовать вспомогательный класс, который мог бы работать как заместитель контейнера, обеспечивая для пользователей полный интерфейс...

Инициализировать вектор итераторами множества - C++
Возможна ли инициализация вектора итераторами? set&lt;int&gt; s={1,2,3,4,5}; set&lt;int&gt;::iterator it=s.begin(),it2=s.end(); ...


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

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

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