いいえ。ただし、拡張メソッドを使用して独自のメソッドを追加できます。以下は、std::vector<T>::resize()
同じ時間複雑度を含め、 と同じ動作をします。唯一の違いは、C++ では でデフォルトを定義できることvoid resize ( size_type sz, T c = T() )
と、テンプレートが機能する方法T
は、アクセス可能なパラメーターなしのコンストラクターを持たない a のデフォルトなしで呼び出しても問題ないことを意味します。C# ではそれができないため、代わりに、デフォルトで使用されていないケースに一致する制約のない 1 つのメソッドと、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());
}
}
myList.Resize(23)
orのmyList.Resize(23, myDefaultValue)
ようなものは、C++ のベクトルに期待されるものと一致するようになりました。ただし、C++ ではポインターのベクトルがある場合があることに注意してください。C# では、いくつかの参照型のリストがあります。したがって、C++T()
が null ポインターを生成する場合 (ポインターであるため)、ここでは、パラメーターなしのコンストラクターを呼び出すことを期待しています。そのため、2 番目のメソッドを次のように置き換えると、慣れ親しんだ動作に近くなる場合があります。
public static void Resize<T>(this List<T> list, int sz)
{
Resize(list, sz, default(T));
}
これは、値型 (パラメーターなしのコンストラクターを呼び出す) でも同じ効果がありますが、参照型では null で埋められます。その場合、クラス全体を次のように書き換えることができます。
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));
}
}
これは と の違いではなく、C++ と C# でのポインターの使用方法の違いでstd::vector<T>
あることに注意してください。List<T>