No, but you can use extension methods to add your own. The following has the same behaviour as std::vector<T>::resize()
, including the same time-complexity. The only difference is that in C++ we can define a default with void resize ( size_type sz, T c = T() )
and the way templates work means that that's fine if we call it without the default for a T
that has no accessible parameterless constructor. In C# we can't do that, so instead we have to create one method with no constraint that matches the non-default-used case, and another with a where new()
constraint that calls into it.
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());
}
}
Now the likes of myList.Resize(23)
or myList.Resize(23, myDefaultValue)
will match what one expects from C++'s vector. I'd note though that sometimes where with C++ you'd have a vector of pointers, in C# you'd have a list of some reference-type. Hence in cases where the C++ T()
produces a null pointer (because it's a pointer), here we're expecting it to call a parameterless constructor. For that reason you might find it closer to the behaviour you're used to to replace the second method with:
public static void Resize<T>(this List<T> list, int sz)
{
Resize(list, sz, default(T));
}
This has the same effect with value types (call parameterless constructor), but with reference-types, it'll fill with nulls. In which case, we can just rewrite the entire class to:
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));
}
}
Note that this isn't so much about differences between std::vector<T>
and List<T>
as about the differences in how pointers are used in C++ and C#.
resize
increases size,reserve
increases capacity. – Morocapacity
andsize
of this vector are set tonewsize
" No it doesn't; only thesize
will be set. Thecapacity
may or may not be set to that. – SkewnessCount
) of a .NETList
, just add to or remove elements from it. – Doomstd::vector<T>::resize()
does as a handy method for adding or removing the amount required. It's nothing you couldn't do yourself, but it is a convenience that that C++ class has, that the equivalent C# class does not. – Ritz