3 Stimmen

Wie schreibt man eine Funktion, die einen Iterator oder eine Sammlung auf generische Weise annimmt?

In den letzten 8 Jahren habe ich fast ausschließlich in Java programmiert, und in letzter Zeit habe ich mich wieder mit C++ beschäftigt. Hier ist ein Problem, das ich in Bezug auf Iteratoren in C++ STL und Java aufgeworfen habe.

In Java können Sie eine Methode schreiben, die einen Iterator wie folgt aufnimmt:

void someMethod(Iterator<String> data) {
    // ...
}

Sie geben in einer Iterator und die Methode braucht nicht zu wissen, was die zugrunde liegende Sammlung dieses Iterators ist, was gut ist.

In C++ gibt es keine gemeinsame Basisklasse für Iteratoren (soweit ich weiß). Ich müsste eine Funktion wie diese schreiben:

void some_function(std::vector<std::string>::const_iterator data) {
    // ...
}

Mit anderen Worten, some_function weiß, dass der Iterator ein Iterator über eine vector . Das ist nicht gut, denn ich möchte, dass die Funktion unabhängig von der zugrunde liegenden Auflistung der Iterator ist zu arbeiten.

Wie kann ich dies in C++ tun? Wenn das nicht wirklich möglich ist, wie kann ich dann am besten eine Funktion in C++ erstellen, die eine Sammlung als Parameter annimmt, aber nicht wissen muss, um welche Art von Sammlung es sich genau handelt?

Nachtrag

Vielen Dank für die Antworten. Zusätzlich zu den Antworten habe ich einige gute Informationen dazu in Abschnitt 7.5 (Iterator Traits) des Buches gefunden Die C++-Standardbibliothek: Ein Tutorial und eine Referenz (von Nicolai M. Josuttis). Abschnitt 7.5.1 erklärt, wie man spezielle Versionen von Funktionen für verschiedene Iterator-Kategorien schreibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X