Может ли кто-нибудь помочь мне понять, что не так с приведенным ниже кодом?
Я использую С++20
Я инициализирую вектор вектора класса «Интервал», но он инициализируется нулями.
#include <bits/stdc++.h>
using namespace std;
class Interval {
public:
int start;
int end;
Interval() {}
Interval(int _start, int _end) {
start = _start;
end = _end;
}
};
vector<Interval> solve(vector<vector<Interval>> schedule) {
vector<Interval> allSchedule;
for(auto it : schedule) {
for(auto it1 : it) {
allSchedule.push_back(it1);
}
}
auto comparator = [](Interval a, Interval b) {
return a.start > b.start;
};
sort(allSchedule.begin(), allSchedule.end(), comparator);
return allSchedule;
}
int main() {
vector<vector<Interval>> schedule;
schedule.push_back({new Interval(1,2), new Interval(5,6)});
schedule.push_back({new Interval(1,3), new Interval(4,10)});
vector<Interval> allSchedules = solve(schedule);
for(auto it : allSchedules) {
cout << it.start << " -> " << it.end << endl;
}
return 0;
}
Получение результата ниже (неожиданно)
1 -> 2
1 -> 3
0 -> 0
0 -> 0
Не могу повторить ваш результат. Я понимаю fatal error: 'bits/stdc++.h' file not found
.
{new Interval(1,2), new Interval(5,6)}
— здесь вы вызываете std::vector(begin, end) constructor
, что приводит к неопределенному поведению, поскольку new Interval(1,2)
, new Interval(5,6)
не являются началом и концом массива. Кажется, у вас есть опыт работы с Java или C#. vector<Interval>
не является вектором указателей и new
вам не нужен.
Обязательно не рискуйте выстрелить себе в ногу #include <bits/stdc++.h> post.
Полезный инструмент: дезинфицирующие средства. Вот ваш код, скомпилированный с большим количеством предупреждений и включенными базовыми дезинфицирующими средствами: godbolt.org/z/fxWWrj91P . Предупреждения не могут выявить эту проблему, но очиститель адресов довольно быстро определяет, что вы на самом деле не использовали итераторы, когда обнаруживает, что программа выходит за пределы допустимой памяти. Выяснение того, что на самом деле произошло в этом случае, требует опыта, который вы приобретете в течение следующих нескольких месяцев (и лет).
vector<vector<Interval>> schedule;
schedule.push_back({new Interval(1,2), new Interval(5,6)});
это очень странная ошибка, потому что vector
имеет конструктор, который можно использовать для его инициализации двумя указателями (итераторами) на другой контейнер, например:
Interval intervals[2];
vector<vector<Interval>> schedule;
schedule.push_back(std::vector<Interval>{ &(intervals[0]), &(intervals[2])});
но для того, чтобы это работало правильно, вам нужно, чтобы оба указателя указывали на начало и конец массива, в вашем случае оба указателя, возвращаемые operator new
, не указывают на один и тот же контейнер, так что это неопределенное поведение и адресный сантайзер отмечает это как переполнение буфера.
с учетом сказанного, вам не следует использовать оператор new для создания объектов при агрегатной инициализации вектора, поэтому правильный синтаксис следующий.
vector<vector<Interval>> schedule;
schedule.push_back({Interval(1,2), Interval(5,6)});
schedule.push_back({Interval(1,3), Interval(4,10)});
{new Interval(1,2), new Interval(5,6)}
— здесь вы вызываете конструктор std::vector(const Interval* begin, const Interval* end)
, который приводит к неопределенному поведению, поскольку new Interval(1,2)
, new Interval(5,6)
не являются началом и концом массива.
Кажется, у вас есть опыт работы с Java или C#: vector<Interval>
не является вектором указателей, и new
вам не нужен.
Заменять
schedule.push_back({new Interval(1,2), new Interval(5,6)});
schedule.push_back({new Interval(1,3), new Interval(4,10)});
с
schedule.push_back({{1, 2}, {5, 6}});
schedule.push_back({{1, 3}, {4, 10}});
// inner vector ^^^^^^^^^^^^^^^^^
//inner vec elements^^^^^^ ^^^^^^^ - intervals
Выход:
5 -> 6
4 -> 10
1 -> 2
1 -> 3
Interval
может быть агрегатом, для него не нужны определяемые пользователем конструкторы Interval()
и Interval(int, int)
.
class Interval {
public:
int start;
int end;
};
Лучше, если solve
и comparator
получают свои аргументы по ссылкам const
(еще один пример возможного использования Java или C#).
vector<Interval> solve(const vector<vector<Interval>>& schedule);
auto comparator = [](const Interval& a, const Interval& b)
И чего вы ожидаете?