Vector "aufrücken" lassen
-
das es nicht im standard steht, ist auch nicht notwendig, weil die alternativen nicht all zu gut sind ^^
beim msvc hab ich so etwas bisher noch nie gesehen... dacht auch immer, dass swap genutzt wird, weil bei pods der nachteil ggnüber dem op= minimal ist (vll komplett wegoptmiert wird) und bei größeren typen der vorteil nat. rel hoch ist - weil man ein std::swap ja auch immer spezialisiert...
aber hier mal nen bsp.:
vector:iterator erase(const_iterator _Where_arg) { // erase element at _Where iterator _Where = _Make_iter(_Where_arg); size_type _Off = _Where - begin(); #if _HAS_ITERATOR_DEBUGGING if (end() <= _Where) _DEBUG_ERROR("vector<bool> erase iterator outside range"); std::copy(_Where + 1, end(), _Where); _Orphan_range(_Off, _Mysize); #else /* _HAS_ITERATOR_DEBUGGING */ std::copy(_Where + 1, end(), _Where); #endif /* _HAS_ITERATOR_DEBUGGING */ _Trim(_Mysize - 1); return (begin() + _Off); }also ein wenig entfrickelt:
iterator erase(const_iterator _Where_arg) { // erase element at _Where iterator _Where = _Make_iter(_Where_arg); size_type _Off = _Where - begin(); std::copy(_Where + 1, end(), _Where); _Trim(_Mysize - 1); return (begin() + _Off); }copy verweist auf paar andere copys, aber schlussendlich wird darauf verwiesen:
template<class _InIt, class _OutIt, class _InOutItCat> inline _OutIt __CLRCALL_OR_CDECL _Copy_opt(_InIt _First, _InIt _Last, _OutIt _Dest, _InOutItCat, _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag) { // copy [_First, _Last) to [_Dest, ...), pointers to scalars #if _HAS_ITERATOR_DEBUGGING _DEBUG_RANGE(_First, _Last); if (_First != _Last) _DEBUG_POINTER(_Dest); #endif /* _HAS_ITERATOR_DEBUGGING */ ptrdiff_t _Off = _Last - _First; // NB: non-overlapping move // if _OutIt is range checked, this will make sure there is enough space for the memmove _OutIt _Result = _Dest + _Off; if (_Off > 0) _CRT_SECURE_MEMMOVE(&*_Dest, _Off * sizeof (*_First), &*_First, _Off * sizeof (*_First)); return _Result; }-> entfrickelt:
template<class _InIt, class _OutIt, class _InOutItCat> inline _Copy_opt(_InIt _First, _InIt _Last, _OutIt _Dest, _InOutItCat, _Scalar_ptr_iterator_tag, _Range_checked_iterator_tag) { ptrdiff_t _Off = _Last - _First; // if _OutIt is range checked, this will make sure there is enough space for the memmove _OutIt _Result = _Dest + _Off; if (_Off > 0) _CRT_SECURE_MEMMOVE(&*_Dest, _Off * sizeof (*_First), &*_First, _Off * sizeof (*_First)); return _Result; }wie _CRT_SECURE_MEMMOVE intern arbeitet bekommt man imho nicht raus
kann dir nur sagen, dass es das hier aufruft:_Check_return_wat_ _CRTIMP errno_t __cdecl memmove_s(_Out_opt_bytecap_post_bytecount_(_DstSize,_MaxCount) void * _Dst, _In_ rsize_t _DstSize, _In_opt_bytecount_(_MaxCount) const void * _Src, _In_ rsize_t _MaxCount);aber die implementation ist eben in der CRT ^^
bb
PS: Ich würde jedenfalls ne Implementierung, die immer einfach nur swap aufruft vollkommen in Ordnung finden - wenn ich nen Objekt nehm, für das kein swap existiert, bin ich selbst schuld - und abgesehen davon, denke ich, dass der compiler da ne ganze menge optimieren kann (also aus dem "normalen" swap eh nen op= wird - aber ich muss jz erst mal weg, bevor ich das testen kann - doofes rl ^^)
-
Boah wieder einiges dazugelernt...:) Hab aber dennoch noch eine Frage:
Ist es auch möglich etwas in einen Vector nachträglich einzuschieben?
also: neues Multi_vec[5]: alte multi_vec[5] wird zu multi_vec[6]?
-
schau mal in der Doku deiner Wahl nach vector<>::insert()
-
Perfekt. Danke.
-
Mmhm ich krieg es einfach nicht hin. Ich versteh nicht was in den 2. Pareameter bei vector.insert(vector.begin,?????); kommt.
Ich habe einen mehrdimensionalen Vector:
std::vector <std::vector std::wstring > multi_vec;//[20][5]
und will bei multi_vec[0] 5 neue Werte einfügen wobei der alte [0] nach 1 rutschen soll usw.
-
-
-
xBlackKnightx schrieb:
englisch
Da kommt man auf Dauer nicht drumherum.
-
Überleg Dir doch einfach mal, was multi_vec[0] für ein Objekt ist. Dann kommst Du zwangsläufig auf sowas hier:
/e: für multi_vec[0] sollte man natürlich eine Referenz anlegen, damit wird die ganze Sache dann ein wenig übersichtlicher...
-
pumuckl schrieb:
xBlackKnightx schrieb:
englisch
Da kommt man auf Dauer nicht drumherum.
Jopp. Aber sie wehren sich behaarlich. *g*
Und natürlich kann man ja auch immer im Forum fragen, und andere Leute quälen, anstatt mal ne halbe Seite englische Doku zu lesen.