2016-06-19 9 views
0

ヒープ内にベクターがありますが、その要素を取得できません - コンパイルされません - nエラー 'をバインドできません' std :: basic ostream 'スタックベクトルと単純配列は正常に動作します。ここで何が間違っていますか?ヒープ上のベクトルにアクセスできない

#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 

    vector<int> * factors= new vector<int>(4); 
    cout<<factors<<endl; 
    cout<<(factors+1)<<endl; 
    //cout<<factors[1]<<endl; 

    factors->push_back(12); 
    factors->push_back(232); 
    factors->push_back(54); 
    factors->push_back(42); 

    //cout<<*factors; //error - cannot bind 'std::ostream..' lvalue to 'std::basic_ostream...' 
    // cout<<factors[0]; // error 

     //vector in stack 
    vector<int> factors3(4); 
    factors3.push_back(43); 
    factors3.push_back(543); 
    factors3.push_back(64); 
    factors3.push_back(26); 
    cout<<"factors3 "<<factors3[3]<<endl; //gives "0" 
    cout<<"factors3 "<<factors3.at(3)<<endl; //gives "0" 

    int * factors2=new int[10]; 
    factors2[0]=32; 
    factors2[1]=35; 
    factors2[2]=676; 
    factors2[3]=123; 
    cout<<factors2[0]<<endl; //it's OK 
    cout<<factors2[1]<<endl; 
    cout<<*factors2<<endl; 

    cout << "Done" << endl; 
    return 0; 
} 

答えて

3

とベクトルのは、コンパイルエラーを引き起こしている行を見てみましょうになってしまいますので。まず、この1:

cout << *factors << endl; 

はここで、factorsvector<int>*ので、*factorsvector<int>です。したがって、このコードはvector<int>をストリームに挿入しようとします。あなたは(それが過負荷に<<オペレータが付属していません)C++でvector<int>を表示する<<演算子を使用することはできませんので、あなたがここに取得しているコンパイラエラーは、私はあなたが出力に<<を使用しようとしていることがわかり、」意味しますa vectorしかし、私はそれを行う方法を知らない。

あなたは、その後、正常に動作する

理由コード

cout << *factors2 << endl; 
を不思議に思うかもしれません。その場合には、 factors2はそう *factors2を書き込むことによって factors2デリファレンスあなたは、あなたが実際にプリントアウトすることができ、実際の正直ツー良整数を、バック取得しているとき、 int*です。その生の配列と、この点で異なっ vectorの仕事に注目してください - vectorへのポインタが ない間にC++での、配列へのポインタは、ちょうどので、彼らは最初の要素へのポインタを生成する逆参照、配列の最初の要素へのポインタでありますは、最初の要素へのポインタと同じです。

cout << factors[0] << endl; 

書き込みが動作しない理由を

これも説明しています。覚えておいてください - factorsvectorへのポインタであり、vectorは配列ではありません。 factors[0]を書くことは、「私にvectorの最初の要素を与えるものではありませfactorsが指し示す。それはあなたが何をしたいなら、あなたは

cout << (*factors)[0] << endl; 
を書くことができる「配列の最初の vectorは、 factorsが指す私を与える」という意味します

これは「factorsを参照解除して実際のvectorを取り戻し、その0番目の要素を調べます」

2番目の質問として、なぜベクターに追加した番号が表示されないのですか? - あなたがここに

vector<int> factors3(4); // <--- Notice the 4 

(4)を書き込むことによってベクトルを宣言した通知が意味「私にゼロであるすべてが4つのint Sを、持っているように初期化vectorを与えます。」 push_backを使用すると、既存の要素を置き換えるのではなく、新しい要素をvectorに追加します。あなたは直接、ベクトル要素に書き込むことによって、このいずれかを修正することができます。

vector<int> factors3(4); 
factors3[0] = 43; 
factors3[1] = 543; 
factors3[2] = 64; 
factors3[3] = 26; 

またはfactors3のためにサイズを指定しないことによって:

vector<int> factors3; // <--- No 4! 
factors3.push_back(43); 
factors3.push_back(543); 
factors3.push_back(64); 
factors3.push_back(26); 

か、あなたは近代的なコンパイラを持っている場合は、同様にベクトルを初期化することにより、この:どちらかの言葉で

vector<int> factors3 = {43, 545, 64, 26}; 

、あなたは混合および2つの異なるアプローチ一致している - 個別に働くだろう、それぞれが - しかし、一緒にヨーヨー何をしないものをあなたは彼らに期待しています。

  • あなたは配列へのポインタデリファレンス最初の要素へのポインタを取得することができますが、これは、ベクトルへのポインタでは動作しません:

    を要約します。
  • ベクトルをデフォルトサイズに設定してからpush_backを使用することに注意してください。間違いがあります。
+0

ありがとうございます。それは今非常に明確です。しかし、もしintのベクトルのベクトルを持っていたらどうなりますか? 'ベクトル< vector> *ポインタ=新しいベクトル< vector>()'?ポインタが外部ベクトルを指し示すならば、外部参照を取得し、intを得るには '(* pointer)[0] [0]'が必要ですか?または、それが ''ベクトル<> *> * pointer2'の場合、intは '(*(* pointer2)[0]'ですか? – parsecer

+0

疑問に思ったら、タイプを見てください! 'pointer2'が'ベクトル> * 'の場合、' * pointer2'は 'ベクトル>'です。角かっこを使用してベクトルから何かを選択すると、基礎となる型の何かが返されます。つまり '(* pointer2)[a]'は 'ベクトル'なので、 '(* pointer2)[a] [b]'は 'int'になります。このアプローチを使うと、 'vector *> *'ならば、あなたは 'pointer2'から何かを選ぶでしょうか? – templatetypedef

3
cout<<(factors+1)<<endl; 
//cout<<factors[1]<<endl; 

次のようになります。

cout << (*factors)[1] << endl; 

vector<int> factors3(4); 
factors3.push_back(43); 
factors3.push_back(543); 
factors3.push_back(64); 
factors3.push_back(26); 
cout<<"factors3 "<<factors3[3]<<endl; //gives "0" 
cout<<"factors3 "<<factors3.at(3)<<endl; //gives "0" 

あなたは4 ELEを持つベクトルを作成しているのでその後メントと4以上をプッシュする、あなたは要素0, 0, 0, 0, 43, 543, 64, 26

+0

ありがとうございました。単純な配列のヒープで配列の名前を '*'演算なしで角括弧で使うことができ、ベクトルの名前はできないのはなぜですか? – parsecer

+2

ベクトルは配列ではなく、ポインタにはベクトルが含まれているため、ベクトルの配列ではありません。彼らがどのように動作するかの詳細を理解するには 'pointer arithmetic'と' operator [] 'を読んでください。 – tkausl

関連する問題