たとえば、メンバの配列を持つクラスがあるとします。実行時にメンバ配列サイズを定義する方法
nは、ユーザの入力に基づいて定義された変数であるclass myClass {
private:
int myArray[n]
public:
myClass();
someOtherMethod();
};
:それは次のようにして、実行時に/建設時にそのサイズを定義することは可能です。そうでない場合、最良の選択肢は何ですか?
たとえば、メンバの配列を持つクラスがあるとします。実行時にメンバ配列サイズを定義する方法
nは、ユーザの入力に基づいて定義された変数であるclass myClass {
private:
int myArray[n]
public:
myClass();
someOtherMethod();
};
:それは次のようにして、実行時に/建設時にそのサイズを定義することは可能です。そうでない場合、最良の選択肢は何ですか?
ベクターを使用してください。
class myClass {
private:
std::vector<int> myArray;
public:
myClass();
someOtherMethod();
};
myClass::myClass (int size)
: myArray (size)
{
...
}
次に、配列と同じようにベクターに入力することができます。あるいは、Nawazが指摘するように、新しい要素のための領域を予約するreserve()
と、要素を後ろに1つずつ追加するpush_back()
を使用します。
クラステンプレートstd::vector
は、この目的のために設計されています。
class myClass {
private:
std::vector<int> myArray;
public:
myClass(int size);
someOtherMethod();
};
myClass::myClass(int size) : myArray(size)
{
}
です。
意味的に、配列の3種類がある:固定サイズの
C++は、それぞれ正規配列とstd::vector
クラスを使用して、最初のケースと3番目のケースを直接サポートしています。
Cはまた、サポート2つの構築物を有する第二のタイプ:
私は助言、C++ではstd::vector
クラスを使用しています。必要以上のものを提供しますが、使用するのが簡単です。
一方、C++の場合でもテールパディングは使用できます。それはしかし、注意深い工学が必要です。
なぜ 'resize()'ですか?どうして 'reserve()'をしないの? – Nawaz
@Nawazは、あなたがそれをどのように記入するかによって異なります。どちらもうまくいきますが、配列のように 'resize()'で塗りつぶすこともできます。 – chris
'resize()'を使うと、なぜmem-initializer-listを 'myClass :: myClass(int size):myArray(size){}'として使わないのでしょうか。それはさらにいいです。 – Nawaz