Die Größenänderung in C ++ ist umständlich, da möglicherweise Konstruktoren und Destruktoren aufgerufen werden müssen.
Ich glaube nicht, dass es einen fundamentalen Grund gibt, warum Sie in C ++ keinen resize[]
Operator haben könnten, new[]
und delete[]
das hat etwas Ähnliches bewirkt:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Offensichtlich oldsize
würde von einem geheimen Ort abgerufen werden, genauso wie es ist delete[]
, und Type
würde vom Typ des Operanden kommen. resize[]
würde fehlschlagen, wenn der Typ nicht kopierbar ist - was richtig ist, da solche Objekte einfach nicht verschoben werden können. Schließlich konstruiert der obige Code die Objekte standardmäßig, bevor sie zugewiesen werden, was Sie nicht als tatsächliches Verhalten wünschen würden.
Es gibt eine mögliche Optimierung newsize <= oldsize
, bei der Destruktoren für die Objekte "nach dem Ende" des neu zusammengestellten Arrays aufgerufen werden und nichts anderes getan wird. Der Standard müsste definieren, ob diese Optimierung erforderlich ist (wie bei resize()
einem Vektor), zulässig, aber nicht spezifiziert, zulässig, aber implementierungsabhängig oder verboten.
Die Frage, die Sie sich dann stellen sollten, lautet: "Ist es tatsächlich nützlich, dies bereitzustellen, da dies vector
auch der Fall ist, und wurde speziell entwickelt, um einen Container mit veränderbarer Größe (mit zusammenhängendem Speicher - diese Anforderung wurde in C ++ 98 jedoch weggelassen) bereitzustellen." behoben in C ++ 03) passt das besser als Arrays zu den C ++ - Methoden? "
Ich denke, die Antwort wird allgemein als "nein" angesehen. Wenn Sie anpassbare Puffer auf C-Weise erstellen möchten, verwenden Sie diese malloc / free / realloc
, die in C ++ verfügbar sind. Wenn Sie die Größe von Puffern in C ++ ändern möchten, verwenden Sie einen Vektor (oder deque
, wenn Sie keinen zusammenhängenden Speicher benötigen). Versuchen Sie nicht, beide mithilfe von Rohpuffern zu mischen new[]
, es sei denn, Sie implementieren einen vektorähnlichen Container.