ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのvector<int> をメンバに持つクラス

  • mixiチェック
  • このエントリーをはてなブックマークに追加
STLを使い始めました。
そこで、std::vectorについての質問なのですが、その前に。

今までは、可変長の配列をメンバに持ちたいクラスの場合、
class hoge{
 private:
  int *score; //score[0]として扱う整数へのポインタ
 public:
  void read(int n_score); //scoreの個数がここで確定
}
hoge::read(int n_score){
 score = new int[n_score];
 /*何らかの処理*/
}
という風に先頭のポインタをメンバーとして保持させてました。

ここで質問です。
このint* scoreを
std::vector<int>を用いる場合どうすればいいでしょう?

先頭へのポインタを得る方法や、型がわからず、
(vector<int>::iteratorを一つ持てばいいのかな??)
1つ考えたのは、予め初期化しておく方法
class hoge{
 private:
  std vector<int> score(1); //要素数1で作っておく
 public:
  void read(int n_score); //scoreの個数がここで確定
}
hoge::read(int n_score){
 score.resize(n_score);
 /*何らかの処理*/
}

しかし、これだと再割り当てで無駄なメモリを食いそうです。
どうにか、いい方法はありませんでしょうか?

コメント(12)

最初の要素数1が無駄ですから、
最初にそんな初期化しようと思わない方がいいですね。
そもそもメンバーを宣言するときに初期化の記述はできないでしょうけど。
トピ削除できない・・・
http://www5c.biglobe.ne.jp/~ecb/cpp/07_05_02.html
を参考にして、

class hoge{
 private:
  std vector<int> score; //空で持っておく
 public:
  void read(int n_score); //scoreの個数がここで確定
}
hoge::read(int n_score){
 for(int i=0;i<n_score;i++){
  push_back(何かしら追加);
 }
}

こういうのが、普通の使い方だったりしますか。
コミュ汚し失礼(ノ_・。)
いいじゃないですか。
私も去年の暮れからCからC++に移ることになって、
興味深く読ませてもらってました。

あまりにもSTLって抽象化されていて、
なんか怖い気にもなっていたのですが、テンプレートを理解してきたら納得も出来る反面、便利になれないお年寄りのような、戸惑いを隠せません。
> int *p1 = score.begin();

これはNGです。
begin()が返すiteratorがint*である保証は無いです。
begin()を使うなら、こんな感じで。
int *p1 = &(*score.begin());
トピ立てたものです。

>>1: vuela さん
ミスりました。
確かに宣言で初期化score(1);のようにはできませんね。

>>3:いが湯 さん
まだ勉強しはじめたばかりなので、戸惑ってばかりです。
使っていると慣れそうではありますが、
中身がよくわからないものを使い始めたという気持ち悪さはあります。

>>4-5:オリバーくん さん
4:
なるほど、先に領域を作っておくんですね。
再割り当てのさいに・・・というのはここに書いてあったことです↓
http://www.wakhok.ac.jp/~sumi/stl/header/vector.html#size

MSDN読んでると、reserve()とresize()の違い
(というか、capacity() とsize()の違い)
がわからなかったので後で勉強しておきます。

5:
おー ポインタ(?)が得られるんですね。
これで関数に渡せます、と思ったら、テストコードまで。


みなさんレスありがとうございました。
まだまだ勉強不足ですが、書き込みしてよかったと思いました。
>int *p1 = score.begin(); について

いちおう scoreがstd::vectorの場合は通りましたが、
std::listの場合はエラーになりました。

そこで
int *p1 = &(*score.begin()); のようにしたら通りました。

気をつけたほうがよいみたいですね。
コンテナの変更にも対応できますし。
(環境は、VC++6.0 と BC++5.5.1です)
Scott Meyers先生の本を参考にさせて頂くと

vector vがあり、配列と見なすことができるvのデータへのポインタを取得する必要がある場合、&v[0]を使う。ただし、v.size()が0である場合は、未定義。

参考までに
> std::listの場合はエラーになりました。
> そこで
> int *p1 = &(*score.begin()); のようにしたら通りました。

vectorの場合は要素が連続して並んでるから、コレがOKなんでしょ。
listはイテレーターじゃないと。
> scoreがstd::vector<int>であるなら
> std::vector<int>::iteratorはint*として扱うことが
> できるはずと思ってましたが間違ってます?

そう判断した理由はなんですか?
「思い」が間違ってるかどうか他人が判断するには
まずその「思い」が何であるか明確にする必要ありですね。
おや、コメントの総数は一覧だと16だったのに6件減って10になってる。
1876747番さんが全部消しちゃったのか。
>2
>hoge::read(int n_score){
> for(int i=0;i<n_score;i++){
>  push_back(何かしら追加);
> }
>}

hoge::read(int n_score){
 score.clear();
 for(int i=0;i<n_score;i++){
  score.push_back(何かしら追加);
 }
}
でない?

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング