Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
44 / 1 / 0
Регистрация: 26.04.2017
Сообщений: 54
1

Ошибка out of range в vector

09.12.2018, 10:56. Просмотров 504. Ответов 3
Метки нет (Все метки)

Доброго времени суток, возникла такая проблема. Программа компилируется, запускается, но при вводе значений вылетает ошибка "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
// ConsoleApplication169.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
 
#include "pch.h"
#include <iostream>
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
 
// Data structure to store graph edges
struct Edge {
    int source, dest, weight;
 
public:
    Edge(int s, int d, int w)
    {
        this->source = s;
        this->dest = d;
        this->weight = w;
    }
};
 
// data structure to store heap nodes
struct Node {
    int vertex, weight;
};
 
// class to represent a graph object
class Graph
{
public:
    // construct a vector of vectors of Edge to represent an adjacency list
    vector<vector<Edge>> adjList;
 
    // Graph Constructor
    Graph(vector<Edge> const &edges, int N)
    {
        // resize the vector to N elements of type vector<Edge>
        adjList.resize(N);
 
        // add edges to the undirected graph
        for (Edge const &edge : edges)
        {
            // insert at end
            adjList[edge.source].push_back(edge);
        }
 
    }
 
};
 
void print_route(vector<int> const &prev, int i)
{
    if (i < 0)
        return;
 
    print_route(prev, prev[i]);
    cout << i << " ";
}
 
// Comparison object to be used to order the heap
struct comp
{
    bool operator()(const Node &lhs, const Node &rhs) const
    {
        return lhs.weight > rhs.weight;
    }
};
 
// Run Dijkstra's algorithm on given graph
void shortestPath(Graph const& graph, int source, int N)
{
    // create min heap and push source node having distance 0
    priority_queue<Node, vector<Node>, comp> min_heap;
    min_heap.push({ source, 0 });
 
    // set infinite distance from source to v initially
    vector<int> dist(N, INT_MAX);
 
    // distance from source to itself is zero
    dist[source] = 0;
 
    // boolean array to track vertices for which minimum
    // cost is already found
    vector<bool> done(N, false);
    done[0] = true;
 
    // stores predecessor of a vertex (to print path)
    vector<int> prev(N, -1);
 
    // run till min_heap is not empty
    while (!min_heap.empty())
    {
        // Remove and return best vertex
        Node node = min_heap.top();
        min_heap.pop();
 
        // get vertex number
        int u = node.vertex;
 
        // do for each neighbor v of u
        for (auto i : graph.adjList[u])
        {
            int v = i.dest;
            int weight = i.weight;
 
            // Relaxation step
            if (!done[v] && (dist[u] + weight) < dist[v])
            {
                dist[v] = dist[u] + weight;
                prev[v] = u;
                min_heap.push({ v, dist[v] });
            }
        }
 
        // marked vertex u as done so it will not get picked up again
        done[u] = true;
    }
 
    for (int i = 1; i < N; ++i)
    {
        cout << "Path from vertex 0 to vertex " << i << " has minimum "
            "cost of " << dist[i] << " and the route is [ ";
        print_route(prev, i);
        cout << "]\n";
    }
}
 
// main function
int main()
{
    setlocale(0, "");
    int N, s, m;
    cout << "Введите количество вершин " << endl;
    cin >> N;
 
    cout << "Введите количество ребер " << endl;
    cin >> m;
 
    cout << "Введите массив ребер " << endl;
    // initialize edges as per above diagram  // если ребро без направления - нужно писать его дважды 
    vector<Edge> edges;       // хочу вот это заменить на ввод вручную, а оно не хочет
 
 
 
 
    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        scanf_s("%d - %d - %d", &a, &b, &c);
        if (edges.capacity() > i)
            edges.push_back(*(new Edge(a, b, c)));
        else
            edges.resize(i + 1, *(new Edge(a, b, c)));
    }
    // construct graph
    Graph graph(edges, N);
 
 
    cout << "Введите начальную вершину " << endl;
    cin >> s;
    // Number of nodes in the graph
    shortestPath(graph, s, N);
 
    return 0;
 
 
 
    /*{0, 1, 10},
    {0, 4, 3},
    {1, 2, 2},
    {1, 4, 4},
    {2, 3, 9},
    {3, 2, 7},
    {4, 1, 1},
    {4, 2, 8},
    {4, 3, 2}*/
}
0
Миниатюры
Ошибка out of range в vector  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2018, 10:56
Ответы с готовыми решениями:

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

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

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

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

3
164 / 107 / 57
Регистрация: 30.08.2018
Сообщений: 357
09.12.2018, 11:18 2
Цитата Сообщение от Yavorsky Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        scanf_s("%d - %d - %d", &a, &b, &c);
        if (edges.capacity() > i)
            edges.push_back(*(new Edge(a, b, c)));
        else
            edges.resize(i + 1, *(new Edge(a, b, c)));
C++
1
2
3
4
5
    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        scanf_s("%d - %d - %d", &a, &b, &c);
            edges.push_back( Edge(a, b, c));
0
44 / 1 / 0
Регистрация: 26.04.2017
Сообщений: 54
09.12.2018, 11:22  [ТС] 3
JaponDemon, не помогло, к сожалению, но спасибо за попытку)
0
164 / 107 / 57
Регистрация: 30.08.2018
Сообщений: 357
09.12.2018, 11:32 4
Но это ошибка
Цитата Сообщение от Yavorsky Посмотреть сообщение
edges.push_back(*(new Edge(a, b, c)));
Утечка памяти.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2018, 11:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Ошибка: Out of range при использовании <vector>
void quicksort() { long long arrsize; cout &lt;&lt; &quot;Enter amount of number&gt; &quot;; cin &gt;&gt; arrsize;...

Vector subscript out of range - Ошибка при компиляции
#include &quot;Bank.h&quot; Bank::Bank() { } Bank::Bank(const std::vector&lt;Payer&gt; &amp;payers) { for...

Закрытое хэширование. Ошибка vector subcript out of range
Здравствуйте. Создаю хэш-таблицу (основная функц - линейная, вспомогательная - метод деления по...


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

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

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