002
27.04.2005, 10:13 Uhr
GateKeeper
|
Hallo Th,
Danke für den Tipp ... mir war gar nicht klar, dass ich die STL-Implementierung einsehen kann dabei ist das ja in der Tat der beste Weg. Dort hab ich nun folgende Implementierung von insert gefunden (push_back() ist laut Implementierung nur insert am Ende des Vectors):
C++: |
void insert(iterator _P, size_type _M, const _Ty& _X) {if (_End - _Last < _M) {size_type _N = size() + (_M < size() ? size() : _M); iterator _S = allocator.allocate(_N, (void *)0); iterator _Q = _Ucopy(_First, _P, _S); _Ufill(_Q, _M, _X); _Ucopy(_P, _Last, _Q + _M); _Destroy(_First, _Last); allocator.deallocate(_First, _End - _First); _End = _S + _N; _Last = _S + size() + _M; _First = _S; } else if (_Last - _P < _M) {_Ucopy(_P, _Last, _P + _M); _Ufill(_Last, _M - (_Last - _P), _X); fill(_P, _Last, _X); _Last += _M; } else if (0 < _M) {_Ucopy(_Last - _M, _Last, _Last); copy_backward(_P, _Last - _M, _Last); fill(_P, _P + _M, _X); _Last += _M; }}
|
Wenn ich das richtig verstehe, dann wird zuerst überprüft, ob der allozierte Speicherbereich für den Container ausreicht, um die jeweilige Anzahl von Instanzen zu erstellen. Trifft das nicht zu, wird neuer Speicher reserviert und der komplette Vektor verlagert (erste IF-Klausel). Zum erstellen der neuen Instancen wird in diesem Fall wohl _Ufill() benutzt. Mit _Ucopy() wird danach der Rest des Vektors in den neuen Speicherbereich kopiert.
Auch im ersten ELSE-Bereich werden die neuen Instanzen wohl mit _Ufill erzeugt. Der dritte Bereich (ELSE IF) ist mir von der Bedeutung her noch nicht so ganz klar.
Ohne dass ich in _Ufill() nachgesehen hätte hört sich das natürlich sehr nach uninitialized_fill an.
Wenn jetzt der Konstruktor beim Einfügen in den Vektor gar nicht aufgerufen wird. Wann wird er denn dann aufgerufen? (vor der Benutzung der Instanz muss das ja wohl geschehen)
Das ist übrigens die in VC++ 6.0 enthaltene Implementierung der STL, ich wollte die Sache auch noch mal auf dem Amiga kompilieren mit der STL von www.stlport.org, kam aber leider noch nicht dazu. |