Sagen wir, ich s
verwenden müssen:std :: find() rückwärts auf C-artige Array?
typedef struct tagSOMESTRUCT // Defined by someone else; C-compatible
{
int count;
int elements[256];
} SOMESTRUCT;
SOMESTRUCT s;
und sagen, ich habe eine Funktion wie:
template<typename RevFwdIt>
std::pair<RevFwdIt, RevFwdIt> some_slice_rev(RevFwdIt rbegin, RevFwdIt rend)
{
RevFwdIt it = basename_rev(rbegin, rend);
RevFwdIt e = std::find(rbegin, it, 5);
return std::make_pair(e == it ? rbegin : e, it);
}
Um diese Funktion zu nutzen, muss ich
some_slice_rev(&s.elements[s.count - 1], &s.elements[-1]);
sagen, was (IMHO) ist hässlich und fehleranfällig aufgrund der off-by-one-Fehler.
Auf der einen Seite, ich kann einfach nicht some_slice_rev
-some_slice
ändere die (viel besser)
some_slice(&s.elements[0], &s.elements[s.count]);
zu verwenden, da dann std::find
von Anfang statt Ende suchen würde.
Auf der anderen Seite sieht der Code für mich bereits gebrochen, weil ich nicht sehen kann, wie std::find
"Reverse-Iteratoren" behandelt, die rohe Zeiger sind.
Was ist der beste Weg, um den Code in Situationen wie diesem zu beheben? Gibt es eine Möglichkeit, mit Reverse-Iteratoren zu arbeiten, die rohe Zeiger sind? Oder gibt es einen Standard-Refactoring-Mechanismus zum Fixieren, andere als Ändern SOMESTRUCT
?
Ohh ... wow. Ich wusste nicht, dass es legal ist, 'reverse_iterator' so zu instanziieren ... dachte, dass es intern instanziiert werden muss. +1 das ist hilfreich. Aber, ein Follow-up: Kennen Sie einen generischen Weg, um einen 'some_slice' Wrapper um' some_slice_rev' zu erstellen? (Ich kann nicht einfach 'some_slice (make_reversed (end - 1), make_reversed (begin - 1))' sagen, weil das bei nicht - rohen Zeigertypen abbricht.) – Mehrdad
@Mehrdad: Ich fürchte, ich bin zurück es nicht zu verstehen. :) Vielleicht zu wissen, dass 'std :: reverse_iterator' hat eine 'base()' -Funktion, um den zugrunde liegenden Iterator zu bekommen, hilft bei der Beantwortung Ihrer Frage. – GManNickG
Sorry, ich werde versuchen, es klarer zu machen: Das Problem ist, dass ich 'find' in einem C-artigen Array verwenden kann, aber am Ende des Arrays beginnen soll. Natürlich funktioniert dies auf jedem Container mit umgekehrten Iteratoren ('rbegin()' und 'rend()'), außer dass es nicht für C-artige Arrays funktioniert, die Zeiger verwenden. Ich möchte ** einfach eine Funktion 'XYZ' erstellen, die Vorwärts-Iteratoren verwendet, um dies zu tun, anstatt eine umständliche 'XYZ_rev'-Funktion zu machen, aber ich kenne keinen guten Weg. Irgendwelche Vorschläge? – Mehrdad