vectorのresizeについて

このQ&Aのポイント
  • C++のvectorのresizeメソッドでコンストラクタの値を指定できるか
  • resize以外でコンストラクタの値を指定する方法について
回答を見る
  • ベストアンサー

vectorのresizeについて

class A{ vector<double> data; public: A(int a){ this->data.resize(a); } }; template<class T> class B { std::vector<T> vec; public: B(int a){ this->vec.resize(a); } }; int main() { B<A> c(10); } としたとき class A のコンストラクタの値を指定することができません. vectorのresizeにコンストラクタの値を指定することができるのでしょうか. また,resize以外にこのようなことをすることができるのでしょうか. 回答よろしくお願いします.

  • jpir
  • お礼率40% (15/37)

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 早速試した結果コンパイルすることができませんでした. typenameが抜けていましたね。 > typedef std::vector<T>::size_type size_type; > typedef std::vector<T>::value_type value_type; の部分ですが、 typedef typename std::vector<T>::size_type size_type; typedef typename std::vector<T>::value_type value_type; が正解です。

jpir
質問者

お礼

無事コンパイルでき問題を解決することができました. ありがとうございます.

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 私は typedef を使用せずに > B(std::vector<T>::size_type n, const std::vector<T>::value_type value) : vec(n,value){} > としたいのですが,問題ないでしょうか? 問題はありませんが、クラスBに相当するのものが実際にはどんなクラスかによっては、typedefした方がよいと思います(コンテナの一般的な規約にあわせる意味で)。 > また,main関数側では > int main() > { >  B<A> c(10,20); > } > のような記述でコンパイルできるのでしょうか? explicitが無いのは意図的だったのですね。 一応、コンパイルできるとは思います。

jpir
質問者

補足

回答ありがとうございます 早速試した結果コンパイルすることができませんでした. 実際入力したコードはこのようになっています. #include <iostream> #include <vector> class A{ std::vector<double> data; public: A(int num) { this->data.size(); } }; template <class T> class B { std::vector<T> vec; public: typedef std::vector<T>::size_type size_type; typedef std::vector<T>::value_type value_type; B(size_type n, const value_type value) : vec(n, value) {} }; int main() { B<A> c(10,20); return 0; } 何か問題があるのでしょうか? 長くなってしまい申し訳ありません.

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

resizeは第2引数にvalue_typeへのconst参照を渡すことができます。 this->vec.resize(a, A(0)); のようにすることができます。 ただ、今回の場合は、resizeではなくvectorのコンストラクタを使った方がよくないでしょうか。 template <class T> class B { public:  typedef std::vector<T>::size_type size_type;  typedef std::vector<T>::value_type value_type;  B(size_type n, const value_type value) : vec(n, value) {} }; という具合です。

jpir
質問者

補足

回答ありがとうございます. 上述されたことでちょっと質問があるのですが, 私は typedef を使用せずに B(std::vector<T>::size_type n, const std::vector<T>::value_type value) : vec(n,value){} としたいのですが,問題ないでしょうか? また,main関数側では int main() {  B<A> c(10,20); } のような記述でコンパイルできるのでしょうか?

