none
p=new vector<double>のpの数値を得たい(表示させたい)。方法を知りたい。 RRS feed

  • 質問

  • お教えください。 
     p=new vector<double>を使用した文を作りました。
    しかし、コンパイルエラー(c2679)が生じ、p[i]の数値を表示出来ません。
    つきましては、数値を出力/表示させる方法をお教えください。


    error code c2679を見ても見当がつきません。  
    類似の配列のnewでは、数値を得る事が出来ます。
    なお、delete文を消したDebugのローカル変数のpには、数値が存在します。

    また、OS;VISTA 64bit版、soft;VS2008のwin32です。

    以下が作成したコードです。左程急いでいません。

    #include <fstream>
    #include <vector>
    using namespace std;

    int main()
    {
      double *p0;
      p0 = new double [5]; 
      for(int i=0; i<5; i++) p0[i]=2.0+0.1*i;  
      ofstream cout0("out0.csv",ios::out |ios::binary );
      for(int i=0; i<5; i++)  cout0<< &p0[i]<<endl;
      for(int i=0; i<5; i++)  cout0<< p0[i]<<endl;// 数値
      cout0.close();
      delete [] p0; // 配列全体を削除する

      vector<double>data0(5,1.15);
      vector<double>*p1;
      p1= new vector<double>;
      *p1=data0;

      ofstream cout1("out1.csv",ios::out |ios::binary );
      for(int i=0; i<5; i++)  cout1 <<&p1[i] <<endl;
     // for(int i=0; i<5; i++)  cout1 <<p1[i] <<endl; //p1のdoubleの数値を得たいが、error C2679コードが生じる。
      cout1.close();
      delete p1;

      return 0;
    }
    // error C2679: 二項演算子 '<<' : 型 'std::vector<_Ty>' の右オペランドを扱う演算子が見つかりません


    中高年生
    2009年9月12日 20:26

回答

  • 変数data0はvectorなので data0[0] のようにアクセスできます。
    質問にある変数p1はvectorへのポインタなので同じ記述にはなりません。 (*p1)[0] のようにアクセスします。

    余談ですがC++ではdeleteを忘れやすいのでなるべくならnewしないことをお勧めします。
    例えば前半部分ならVS2008 SP1以降であれば
    #include <array>
    {
      std::tr1::array<double,5> p0;
      for(int i=0; i<5; i++) ...
      ...
      cout0.close();
    }
    とできます。VS2008 SPなしの場合、arrayクラスがないので多少冗長ですがvectorで代用するとか。
    • 回答としてマーク 中高年生 2009年9月15日 0:37
    2009年9月12日 23:07
  • ちなみにですが、「二項演算子 '<<' : 型 'std::vector<_Ty>' の右オペランドを扱う演算子が見つかりません」というのは、
    そのままの意味です。

    vector<double>data0(5,1.15);

    cout1 << data0[i]とした時にoperator<<がストリームに書き出しているのは、doubleの値であって
    vectorそのものを書き出しているわけではありませんよね。
    doubleに関しては、operator<<の定義があるので出力できますが、
    std::vector<_Ty>に関しては、operator<<の定義がないから処理できないと言っているわけです。

    cout1 <<p1[i] <<endl;で書きだそうとしている物がvector自身になってしまっているという内容に関しては、
    佐裕理さんの書かれているとおりです。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク 中高年生 2009年9月15日 0:49
    2009年9月13日 7:37

すべての返信

  • 変数data0はvectorなので data0[0] のようにアクセスできます。
    質問にある変数p1はvectorへのポインタなので同じ記述にはなりません。 (*p1)[0] のようにアクセスします。

    余談ですがC++ではdeleteを忘れやすいのでなるべくならnewしないことをお勧めします。
    例えば前半部分ならVS2008 SP1以降であれば
    #include <array>
    {
      std::tr1::array<double,5> p0;
      for(int i=0; i<5; i++) ...
      ...
      cout0.close();
    }
    とできます。VS2008 SPなしの場合、arrayクラスがないので多少冗長ですがvectorで代用するとか。
    • 回答としてマーク 中高年生 2009年9月15日 0:37
    2009年9月12日 23:07
  • ちなみにですが、「二項演算子 '<<' : 型 'std::vector<_Ty>' の右オペランドを扱う演算子が見つかりません」というのは、
    そのままの意味です。

    vector<double>data0(5,1.15);

    cout1 << data0[i]とした時にoperator<<がストリームに書き出しているのは、doubleの値であって
    vectorそのものを書き出しているわけではありませんよね。
    doubleに関しては、operator<<の定義があるので出力できますが、
    std::vector<_Ty>に関しては、operator<<の定義がないから処理できないと言っているわけです。

    cout1 <<p1[i] <<endl;で書きだそうとしている物がvector自身になってしまっているという内容に関しては、
    佐裕理さんの書かれているとおりです。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク 中高年生 2009年9月15日 0:49
    2009年9月13日 7:37
  • 佐裕理 様
     ありがとうございます。
     vectorのポインタに対する記述法のご教授ありがとうございます。

     また、arrayの存在を知りました。ありがとうございます。
     
      なお、このフォーラムの返信等の手法がよくわからない所があります。
     返信について、ご無礼がありましたらご容赦ください。

       以上 中高年生



     


    中高年生
    2009年9月15日 0:44
  • PATIO 様
     ありがとうございます。
     vectorのoperatorの定義のご教授ありがとうございます。

     なお、フォーラムの返信方法についてよくしりませんので、
     ご無礼があれば、ご容赦くださるようにお願いいたします。

      以上 中高年生
    中高年生
    2009年9月15日 0:55