nht*_*rnm 26 c# c++ list vector
当我使用resize(int newsize)在C++对vector<T>,这意味着size这vector被设置为newsize与所述索引中的范围上运行[0..newsize).如何在C#中做同样的事情List<T>?
更改List<T>属性Capacity只会更改Capacity但保持Count相同,此外索引仍然在范围内[0..Count).请帮帮我.
PS想象我有vector<T> tmp一个tmp.size() == 5我不能引用tmp[9],但是当我然后使用tmp.resize(10)我可以引用tmp[9].在C#如果我有List<T> tmp跟tmp.Count == 5我不是指tmp[9](IndexOutOfRangeException),但即使当我设置tmp.Capacity=10我将无法指tmp[9]堂妹的tmp.Count依然是5.我想找到C#调整大小的一些比喻.
Jon*_*nna 29
不,但您可以使用扩展方法添加自己的扩展方法.以下内容具有相同的行为std::vector<T>::resize(),包括相同的时间复杂度.唯一的区别是在C++中我们可以定义一个默认值,void resize ( size_type sz, T c = T() )并且模板工作的方式意味着如果我们调用它没有默认值而T没有可访问的无参数构造函数那就没问题.在C#中我们不能这样做,所以我们必须创建一个没有约束的方法,该方法与非默认使用的情况相匹配,另一个方法具有where new()调用它的约束.
public static class ListExtra
{
    public static void Resize<T>(this List<T> list, int sz, T c)
    {
        int cur = list.Count;
        if(sz < cur)
            list.RemoveRange(sz, cur - sz);
        else if(sz > cur)
        {
            if(sz > list.Capacity)//this bit is purely an optimisation, to avoid multiple automatic capacity changes.
              list.Capacity = sz;
            list.AddRange(Enumerable.Repeat(c, sz - cur));
        }
    }
    public static void Resize<T>(this List<T> list, int sz) where T : new()
    {
        Resize(list, sz, new T());
    }
}
Run Code Online (Sandbox Code Playgroud)
现在喜欢myList.Resize(23)或myList.Resize(23, myDefaultValue)将匹配C++的向量所期望的.我注意到,有时在C++中你会有一个指针向量,在C#中你会得到一些引用类型的列表.因此,在C++ T()生成空指针(因为它是指针)的情况下,这里我们期望它调用无参数构造函数.出于这个原因,您可能会发现它更接近您习惯用以下方法替换第二个方法的行为:
  public static void Resize<T>(this List<T> list, int sz)
  {
      Resize(list, sz, default(T));
  }
Run Code Online (Sandbox Code Playgroud)
这与值类型(调用无参数构造函数)具有相同的效果,但是对于引用类型,它将填充空值.在这种情况下,我们可以将整个类重写为:
public static class ListExtra
{
    public static void Resize<T>(this List<T> list, int sz, T c = default(T))
    {
        int cur = list.Count;
        if(sz < cur)
            list.RemoveRange(sz, cur - sz);
        else if(sz > cur)
            list.AddRange(Enumerable.Repeat(c, sz - cur));
    }
}
Run Code Online (Sandbox Code Playgroud)
请注意,这std::vector<T>与List<T>C++和C#中指针的使用差异之间的差异并不大.
pur*_*dox 12
只是为了让Jon Hanna的回答更具可读性:
public static class ListExtras
{
    //    list: List<T> to resize
    //    size: desired new size
    // element: default value to insert
    public static void Resize<T>(this List<T> list, int size, T element = default(T))
    {
        int count = list.Count;
        if (size < count)
        {
            list.RemoveRange(size, count - size);
        }
        else if (size > count)
        {
            if (size > list.Capacity)   // Optimization
                list.Capacity = size;
            list.AddRange(Enumerable.Repeat(element, size - count));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           31453 次  |  
        
|   最近记录:  |