関連するQ&A

  • vector操作でコピーコンストラクタの抑制

    std::vector<std::vector<MyData>> vecvec; とした場合、vecvec.insert() / erase() でも MyData のコピーコンストラクタは走らないのですが、 struct MyVector { std::vector<MyData> vec; }; std::vector<MyVector> vecMyVec; とした場合、vecMyVec.insert() / erase() で、MyData のコピーコンストラクタが走ります。 MyVector が、何らかの継承と実装をすれば、回避できると思うのですが、 その方法を知ってる方がいらしたら教えてください。

  • min_elementの三番目の引数

    ただいまSTLを勉強しているのですが、min_elementの三番目の引数の意味がわかりません。 iter min_element(iter first,iter last,pred pr); 以下のように使うのかなと自己解釈しましたが違うようです。 どうかご教授お願いします。 struct DATA{ int a; int b; }; main() { std::vector< DATA > data_vec; std::vector< DATA >::iterator it; for(int i=0;i<10;i++)//適当な数を10個プッシュバック { DATA data; data.a=rand(); data.b=rand(); data_vec.push_back(data); } //it = min_element(data_vec.begin(),data_vec.end(),DATA::a); }

  • Vector ClassのVector配列

    Vector配列からVector配列への代入などのアクセスは問題なく行えるのですが、 Vectorを入れ子にした場合?にエラーが生じてしまいます。 Class Myclass{ public: vector <int> num; }; vector <Myclass> obj; ・・・・ vector <Myclass>::iterator it=obj.begin(); vector <int> work; ・・・・ it->num=work; とするとエラーになってしまいます。 代入以外のresize()などのアクセスもエラーになってしまいますが、 vector が入れ子になっていることが関係しているのでしょうか? ご教示願います。

  • 2次元のvectorにオブジェクトのポインタを格納

    VC++6.0です。 まず、ポインタでなく、int型の格納なら分かったんです。 ・・・ #include <vector> using namespace std; main(){ vector <vector<int > > a(10); ←←← for(int i=0;i<10;i++){ a[i].resize(10); } ・・・ for(int j=0;j<10;j++){ for(int i=0;i<10;i++){ a[i][j]=i+j; } } ・・・ } という感じで利用できることが。 しかし、やりたいのは、整数型でなく、 オブジェクトのポインタを格納したいんですが、 矢印部分を例えば、vector <vector<class *> > a(10); などどしてもエラーになってしまいます。 どのように実装したらよいのでしょうか?

  • vectorを引数として使いたいのですがエラーが出てしまいます

    vectorを引数として使いたいのですがエラーが出てしまいます 以下のようなコードでコンパイルでエラーが出てしまうのですがどうしたら良いでしょうか。 class car{ public: int tire; int engine; } というクラスを作ります。 main関数内で function(car a[]);//関数の宣言 int main(){ std::vector<car> car1(0);//car型のcar1を作成 std::vector<car>::reference car1rf=car1.front(); function(car1rf);//関数に代入 } function(car a[]){ car test; test.tire=1; a.push_back(test); } としてpush_backを外部関数で行いたいのですが、エラーが出てしまいます。 どうしたら良いでしょうか。

  • C++のクラスについて

    /*以下のコメントがある行では何故、コンストラクタ(class2::class2)を指定出来ないのですか? デストラクタ(class2::~class2)の場合も問題なくコンパイルが通り、実行できます (http://codepad.org/1oJkxjyZ の23行目) 開発環境 Windows XP SP3 コンパイラ:GCC 実行結果 class1のコンストラクタ class2のコンストラクタ aiueoの実行 class2のデストラクタ class1のデストラクタ */ #include<iostream> class class1; class class2; class class1{ public: class1(); ~class1(); private: class2*pointer; }; class class2{ public: class2(); ~class2(); void aiueo(); }; class1::class1(){ std::cout<<"class1のコンストラクタ"<<std::endl; pointer=new class2(); pointer->aiueo(); //aiueoを~class2に置き換えてもコンパイル出来るが、class2だとエラーが出る } class1::~class1(){ delete pointer; std::cout<<"class1のデストラクタ"<<std::endl; } class2::class2(){ std::cout<<"class2のコンストラクタ"<<std::endl; } class2::~class2(){ std::cout<<"class2のデストラクタ"<<std::endl; } void class2::aiueo(){ std::cout<<"aiueoの実行"<<std::endl; } int main(){ class1 test1; return 0; }

  • Vectorから一部分を取り出す方法はありますか?

    教えていただきたいのですが、 1つのVectorの中に、いろいろなモノ(例えば、番号、名前、年齢のデータなど) が入っていたとして、そのVectorから番号だけ取り出して表示するなどということはできるでしょうか? /* 番号、名前、年齢を取得するメソッド(Vectorが戻り値)があるとして.... */ Vector vec = new Vector() ; str = number+name+age ; //これがたくさんあるとします vec.add(str) ;//番号と名前と年齢の組み合わせをVectorに格納 return vec ; /* 取りだし */ Vector vec=new Vector() ; vec = getVector() ; //メソッドから値を取りだし for(int i=0;i<vec.size();i++) { System.out.println(vec.elementAt(i)) ; } こんな感じだと、全部表示されてしまいます.... 部分ごとに取り出す方法はないでしょうか?初歩的な質問でごめんなさい、 よろしくお願いします!

    • ベストアンサー
    • Java
  • C++ vectorに配列をプッシュしたい

    C++のstd::vectorが格納する要素として配列を指定することはできますか vectorを使って2次元配列を表現したいときは,たとえば std::vecor<std::vector<int>> v; とすれば2次元配列が表現できますよね. 2次元配列の列方向の要素数が2で固定されていて,行方向の要素数が不確定のデータを扱いたいので,2次元配列を格納するvectorで扱えればなと思いました. (2個で1組のデータがたくさんあるということなので,vectorの2次元配列ではありません) std::vector<int[2]> v; int a[2]; a[1] = 1; a[0] = 2; v.push_back(a); という書き方ではコンパイルできなかったのですが,vectorに配列要素を格納させることはできないのでしょうか. あるいは,もし可能ならどのように書けばよいのでしょうか. 結局は1組のデータセットを構造体化してそれをvectorにプッシュするやり方に落ち着いたのですが,疑問に思ったままモヤモヤしているので質問させて頂きます. 「vector 配列」などのキーワードで検索してみましたが,vectorの動的配列としての紹介記事が多くヒットしてしまい,自分ではうまく情報を発見することはできませんでした. よろしくお願いします.

  • C++でSTLのVectorを使った構造体について

    Vectorで作った構造体配列a内でさらにVectorで宣言された配列bを作った場合、bに数値を代入するにはどうすれば良いのでしょうか? struct A {  std::vector<int> b; }; std::vector<A> a;

  • std::vector 2次元配列の列方向初期長

    std::vectorを使った2次元配列を std::vector< std::vector<int> > a; の様な方法で宣言できるところまでは分かったのですが、aの列の初期長を予め指定する方法はないでしょうか? 例えば、必要な列方向初期長が10であるとします。 行方向のデータ数Nが実行中に与えられる場合 a.resize(N); for (auto &n : a) n.reserve(10); で目的は達せられるのですが、Nが数千万のオーダーだど非常に時間がかかります。 仮にNが2000万個とすると、私のPCでa.resize(N)は約90ミリ秒で完了しますが、for (auto &n : a) n.reserve(10);には約10秒を必要とします。 そこで、aの列の初期長は10(reserve(10)の意味)であると言う何らかの指定を行って a.resize(N)を行った際に、自動的にfor (auto &n : a) n.reserve(10);を行ったのと同じ状態になっているという aの宣言方法があれば教えてください。 aの列方向の初期長(本例の場合は10)は与えますが、.push_back() により10個以上のデータを列方向に詰める場合も想定する為、完全固定長の std::array<> は使用できません。

専門家に質問してみよう