46 Stimmen

Zugriff auf den Operator [] über einen Zeiger

Wenn ich einen Zeiger auf ein Objekt definiere, das die [] Operator, gibt es eine direkte Möglichkeit, auf diesen Operator von einem Zeiger aus zuzugreifen?

Zum Beispiel kann ich im folgenden Code direkt auf Vec Mitgliedsfunktionen (wie z.B. empty() ) durch Verwendung des Zeigerwerts -> Operator, aber wenn ich auf die [] Operator muss ich zunächst einen Verweis auf das Objekt erhalten und dann den Operator aufrufen.

#include <vector>

int main(int argc, char *argv[])
{
    std::vector<int> Vec(1,1);
    std::vector<int>* VecPtr = &Vec;

if(!VecPtr->empty())      // this is fine
    return (*VecPtr)[0]; // is there some sort of ->[] operator I could use?

return 0;
}

Ich kann mich durchaus irren, aber es sieht so aus, als ob (*VecPtr).empty() ist weniger effizient als die Durchführung VecPtr->empty() . Deshalb suchte ich nach einer Alternative zu (*VecPtr)[] .

1voto

Jan Holecek Punkte 1981

Es ist erwähnenswert, dass std::vector in C++11 eine Mitgliedsfunktion 'data' hat, die einen Zeiger auf das zugrundeliegende Array zurückgibt (sowohl const als auch non-const Versionen), so dass Sie folgendes schreiben können:

VecPtr->data()[0];

Dies könnte eine Alternative sein zu

VecPtr->at(0);

was einen kleinen Laufzeit-Overhead verursacht, aber was noch wichtiger ist, seine Verwendung impliziert, dass Sie den Index nicht auf Gültigkeit prüfen, bevor Sie ihn aufrufen, was in Ihrem speziellen Beispiel nicht der Fall ist.

Voir std::vector::data für weitere Einzelheiten.

-3voto

user3785008 Punkte 75

Die Leute raten Ihnen zur Verwendung von ->at(0) wegen der Reichweitenkontrolle. Aber hier ist mein Rat (mit anderen Gesichtspunkten):

NIEMALS verwenden. ->at(0) ! Er ist wirklich langsamer. Würden Sie Leistung opfern, nur weil Sie zu faul sind, den Bereich nicht selbst zu überprüfen? Wenn ja, dann sollten Sie nicht in C++ programmieren.

Ich glaube (*VecPtr)[0] ist in Ordnung.

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