Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 10.10.2022
Сообщений: 2

Ошибка “vector subscript out of range”

10.10.2022, 01:25. Показов 454. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, при решении задачи с обработкой графов столкнулся с ошибкой vector subscript out of range, задача состоит в поиске наименьшего пути в графе с помощью различных методов поиска, прилагаю код моей программы с возможностью выбора типа поиска

Результатом выполнения программы является:
а) определение факта наличия пути между начальной и целевой
вершинами;
б) при существовании пути необходимо вывести этот путь в виде
последовательности вершин, в которой каждая вершина соединена ребром со
следующей вершиной;
в) определение числа шагов, за которое была найдена искомая вершина
графа.



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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
 #include <iostream>
#include <vector>
#include <list>
#include <fstream>
#include <string>
 
using namespace std;
 
int read_file();
int Breadth_Search(int start, int target);
int  Depth_Search(int start, int target);
bool DepthSearch(int start, int target, int x);
bool find_el(list<int> l, int x);
 
list<int> Opened;
list<int> Closed;
vector<int> path;
 
int counter = 0;
int N;
vector<vector<int>> Matrix;
 
int main(){
    setlocale(LC_ALL, "RUS");
    if (read_file()) {
        int start;
        int target;
        int check;
 
        cout << "\nВыберите начальную вершину:\t";
        cin >> start;
        cout << "\nВыберите целевую вершину:\t";
        cin >> target;
 
        cout << "\nВыберите метод поиска:\t";
        cin >> check;
        cout << "\n";
        switch (check)
        {
        case 1:
            Breadth_Search(start, target);
            break;
        case 2:
            Depth_Search(start, target);
            break;
        case 3:
            DepthSearch(start, target, start);
            break;
        default:
            cout << "\nТакого метода нет";
            break;
        }
    }
}
 
int read_file() {
    fstream file("Graph.txt");
 
    if (file.is_open()) cout << "File opened\n";
    else {
        cout << "File isn't opened\n";
        return 0;
    }
 
    file >> N;  
    cout << N << "\n";
    Matrix.resize(N);
    for (int i = -1; i <= N; i++) {
        string n;
        getline(file, n);
        if (n != "") {
            for (int j = 0; j < n.size() - 2; j += 2) {
                Matrix[i].push_back(n[j + 2] - '0');
            }
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < Matrix[i].size(); j++) {
            cout << Matrix[i][j] << "\t";
        }
        cout << "\n";
    }
    return 1;
}
 
int Breadth_Search(int start, int target) {
    vector<int> Rod(N);
    Opened.push_back(start);
    while (!Opened.empty()) {
        int x = Opened.front();
        if (x == target) { 
            int end = target;
            while (end != start) {
                path.push_back(end);
                end = Rod[end-1];
            }
            path.push_back(end);
            for (int i = path.size() - 1; i >= 0; i--) {
                cout << path[i] << "\t";
            }
            cout << "\nСделано ходов:\t" << counter;
            return counter; 
        }
        else {
            Opened.pop_front();
            Closed.push_back(x);
            for (int i = 0; i < Matrix[x - 1].size();i++) {
                if (!find_el(Opened, Matrix[x-1][i]) and !find_el(Closed, Matrix[x-1][i])) {
                    Opened.push_back(Matrix[x - 1][i]);
                    Rod[Matrix[x - 1][i] - 1] = x;
                }
            }
        }
        counter++;
    }
    
    return counter;
}
 
int  Depth_Search(int start, int target) {
    vector<int> Rod(N);
    Opened.push_back(start);
    while (!Opened.empty()) {
        int x = Opened.front();
        if (x == target) {
            int end = target;
            while (end != start) {
                path.push_back(end);
                end = Rod[end - 1];
            }
            path.push_back(end);
            for (int i = path.size() - 1; i >= 0; i--) {
                cout << path[i] << "\t";
            }
            cout << "\nСделано ходов:\t" << counter;
            return counter;
        }
        else {
            Opened.pop_front();
            Closed.push_back(x);
            for (int i = 0; i < Matrix[x - 1].size(); i++) {
                if (!find_el(Opened, Matrix[x - 1][i]) and !find_el(Closed, Matrix[x - 1][i])) {
                    Opened.push_front(Matrix[x - 1][i]);
                    Rod[Matrix[x - 1][i] - 1] = x;
                }
            }
        }
        counter++;
    }
 
    return counter;
}
 
