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

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

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

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

24.06.2013, 19:12. Просмотров 469. Ответов 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     Работа с итераторами
Посмотрите здесь:

Работа с Итераторами - 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++
Здравствуйте, господа программисты. Пытался написать вот эту задачку, но получается что-то нехорошее. Помогите, пожалуйста! #include...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
1701 / 1194 / 495
Регистрация: 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
...
1701 / 1194 / 495
Регистрация: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2013, 15:16     Работа с итераторами
Еще ссылки по теме:

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

итераторами для std::set - C++
Здравствуйте! Разбирая std::set и его итераторы столкнунлась с ужасающей проблемой: когда передаю итератор в качестве параметра...

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

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


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

Или воспользуйтесь поиском по форуму:
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
26.06.2013, 15:16     Работа с итераторами #5
Обращайте внимание на ошибки, Debug assertion faild это вспомогательные проверялки от студии, часто они могут серъёзно сэкономить вам нервы за счёт того что укажут причину ошибки до того как вы на эту ошибку наступите.
Yandex
Объявления
26.06.2013, 15:16     Работа с итераторами
Ответ Создать тему
Опции темы

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