topic "InVector"; [2 $$0,0#00000000000000000000000000000000:Default] [i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class] [l288;2 $$2,2#27521748481378242620020725143825:desc] [0 $$3,0#96390100711032703541132217272105:end] [H6;0 $$4,0#05600065144404261032431302351956:begin] [i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item] [l288;a4;*@5;1 $$6,6#70004532496200323422659154056402:requirement] [l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param] [i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam] [b42;2 $$9,9#13035079074754324216151401829390:normal] [{_}%EN-US [ {{10000@(113.42.0) [s0; [*@7;4 InVector]]}}&] [s1;%- [@(0.0.255)3 template][3 _<][@(0.0.255)3 class][3 _][*@4;3 T][3 >]&] [s1;:InVector`:`:class:%- [@(0.0.255) class]_[* InVector]_:_[@(0.0.255) public]_[*@3 MoveableA ndDeepCopyOption]<_[* InVector]<[*@4 T]>_>_&] [s2; InVector is random access access container (with operator`[`]) with very fast insertion times for large numbers of elements. O(n) complexity of insertions is relativaly hard to evaluate, but it should be log(n) for any realistic numbers of elements. Index retrieval complexity is log(n), but thanks to per`-thread cache it is fast for simple range scans using increasing/decreasing single index over single container and fast for any iterator based scans.&] [s2; Generally, any method that changes the number of elements in InVector (plus Shrink method) invalidate any iterators to InVector and references to elements in InVector.&] [s2; InVector has default pick transfer semantics with optional deep`-copy. It is [^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ Moveable].&] [s2; InVector requires elements to be [^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ Move able].&] [s0;i448;a25;kKO9;@(0.0.255)%- &] [ {{10000F(128)G(128)@1 [s0; [* Public Method List]]}}&] [s3;%- &] [s5;:InVector`:`:Insert`(int`):%- [*@4 T][@(0.0.255) `&]_[* Insert]([@(0.0.255) int]_[*@3 i])&] [s2; Inserts default constructed elementa at [%-*@3 i]. Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:Insert`(int`,const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Insert]([@(0.0.255) in t]_[*@3 i], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 x])&] [s2; Inserts a copy of [%-*@3 x] at [%-*@3 i]. Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:InsertN`(int`,int`):%- [@(0.0.255) void]_[* InsertN]([@(0.0.255) int]_[*@3 i ], [@(0.0.255) int]_[*@3 count])&] [s2; Inserts [%-*@3 count] default constructed elements at [%-*@3 i]. Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:Remove`(int`,int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i], [@(0.0.255) int]_[*@3 count]_`=_[@3 1])&] [s2; Removes [%-*@3 count] elements at [%-*@3 i]. Invalidates iterators and references. Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:operator`[`]`(int`)const:%- [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* ope rator`[`]]([@(0.0.255) int]_[*@3 i])_[@(0.0.255) const]&] [s5;:InVector`:`:operator`[`]`(int`):%- [*@4 T][@(0.0.255) `&]_[* operator`[`]]([@(0.0.255) i nt]_[*@3 i])&] [s2; Returns a reference to element at [%-*@3 i].&] [s3; &] [s4; &] [s5;:InVector`:`:Add`(`):%- [*@4 T][@(0.0.255) `&]_[* Add]()&] [s2; Same as Insert(GetCount()). Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:Add`(const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Add]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& ]_[*@3 x])&] [s2; Same as Insert(GetCount(), [%-*@3 x]). Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:AddN`(int`):%- [@(0.0.255) void]_[* AddN]([@(0.0.255) int]_[*@3 n])&] [s2; Same as InsertN(GetCount(), [%-*@3 n]). Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:GetCount`(`)const:%- [@(0.0.255) int]_[* GetCount]()_[@(0.0.255) const]&] [s2; Returns a number of elements in InVector.&] [s3; &] [s4; &] [s5;:InVector`:`:IsEmpty`(`)const:%- [@(0.0.255) bool]_[* IsEmpty]()_[@(0.0.255) const]&] [s2; Same as GetCount() `=`= 0.&] [s3; &] [s4; &] [s5;:InVector`:`:Trim`(int`):%- [@(0.0.255) void]_[* Trim]([@(0.0.255) int]_[*@3 n])&] [s2; Same as Remove(n, GetCount() `- n). Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:SetCount`(int`):%- [@(0.0.255) void]_[* SetCount]([@(0.0.255) int]_[*@3 n])&] [s2; Sets the number of elements to be [%-*@3 n] either removing surplus elements or using AddN to extend the InVector. Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:Clear`(`):%- [@(0.0.255) void]_[* Clear]()&] [s2; Same as Remove(0, GetCount()). Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:At`(int`):%- [*@4 T][@(0.0.255) `&]_[* At]([@(0.0.255) int]_[*@3 i])&] [s2; If [%-*@3 i] >`= GetCount, performs SetCount(i `+ 1) to make sure element at [%-*@3 i] exists. elements. In all cases, returns a reference to element at [%-*@3 i]. Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:Shrink`(`):%- [@(0.0.255) void]_[* Shrink]()&] [s2; Miminizes the heap memory allocated by InVector. Invalidates iterators and references to elements.&] [s3; &] [s4; &] [s5;:InVector`:`:Set`(int`,const T`&`,int`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) int]_[*@3 i ], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 x], [@(0.0.255) int]_[*@3 count])&] [s2; Sets the value of [%-*@3 count] elements starting at [%-*@3 i] to [%-*@3 x].&] [s3; &] [s4; &] [s5;:InVector`:`:Set`(int`,const T`&`):%- [*@4 T][@(0.0.255) `&]_[* Set]([@(0.0.255) int]_[*@3 i ], [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 x])&] [s2; Sets the value of element at [%-*@3 i] to [%-*@3 x].&] [s3; &] [s4; &] [s5;:InVector`:`:Swap`(int`,int`):%- [@(0.0.255) void]_[* Swap]([@(0.0.255) int]_[*@3 i1], [@(0.0.255) int]_[*@3 i2])&] [s2; Swaps elements at position [%-*@3 i1] and [%-*@3 i2].&] [s3; &] [s4; &] [s5;:InVector`:`:Drop`(int`):%- [@(0.0.255) void]_[* Drop]([@(0.0.255) int]_[*@3 n]_`=_[@3 1])&] [s2; Removes [%-*@3 n] elements at the end of InVector.&] [s3; &] [s4; &] [s5;:InVector`:`:Top`(`):%- [*@4 T][@(0.0.255) `&]_[* Top]()&] [s5;:InVector`:`:Top`(`)const:%- [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[* Top]()_[@(0.0.255) c onst]&] [s2; Returns a reference to the last element.&] [s3; &] [s4; &] [s5;:InVector`:`:Pop`(`):%- [*@4 T]_[* Pop]()&] [s2; Returns a copy to the last element and removes it.&] [s3; &] [s4; &] [s5;:InVector`:`:FindUpperBound`(const T`&`,const L`&`)const:%- [@(0.0.255) template]_< [@(0.0.255) class]_[*@4 L]>_[@(0.0.255) int]_[* FindUpperBound]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& ]_[*@3 val], [@(0.0.255) const]_[*@4 L][@(0.0.255) `&]_[*@3 less])_[@(0.0.255) const]&] [s5;:InVector`:`:FindUpperBound`(const T`&`)const:%- [@(0.0.255) int]_[* FindUpperBound]( [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 val])_[@(0.0.255) const]&] [s2; Finds the upper bound for [%-*@3 val] using [%-*@3 less] / StdLess as comparison predicate. InVector should be sorted using the same predicate.&] [s3; &] [s4; &] [s5;:InVector`:`:FindLowerBound`(const T`&`,const L`&`)const:%- [@(0.0.255) template]_< [@(0.0.255) class]_[*@4 L]>_[@(0.0.255) int]_[* FindLowerBound]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& ]_[*@3 val], [@(0.0.255) const]_[*@4 L][@(0.0.255) `&]_[*@3 less])_[@(0.0.255) const]&] [s5;:InVector`:`:FindLowerBound`(const T`&`)const:%- [@(0.0.255) int]_[* FindLowerBound]( [@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 val])_[@(0.0.255) const]&] [s2; Finds the lower bound for [%-*@3 val] using [%-*@3 less] / StdLess as comparison predicate. InVector must be sorted using the same predicate.&] [s3; &] [s4; &] [s5;:InVector`:`:InsertUpperBound`(const T`&`,const L`&`):%- [@(0.0.255) template]_<[@(0.0.255) c lass]_[*@4 L]>_[@(0.0.255) int]_[* InsertUpperBound]([@(0.0.255) const]_[*@4 T][@(0.0.255) `& ]_[*@3 val], [@(0.0.255) const]_[*@4 L][@(0.0.255) `&]_[*@3 less])&] [s5;:InVector`:`:InsertUpperBound`(const T`&`):%- [@(0.0.255) int]_[* InsertUpperBound]([@(0.0.255) c onst]_[*@4 T][@(0.0.255) `&]_[*@3 val])&] [s2; Inserts the element at posiotion found using FindUpperBound (but the whole operation is optimized relative to FindUpperBound/Insert pair). InVector must be sorted using the same predicate.&] [s3; &] [s4; &] [s5;:InVector`:`:Find`(const T`&`,const L`&`)const:%- [@(0.0.255) template]_<[@(0.0.255) c lass]_[*@4 L]>_[@(0.0.255) int]_[* Find]([@(0.0.255) const]_[*@4 T][@(0.0.255) `&]_[*@3 val], [@(0.0.255) const]_[*@4 L][@(0.0.255) `&]_[*@3 less])_[@(0.0.255) const]&] [s5;:InVector`:`:Find`(const T`&`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) const]_[*@4 T ][@(0.0.255) `&]_[*@3 val])_[@(0.0.255) const]&] [s2; Finds the position of [%-*@3 val] in InVector sorted using [%-*@3 less] / StdLess. If not found, returns negative value.&] [s3; &] [s4; &] [s5;:InVector`:`:Begin`(`)const:%- [_^InVector`:`:ConstIterator^ ConstIterator]_[* Begin]( )_[@(0.0.255) const]&] [s5;:InVector`:`:End`(`)const:%- [_^InVector`:`:ConstIterator^ ConstIterator]_[* End]()_[@(0.0.255) c onst]&] [s5;:InVector`:`:GetIter`(int`)const:%- [_^InVector`:`:ConstIterator^ ConstIterator]_[* G etIter]([@(0.0.255) int]_[*@3 pos])_[@(0.0.255) const]&] [s5;:InVector`:`:Begin`(`):%- [_^InVector`:`:Iterator^ Iterator]_[* Begin]()&] [s5;:InVector`:`:End`(`):%- [_^InVector`:`:Iterator^ Iterator]_[* End]()&] [s5;:InVector`:`:GetIter`(int`):%- [_^InVector`:`:Iterator^ Iterator]_[* GetIter]([@(0.0.255) i nt]_[*@3 pos])&] [s2; Returns constant/nonconstant iterator to the begin/end/[%-*@3 pos].&] [s3; &] [s4; &] [s5;:InVector`:`:InVector`(`):%- [* InVector]()&] [s2; Constructs empty InVector.&] [s3; &] [s4; &] [s5;:InVector`:`:InVector`(const InVector`&`,int`):%- [* InVector]([@(0.0.255) const]_[* In Vector][@(0.0.255) `&]_[*@3 v], [@(0.0.255) int])&] [s2; Optional deep copy constructor.&] [s3; &] [s4;%- &] [s5;:Upp`:`:InVector`:`:InVector`(std`:`:initializer`_list``):%- [* InVector]([_^http`:`/`/en`.cppreference`.com`/w`/cpp`/utility`/initializer`_list^ s td`::initializer`_list]<[*@4 T]>_[*@3 init])&] [s2; C`+`+ 11 initialization.&] [s3; &] [s4; &] [s5;:InVector`:`:Swap`(InVector`&`):%- [@(0.0.255) void]_[* Swap]([_^InVector^ InVector][@(0.0.255) `& ]_[*@3 b])&] [s2; Swap with another InVector.&] [s3; &] [s0; &] [ {{10000F(128)G(128)@1 [s0; [* Examples on InVector caching]]}}&] [s3;%- &] [s0; Following examples demonstrate what is meant by `"simple scan`" which are using cache to accelerate index retrieval vs more complex non`-cached scans:&] [s0; &] [s0; [4 Cached cases]&] [s0; &] [ {{10000 [s0; [C int m `= 0;]&] [s0; [C for(int i `= 0; i < x.GetCount(); i`+`+)]&] [s0; [C -|m `+`= x`[i`];]&] [s0; [C for(int i `= x.GetCount(); `-`-i >`= 0;)]&] [s0; [C -|m `+`= x`[i`];]]}}&] [s0; &] [s0; &] [ {{10000 [s0; [C InVector y;]&] [s0; [C y <<`= x;]&] [s0; [C int m `= 0;]&] [s0; [C for(int i `= 0; i < x.GetCount(); i`+`+)]&] [s0; [C -|m `+`= x`[i`];]&] [s0; [C for(int i `= y.GetCount(); `-`-i >`= 0;)]&] [s0; [C -|m `+`= y`[i`];]]}}&] [s0; &] [s0; &] [s0; &] [s0; [4 Non`-Cached cases (about 8x times slower in this case)]&] [s0; &] [ {{10000 [s0; [C int m `= 0;]&] [s0; [C for(int i `= 0; i < x.GetCount(); i`+`+)]&] [s0; [C -|m `+`= x`[i`] `+ x`[x.GetCount() `- i `- 1`];]]}}&] [s0; &] [ {{10000 [s0; [C InVector y;]&] [s0; [C y <<`= x;]&] [s0; [C int m `= 0;]&] [s0; [C for(int i `= 0; i < x.GetCount(); i`+`+)]&] [s0; [C -|m `+`= x`[i`] `+ y`[i`];]]}}&] [s0; ]]