bool DepthSearch(int start, int target, int x) {
    counter++;
    if (x == target) {
        path.push_back(x);
        return true;
    }
    else {
        Closed.push_back(x);
        for (int i = 0; i < Matrix[x - 1].size(); i++) {
            if (!find_el(Closed, Matrix[x - 1][i])) {
                if (DepthSearch(start, target, Matrix[x - 1][i]) == true) {
                    path.push_back(x);
                    if (x == start) {
                        for (int i = path.size() - 1; i >= 0; i--) {
                            cout << path[i] << "\t";
                        }
                        cout << "\nСделано ходов:\t" << counter;
                    }
                    return true;
                }
            }
        }
    }
    return false;
}
 
bool find_el(list<int> l, int x){
    for (list<int>::iterator it = l.begin(); it != l.end(); it++) {
        if (*it == x) { return true; }
    }
    return false;
}
Добавлено через 2 минуты
Ошибка происходит при выборе не смежных вершин, допустим 1 и 5 (выбор их осуществляется через консоль) и при выборе поиска в ширину (1 способ)
Предложенный граф:
Вершина
1 2 3 4
2 1 4 5
3 1 5 6 8
4 1 2 5
5 2 3 4 6
6 5 2 7
7 3

Добавлено через 4 минуты
Данные для создания одного из видов поиска ( как раз с которым возникает ошибка)
Поиск в ширину
Этот алгоритм поиска также называют волновым алгоритмом из-за того,
что обход графа идет по принципу распространения волны. Волна растекается
равномерно во все стороны с одинаковой скоростью. На i-ом шаге будут
выписаны все вершины, достижимые за i ходов, если ходом считать переход из
одной вершины в другую.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Function Breadth_Search;
Begin
Open:=[Start]; // инициализация
Closed:=[];
While Open <> nil do // еще есть вершины
Begin
X:=первая вершина из Open; // выбрать первую вершину из
 списка Open
If X = цель then вернуть True // цель найдена
Else
Begin
Удалить вершину X из списка Open;
Добавить вершину X в список Closed;
Для каждого потомка X // цикл по всем потомкам Х
If он не в списке Open или Closed then добавить в конец
 списка Open;
End;
End;
Вернуть False; // вершин в списке Open не
 осталось
End;
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2022, 01:25
Ответы с готовыми решениями:

Ошибка: Vector subscript out of range
Доброго времени суток! Переписывал задачу с джавы на плюсы, но столкнулся с некоторыми непонятными особенностями плюсов) Появилась ошибка...

Ошибка vector subscript out of range
Ошибка: vector subscript out of range Подскажите, пожалуйста, где ошибка и как решить. Я понимаю, что ошибка в переполнении вектора,...

Ошибка: Vector subscript out of range
Не могу разобраться ,подскажите в чем ошибка. #include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;vector&gt; using namespace std; ...

1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
10.10.2022, 02:03
Лучший ответ Сообщение было отмечено DenisUmov как решение

Решение

C++
1
for (int i = -1; i <= N; i++) {
ну правильно, i у тебя это -1 ты берёшь Matrix[i] == Matrix[-1]
C++
1
Matrix[i].push_back(n[j + 2] - '0');
ну правильно, n у тебя это строка с числами и пробелами, ты из пробелов вычитаешь ноль
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.10.2022, 02:03
Помогаю со студенческими работами здесь

Ошибка vector subscript out of range
Пишет &quot;vector subscript out of range&quot; Смысл этой задачи найти число с максимальной суммой делителей(всех) #include &lt;vector&gt; ...

Ошибка vector subscript out of range
Всем корректного. Читаю Страуструпа. В конце главы есть задание: в первый вектор вводятся люди(их имена), попарно. Во второй вводятся их...

Ошибка vector subscript out of range
Есть структура данных бор. Написана библиотека: #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

Ошибка: Vector subscript out of range
void BFS(vector&lt;vector&lt;int&gt;&gt; matrix) { vector&lt;int&gt; temp; print_matrix(matrix); queue&lt;int&gt; Q; int am = matrix.size(); int*...

Ошибка: Vector subscript out of range
Всю голову сломал, не вижу где ошибка...Выводит только первые 5 итераций, вместо 45... int ecc = 44; //Запись в массив...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru