2012-02-11 10 views
-1

C++で配列の末尾に要素を動的に追加するにはどうすればよいですか?C++でオブジェクトの配列に要素を追加する

私はベクトルを使って要素を動的に追加するのに慣れています。しかし、ベクトルはオブジェクトの配列を扱いたくないようです。

私の主な目標は、オブジェクトの配列を持つことですし、別のオブジェクトを取るために配列の最後に要素を追加することができます。

EDIT ** 申し訳ありませんが、そのプッシュバック()は私に問題を引き起こします。

class classex 
{ 
private: 
    int i; 

public: 
    classex() { } 
    void exmethod() 
    { 
     cin >> i; 
    } 
}; 

void main() 
{ 
    vector <classex> vectorarray; 
    cout << vectorarray.size(); 
    cout << vectorarray.push_back(); 
} 

ここで、push_backには引数が必要ですが、どのような引数が必要ですか?

+7

"しかし、ベクトルはオブジェクトの配列を処理したくないようです"これを明確にしてください。おそらくこれをやろうとした場所と何がうまくいかなかったのかという例を挙げてください。 – Johnsyweb

+1

「ベクトルがオブジェクトの配列を処理したくないように思われる」理由を説明できますか? –

+3

'ベクトルはオブジェクトの配列を扱いたくないようです.'これに焦点を当てましょう。これが本当の質問です。つまり、明示的に存在するテクノロジーから、あなたが望むように設計されていないテクノロジーに切り替える必要があるという結論に至る前に、その意味を理解してみましょう。 –

答えて

1

アレイは固定サイズの容器です。したがって、それらを拡大することはできません。これを回避して1つのアレイをより大きなものにコピーし、古いものの後ろにスペースを確保しますが、それだけです。

現在必要なよりも大きな配列を作成し、どの要素がで空であるかを覚えておくことができます。。もちろん、それらは決して空ではありません(少なくとも0を含んでいます)が、それは別の話です。

配列のように、stlコンテナのようにいくつかのコンテナがあります:リスト、ベクトル、デキュー、セットなどです。

このように、私はあなたの例のclassexに(ちょうどあなたの例で、実世界のタッチを与えるために)設定するコンストラクタを追加します。

class classex { 
public: 
    classex(int& v) : i(v) {} 
private: 
    int i; 
}; 

成長しているコンテナの例は次のようになります。

vector <classex> c; // c for container 
// c is empty now. c.size() == 0 

c.push_back(classex(1)); 
c.push_back(classex(2)); 
c.push_back(classex(3)); 
// c.size() == 3 
+1

すべてのSTLコンテナは拡張可能です。 –

+1

@NicolBolasではなく 'std :: array' :) –

+0

@Nicola:私は私のポイントを明確にしました。 –

-2

EDIT:動的に割り当てられた配列に要素を追加する方法は問題でしたが、OPは実際にはstd :: vectorを意味します。区切りの下に私の元の答えです。

std::vector<int> v; 
v.push_back(5); // 5 is added to the back of v. 

あなたは常にCのreallocfreeを使用することができます。 EDIT:手動で、コピーを割り当て、そしてnewdeleteを使用して再配分の要件と比較すると(。あなたのオブジェクトは、PODをしていると仮定)

、それは更新のようStroustrup氏は、キーワードを追加していない不思議。

+3

C++では一般的ではありません。それは未定義の動作です。 –

+0

あなたはそれを私に与えることができますか?私はmallocについてgoogleとの未定義の動作について何も見つかりませんでした。もしそれが真実であれば、あなたのC++コードでCライブラリを#includeしないでしょうか?コンパイラのnewの実装がmallocを呼び出すことが許されていることを読んでも覚えています。また、あなたが正しいとすれば、C++は主要な設計上の選択肢であるCと下位互換性がありません。 – SplinterOfChaos

+2

'realloc'は問題があります。なぜなら、オブジェクトのメモリを動かすことができないからです(オブジェクトがそのメンバの1つにポインタを格納していると想像してください)。これは3.8(1)(オブジェクトの存続期間)の直接の結果です。 –

1

ここで、push_backには引数が必要ですが、どのような引数が必要ですか?

引数は、ベクトルに追加するものです。何がもっと簡単か予想されるでしょうか?

ところで、あなたは本当に、本当に、本当には、例99%でclassexの実際の方法としてexmethodを望んでいません。それは授業の仕方ではありません。インスタンスを作成するための情報を収集することは、クラスの仕事の一部ではありません。クラスはその情報からインスタンスを作成するだけです。

関連する問題