こんにちは。
あらかじめ配列の要素数が分かっているわけではなく、コンストラクタの引数によって要素数が決定し、それ以降要素数は変化しないような場合は、std:vectorを固定長配列のように扱うか、int*のようにポインタをメンバに持ち、newで動的に確保するのとどちらが良いのでしょうか?
後者の例は以下のような感じです。
C++
1class Hoge 2{ 3 int* array; 4 5 Hoge(size_t size) 6 { 7 array=new int[size]; 8 } 9};
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
ベストアンサー
少々乱暴な意見を言えばvectorを使っておいた方がよいのではないか、と思います。
一般的に用意されているライブラリーの定義は自分でやるよりは面倒が少なくバグがないだろうとの考えに基づくならvectorやその他のライブラリーから選択するのはよいことだと思います。そのようなライブラリーでは「目的に対して不十分」という不満があるときに自前の実装を考えることもあるでしょう。
実装には様々な要件がありますね?例えば「柔軟性」「メモリー効率」「アクセス効率」「安全性」等々が考えられます。配列の大きさが固定か可変かは柔軟性にあたるもので重要なファクターではありますが、それだけではどれがよいかを選べるほどの十分な条件にならないと思います。
そのような判断をするにはvectorなどのライブラリーの特性を理解し、自分のコードが要求する目的を考えたうえでその特定がマッチするかどうかを判断することが大事だと思います。
おそらくはC++の経験豊富なプログラマーの方ならここに書ききれないぐらいの「列を定義するときの判断基準や用意されているクラスの特性の違い」を語れるのではないかと想像します。自分は素人に近いレベルなのでそんなことは語れませんが、「自分で定義するかvectorその他のクラスを使うか」迷ったときがチャンスととらえvectorが持つ特性を色々調べると思います。そういうことって大事だと思います。
さて最初にvectorを使っておいた方がよいと意見を言いました。それは自前実装よりは安全・手軽であろうこと、vectorの特徴を使ってみて知ることは意義があると思えることから「判断に迷うなら経験を積むのがよいのではないか」と思った程度の理由です。逆に「自前で定義することで実装詳細の経験を積むこともできる」という意見もあるかも知れませんね。
投稿2017/03/13 07:00
編集2017/03/13 08:49総合スコア18394
0
僕ならvectorを選びます。
やっぱり可変長 とか
やっぱりlist とか、
実装の変更時にre-workが少ないので。
※ 未来永劫固定長ならお好きな方を。
[追記] vector(等標準コンテナ)ならデストラクタで明示的に delete[] せんでも勝手に後始末してくれますな。
投稿2017/03/13 07:07
編集2017/03/13 07:12総合スコア16614
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
メモリ消費はstd:vector<>使っても大差ない場合が多いですので、int*
を使った方が良い理由が特にない限り「車輪を再発明する」よりstd::vector<>を使った方が良いと思います。
ところで、後者はデストラクタも必要ですね。(単なる省略と思いますが、念のため。)
投稿2017/03/13 07:05
総合スコア23272
0
std::vectorに一票。
理由は、他の方々もおっしゃっているように、"すでに実装されているから" です。
int型ポインタでもいいですが、
たとえば for文でループさせるために、
最大要素数を取得しますよね。
intポインタの場合、sizeofマクロとかで割り出さないといけませんが、
std::vectorの場合、vector::sizeメンバ関数で 取得できます。
たとえば、
C++
1vector<int> stock; 2 3// ここでデータをセット 4 5int max = (int)stock.size();
のように。
あるいはイテレータ ( iterator ) を使って、
C++
1vector<int> stock; 2 3// ここでデータをセット 4 5vector<int>::iterator it; 6 7for( it = stock.begin(); it != stock.end(); it++ ){ 8 // 何らかの処理 9}
のようにできますし。
投稿2017/03/14 03:40
総合スコア4958
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/14 12:25
2017/03/14 19:24
2017/03/17 02:04
0
特別な理由がない限りvector。自前で実装するのはバグと保守性低下のもと。
特別な理由とは、stlが使用できない場合(組み込み系など)、vectorの使用では速度が確保できない、ROMに入らない、など、非常に限られたもののこと。一定のメモリプールから確保するような場合でも、アロケータが指定できるので、vectorを使わない理由にはならない。
投稿2017/03/13 15:45
総合スコア1720
0
コンパイル時に要素数が確定していないだけで、「コンストラクタからデストラクタの間において要素数の変動が生じえない」というのが真ならば、int*型でも十分だと私は思います。まあ実際は「仕様変更」なんてザラに起こり得ることですがね。
まあせっかく作るのなら、要素数もフィールドで保持しておいて、アクセス時にエラーチェックするくらいのことをしても良いと思います。サンプル↓ 動作未確認
C++
1class Hoge 2{ 3 int* array; 4 int size; 5public: 6 int getN(int n)const{ 7 if(0 <= n && n < size){ 8 return array[n]; 9 } 10 //エラー処理を書く 11 } 12 void setN(int n, int val){ 13 if(0 <= n && n < size){ 14 array[n] = val; 15 }else{ 16 //エラー処理を書く 17 } 18 } 19 Hoge(size_t size0):size(size0), array(new int[size0]) 20 { 21 } 22 ~Hoge() 23 { 24 delete[] array; 25 array = NULL;//不要だけど念のため 26 } 27};
投稿2017/03/14 12:35
総合スコア4830
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。