Почему образовалась ошибка на этапе выполнения в заголовочном файле memory?
Можно ли работать с for_each как с обычным циклом и как можно выйти из него(break не работает),в ифе сравниваются две переменные типа double ,не знаю из за чего она может тут быть.Цикл по вектору .
[![сама ошибка![][1]]](https://i.stack.imgur.com/sZAdt.png)
https://github.com/vantig/SoundRecordingProject можно скомпилить в VS
std::shared_ptr<BaseTrack> Playlist::findMusicinRange(double start, double finish)
{
std::for_each(this->music.begin(),this-> music.end(), [start,finish](auto temp)
{
double x=temp->getDuration();
if (x >= start && x<=finish )
{
std::cout << temp;
return temp;
}
});
std::shared_ptr<BaseTrack>null;
return null;
}
Ответы (1 шт):
Используй Ranged-based версию цикла for и будет тебе счастье:
for(auto& track: this->music) {
double duration = track->getDuration();
if (duration >= start && duration<=finish ) {
std::cout << track;
break; /* или return track; */
}
}
Если очень хочется воспользоваться каким-нибудь STL'евским алгоритмом, то тут больше подойдёт find_if:
auto trackIt = std::find_if(this->music.begin(), this-> music.end(),
[start,finish](auto track)->bool {
double duration = track->getDuration();
return (start<=duration && duration<=finish );
});
if (trackIt) {
std::cout << *trackIt;
return *trackIt
} else {
return std::shared_ptr<BaseTrack>();
}
Можно ли работать с for_each как с обычным циклом
Нет, нельзя. Как уже сказано в комментарияхе, std::for_each — это не цикл, не специальная конструкция языка, а просто функция, которая принимает в качестве последнего аргумента функтор. Типовая реализация примерно такая:
template<class InputIt, class UnaryFunction>
constexpr UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
for (; first != last; ++first) {
f(*first);
}
return f; // implicit move since C++11
}
Почему образовалась ошибка на этапе выполнения в заголовочном файле memory?
Потому что не все ветки функтора, передаваемого std::for_each возвращают значение. А это UB. Компилятор должен был выругаться по этому поводу. Если говорить практически, то когда трека с нужной продолжительностью в коллекции не находится функтор возвращает мусорное значение для которого потом вызывается деструктор ~shared_ptr(). Вообще говоря, функтор передаваемый в std::for_each и не должен возвращать никакого значения, но большинство реализации это проглатывают.