Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для Interstellar
1 / 3 / 1
Регистрация: 26.05.2014
Сообщений: 59

Vertor erase iterator outside range

08.12.2014, 16:44. Показов 4135. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Пытаюсь разобраться с кодом алгоритма шифрования методом Хаффмана, и наткнулся на ошибку (скрин в приложении). Что в этом коде не так, и как можно исправить? Ещё не совсем понял принцип его работы, но после пошаговой отладки выяснилось, что ошибка в логике метода BuildTable (Node *root)
Код программы:
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// HuffmanAlgConsole.cpp: определяет точку входа для консольного приложения.
//
 
#include "targetver.h"
 
#include <stdio.h>
#include <tchar.h>
#include <string>
#include <map>
#include <list>
#include <vector>
#include <iostream>
 
using namespace std;
 
// Класс, описывающий узел бинарного дерева
//
class Node
{
public:
    int a;
    char c;
    Node *left, *right;
 
    Node() {}
 
    Node(Node *L, Node *R)
    {
        left = L;
        right = R;
        a = L->a + R->a;
    }
};
 
vector<bool> code; // bool, т.к. содержит только 0 и 1
map<char, vector<bool> > table; // Таблица ассоциаций кодов и символов
 
 
struct MyCompare
{
    bool operator()(Node* l, Node* r) const
    {
        return l->a < r->a;
    }
};
 
void BuildTable(Node *root)
{
    if (root->left != NULL)
    {
        code.push_back(0);
        BuildTable(root->left);
    }
    if (root->right != NULL)
    {
        code.push_back(1);
        BuildTable(root->right);
    }
    if (root->c) table[root->c] = code;
 
    code.pop_back();
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    string s = "it is my striiiiing!!!!";
 
    map<char, int> m;
 
    for (int i = 0; i < s.length(); i++)
    {
        char c = s[i];
        m[c]++;
    }
 
    list<Node*> t;
 
    map<char, int>::iterator i;
    for (i = m.begin(); i != m.end(); ++i)
    {
        Node *p = new Node;
        p->c = i->first;
        p->a = i->second;
        t.push_back(p);
    }
 
    while (t.size() != 1)
    {
        t.sort(MyCompare());
 
        Node *SonL = t.front();
        t.pop_front();
        Node *SonR = t.front();
        t.pop_front();
 
        Node *parent = new Node(SonL, SonR);
        t.push_back(parent);
    }
 
    Node *root = t.front();
 
    BuildTable(root);
 
    for (int i = 0; i < s.length(); i++)
    {
        char c = s[i];
        vector<bool> x = table[c];
 
        for (int n = 0; n < x.size(); n++)
            cout << x[n];
    }
    
    system("PAUSE");
    return 0;
}
Миниатюры
Vertor erase iterator outside range  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2014, 16:44
Ответы с готовыми решениями:

Vector <bool> erase iterator outside range
Помогите, пожалуйста. При компиляции появляется ошибка (фото ниже). Это реализация алгоритма Хаффмана. Не могу понять, что не так, по...

Ошибка “vector<bool> erase iterator outside range” при работе алгоритма Хаффмана
Проблема с функцией BuildTable. Компилируется, но в процессе работы возникает ошибка. // Huffmann.cpp: определяет точку входа для...

Вызов исключения " vector erase iterator outside range"
В первой же итерации цикла просходит вызов исключения на 8 строчке кода : &quot; vector erase iterator outside range&quot;. Я не могу понять...

6
 Аватар для Interstellar
1 / 3 / 1
Регистрация: 26.05.2014
Сообщений: 59
08.12.2014, 17:44  [ТС]
Да, забыл добавить, что код написан вот по этому руководству:
https://www.youtube.com/watch?v=KNVPFVG49Oc
0
Guardian of Asgaard
377 / 319 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
08.12.2014, 17:56
Внезапно, но ошибка в vector<bool> code. Erase - удаление. Копать надо там.
0
 Аватар для Interstellar
1 / 3 / 1
Регистрация: 26.05.2014
Сообщений: 59
08.12.2014, 18:27  [ТС]
Цитата Сообщение от Darkrduk Посмотреть сообщение
Внезапно, но ошибка в vector<bool> code. Erase - удаление. Копать надо там.
vector<bool> code; - это ведь всего лишь объявление глобальной переменной, что здесь может быть не так?
Да и суть методов простая, BulidTable всего лишь рекурсивно перебирает элементы бинарного дерева, и при нахождении узла с символом записывает пару символ-код в ассоциативный массив. Не понимаю, в чём там ошибка
0
76 / 76 / 32
Регистрация: 14.04.2014
Сообщений: 408
08.12.2014, 18:32
C++
1
code.pop_back();
строка 61, где проверка, что вектор не пустой?
0
Guardian of Asgaard
377 / 319 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
08.12.2014, 18:37
Лучший ответ Сообщение было отмечено Interstellar как решение

Решение

Выбило ошибку, она гуглится и фиксится.
Проблема в .end() либо .pop_back()
Подробнее: http://stackoverflow.com/quest... range-in-c
0
 Аватар для Interstellar
1 / 3 / 1
Регистрация: 26.05.2014
Сообщений: 59
08.12.2014, 21:16  [ТС]
Цитата Сообщение от Interstellar Посмотреть сообщение
void BuildTable(Node *root)
{
if (root->left != NULL)
{
code.push_back(0);
BuildTable(root->left);
}
if (root->right != NULL)
{
code.push_back(1);
BuildTable(root->right);
}
if (root->c) table[root->c] = code;
code.pop_back();
};
Ошибка была в этом методе, т.к. не соблюдалось ключевое условие - ТОЛЬКО при нахождении узла, содержащего букву, необходимо переходить на уровень выше.
Правильный вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void BuildTable(Node *root)
{
 if (root->left != NULL)
 {
 code.push_back(0);
 BuildTable(root->left);
 }
 if (root->right != NULL)
 {
 code.push_back(1);
 BuildTable(root->right);
 }
 if (root->c)
 {
 table[root->c] = code;
 code.pop_back();
 }
};[/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.12.2014, 21:16
Помогаю со студенческими работами здесь

Erase vector; iterator
for (int k = 0; k &lt; passengers.size(); k++) { int *dst_floor_end = NULL; int ucf = std::get&lt;1&gt;(passengers); int dst_floor =...

Vector : iterator & erase
Всем доброго времени суток! Необходимо пройтись по двум векторам и удалить схожие элементы. Но после первого удаления возникает исключение...

Cant dereference out of range vector iterator
Дано две строки одинаковой длины. Строки состоят из символов 0 и 1. Над второй строкой можно выполнять следующие действия: удалить...

Vector iterator + offset out of range
Вылазит такая ошибка. Подскажите, из-за чего она может вылезти?

Шаблоны, "invalid iterator range"
написать шаблонную функцию которая копирует значения с интервала template&lt;typename T&gt; void copy(T* dst, const T* begin, const T* end) ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru