Task 2 - Find - Грешка при компилиране в Judge
Здравейте!
Може ли някой да ме светне защо Judge не иска да компилира кода по долу
#include "Company.h"
#include <vector>
#include <algorithm>
inline Company* find(const std::vector<Company*> company, const int &id)
{
auto c = *std::find_if(company.begin(), company.end(), [id](Company* comp) { return comp->getId() == id;});
return c;
}
Компилира и работи успешно под Win10 64bit на VS17
Успях да си реша проблема по следния начин:
Благодаря на @MartinBG и @kolioi за тип-чето относно проверката дали е празен контейнера и дали съществува такова ид
Не е необходимо да проверяваш дали вектора е празен. Този код също ще работи (не съм го тествал в Джадж):
Прави сте, кодът ще работи, но мисълта ми зад тази проверка беше ако е празен вектор хич да не правя гимнастики да създавам итератори, да викам find_if или да проверявам дали
, и тн, а просто да върна nullptr. Просто ако е празен пропускам целия този цирк:
empty() е O(1).
Просто ми изглежда по оптимизирано, поправете ме ако греша.
В случая нама значение, освен ако не се очаква тази функция да бъде викана много често (хиляди пъти) с празен вектор, но дори и тогава е малко вероятно да има разлика в скоростта (най-вероятно едно от първите неща, които find_if прави, е да върне .end() при празен контейнер).
Това е микро оптимизация, а те имат смисъл само в случаите, когато приложението ни е по-бавно от необходимото и сме сигурни, че забавянето идва от тази част на кода ни. Във всички осанали случаи, водещи трябва да са добрите практики при писането на код. Колкото по-малко разклонения и количество код - толкова по-малко вероятно е да се допусне грешка и ще е по-лесно да се поддържа във времето.
Само да допълня, че е добра практика да се проверява върнатата стойност (резултата от извикването) на една функция. За хора с малко опит изглежда, че се пише излишен код, но това спестява доста главоболия и пак повтарям, това е добра парактика.