zoukankan      html  css  js  c++  java
  • [源代码]List的增加与删除

    // Removes the element at the given index. The size of the list is
            // decreased by one.
            // 
            public void RemoveAt(int index) {
                if ((uint)index >= (uint)_size) {
                    ThrowHelper.ThrowArgumentOutOfRangeException();
                }
                Contract.EndContractBlock();
                _size--;
                if (index < _size) {
                    Array.Copy(_items, index + 1, _items, index, _size - index);
                }
                _items[_size] = default(T);
                _version++;
            }

    可以看到 Remove的操作里涉及对List的存储空间重新赋值的工作.而多余占用的空间用Default(T)来填充并未回收

    // Inserts the elements of the given collection at a given index. If
            // required, the capacity of the list is increased to twice the previous
            // capacity or the new size, whichever is larger.  Ranges may be added
            // to the end of the list by setting index to the List's size.
            //
            public void InsertRange(int index, IEnumerable<T> collection) {
                if (collection==null) {
                    ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
                }
                
                if ((uint)index > (uint)_size) {
                    ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_Index);
                }
                Contract.EndContractBlock();
     
                ICollection<T> c = collection as ICollection<T>;
                if( c != null ) {    // if collection is ICollection<T>
                    int count = c.Count;
                    if (count > 0) {
                        EnsureCapacity(_size + count);
                        if (index < _size) {
                            Array.Copy(_items, index, _items, index + count, _size - index);
                        }
                        
                        // If we're inserting a List into itself, we want to be able to deal with that.
                        if (this == c) {
                            // Copy first part of _items to insert location
                            Array.Copy(_items, 0, _items, index, index);
                            // Copy last part of _items back to inserted location
                            Array.Copy(_items, index+count, _items, index*2, _size-index);
                        }
                        else {
                            T[] itemsToInsert = new T[count];
                            c.CopyTo(itemsToInsert, 0);
                            itemsToInsert.CopyTo(_items, index);                    
                        }
                        _size += count;
                    }                
                }
                else {
                    using(IEnumerator<T> en = collection.GetEnumerator()) {
                        while(en.MoveNext()) {
                            Insert(index++, en.Current);                                    
                        }                
                    }
                }
                _version++;            
            }
     // Ensures that the capacity of this list is at least the given minimum
            // value. If the currect capacity of the list is less than min, the
            // capacity is increased to twice the current capacity or to min,
            // whichever is larger.
            private void EnsureCapacity(int min) {
                if (_items.Length < min) {
                    int newCapacity = _items.Length == 0? _defaultCapacity : _items.Length * 2;
                    // Allow the list to grow to maximum possible capacity (~2G elements) before encountering overflow.
                    // Note that this check works even when _items.Length overflowed thanks to the (uint) cast
                    if ((uint)newCapacity > Array.MaxArrayLength) newCapacity = Array.MaxArrayLength;
                    if (newCapacity < min) newCapacity = min;
                    Capacity = newCapacity;
                }
            }
       
    // Gets and sets the capacity of this list.  The capacity is the size of
            // the internal array used to hold items.  When set, the internal 
            // array of the list is reallocated to the given capacity.
            // 
            public int Capacity {
                get {
                    Contract.Ensures(Contract.Result<int>() >= 0);
                    return _items.Length;
                }
                set {
                    if (value < _size) {
                        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value, ExceptionResource.ArgumentOutOfRange_SmallCapacity);
                    }
                    Contract.EndContractBlock();
     
                    if (value != _items.Length) {
                        if (value > 0) {
                            T[] newItems = new T[value];
                            if (_size > 0) {
                                Array.Copy(_items, 0, newItems, 0, _size);
                            }
                            _items = newItems;
                        }
                        else {
                            _items = _emptyArray;
                        }
                    }
                }
            }

     2.1 在尾部插入速度最快

    2.2 在中间插入,涉及数组拷贝

    2.3 元素不够时,涉及重新分配内在和数组拷贝

  • 相关阅读:
    获取comboBox里面的item使用的方法
    QT格式化代码
    按键槽的写法
    int to String
    sprintf在51单片机中的使用
    学习使用MarkDown
    分享9款超酷的jQuery/CSS3插件
    2014年展望
    操作系统面试
    web一点小结
  • 原文地址:https://www.cnblogs.com/zhshlimi/p/8398031.html
Copyright © 2011-2022 走看看