/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class SummaryRanges {
public:
SummaryRanges() {
}
void addNum(int val) {
auto it = st.lower_bound(Interval(val, val));
int start = val, end = val;
if(it != st.begin() && (--it)->end+1 < val) it++;
while(it != st.end() && val+1 >= it->start && val-1 <= it->end)
{
start = min(start, it->start);
end = max(end, it->end);
it = st.erase(it);
}
st.insert(it,Interval(start, end));
}
private:
struct Cmp{
bool operator()(const Interval& a, const Interval& b) { return a.start < b.start;} //works
// bool operator()(Interval& a, Interval& b) { return a.start < b.start;} //error
// bool operator()(Interval a, Interval b) { return a.start < b.start;} //works
};
set<Interval, Cmp> st;
};
Ich möchte Objekte von benutzerdefinierten Klasse Interval
in std::set
sortiert werden. Die Argumente in operator()()
können entweder Wert oder const
Referenz sein. Aber es würde einen folgenden Fehler melden, wenn der Verweis auf die Argumente nicht übergeben wird.Pass von Wert vs nicht konstante Referenz vs konstante Referenz in Vergleichsfunktion
required from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::lower_bound(const key_type&) [with _Key = Interval; _Val = Interval; _KeyOfValue = std::_Identity<Interval>; _Compare = SummaryRanges::Cmp; _Alloc = std::allocator<Interval>; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<Interval>; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::key_type = Interval]’
Warum in std::set
nicht const
Bezug nicht vorbei scheitern?
"Aber es würde Fehler melden" - was Sie in Ihren Fragebeitrag aufnehmen sollten, wie der Inhalt wohl beschreibt (wenn auch etwas kryptisch für einen Anfänger) was * eigentlich * falsch ist. 'std :: set' sendet const-Referenzen zu Ihrem Komparator, was nicht funktioniert, wenn der Komparator nicht-konstante Referenzen benötigt. Sie können änderbare Referenzen an eine Funktion senden, die unveränderliche Referenzen anfordert. das Umgekehrte ist * nicht * der Fall. – WhozCraig
Ich habe den Fehlerbericht hinzugefügt, danke! – Presley