Predykat musi przyjąć dwa parametry i zwrócić wartość bool.
Ponieważ funkcja jest funkcją składową, ma nieprawidłową sygnaturę.
Ponadto może być konieczne porównanie wartości do int, wartości do wartości, int do wartości i int do int przy użyciu funktora.
struct CompareValueAndTime
{
bool operator()(const Value& v, int time) const
{
return v.time < time;
}
bool operator()(const Value& v1, const Value& v2) const
{
return v1.time < v2.time;
}
bool operator()(int time1, int time2) const
{
return time1 < time2;
}
bool operator()(int time, const Value& v) const
{
return time < v.time;
}
};
To jest dość kłopotliwe, więc niech je zmniejszyć:
struct CompareValueAndTime
{
int asTime(const Value& v) const // or static
{
return v.time;
}
int asTime(int t) const // or static
{
return t;
}
template< typename T1, typename T2 >
bool operator()(T1 const& t1, T2 const& t2) const
{
return asTime(t1) < asTime(t2);
}
};
następnie:
std::lower_bound(valueContainer.begin(), valueContainer.end(), time,
CompareValueAndTime());
Istnieje kilka innych błędów też, na przykład nie ma średnika na końcu deklaracji klasy plus fakt, że członkowie klasy są domyślnie prywatni, co powoduje, że cała twoja klasa jest w tym przypadku prywatna. Czy przed konstruktorem spóźniłeś się z public:
?
Twoja funkcja GetLocationForTime nie zwraca wartości. Musisz przyjąć wynik lower_bound i odjąć begin() od niego. Funkcja powinna być również stała.
Jeśli intencją tego połączenia jest wstawienie tutaj, należy wziąć pod uwagę fakt, że wstawienie w środku wektora jest operacją O (N), a zatem wektor może być niewłaściwym typem kolekcji tutaj.
Należy pamiętać, że algorytm lower_bound
działa tylko w przypadku wstępnie posortowanych kolekcji. Jeśli chcesz, aby móc spojrzeć na poszczególnych członków bez ciągłego uciekania, będziemy chcieli, aby utworzyć indeksy na tych polach, ewentualnie przy użyciu doładowania za multi_index
Nie otrzymam wszystkich tych głosów do zamknięcia, nie ma nic złego w tym pytaniu. Kod jest nieprawidłowy, ale jest to ważne pytanie. – CashCow
@CashCow - Zgadzam się całkowicie. Mało prawdopodobnym błędem StackOverflow jest działalność nadgorliwych bliskich wyborców. Wraz ze wzrostem liczby użytkowników SO liczba wymaganych głosów bliskich nie * rośnie *, a zamykani wyborcy są bardziej aktywni według zleceń lub rzędów wielkości niż ponownie otwarci wyborcy, powodując ten problem. –
Jeśli problem polega na tym, że ma błędy kompilatora, powinien nam powiedzieć, co to jest. Jeśli widzimy błędy, możemy prawdopodobnie natychmiast wysłać odpowiedź. Bez błędów musimy przejść przez dodatkową pracę polegającą na samodzielnej kompilacji, co sprawia, że nie chcemy odpowiadać, co sprawia, że jest to złe pytanie. –