• ベストアンサー

Vector ClassのVector配列

Tacosanの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「エラーになる」というのは, 具体的には ・どのコンパイラで ・どのようなメッセージが出る のですか?

scanfprintf
質問者

お礼

ご回答ありがとうございます。 開発環境は、VC++2010です。 エラーは、 Expression: vector iterator not dereferencable For information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts. というエラーでした。 No1の方のご回答いただいたとおり、他の方では再現ないので、 ネスト自体は関係なさそうですね。

関連するQ&A

  • STLのvectorの削除

    STLのvectorの削除を行う場合に vector<myclass> v; ・・・ v.erase(it); ・・・ というように削除するiteratorを渡しますが、 任意のインデックスのvectorを削除した場合は、 どのようにそのiteratorを取得するのでしょうか。 例えばv[5]を削除したのですが、 vector<myclass>::iterator it=v.begin(); for(int i=0;i<5;i++) it++; v.erase(it); というbegin()やend()からのインクリメント・デクリメントで取得するしかないのでしょうか? ご教示願います。

  • C++ vectorのbeginについて

    VC++2010にて下記コードのビルドは通るのですが、 vVecotrInt, vVectorIntPtrの要素数0のとき、iptr代入時に Debug assertaion Failed! vector iterator not dereferencableとなります。 そもそもbegin()はイテレータなので、ポインタに代入しようとしていることが間違いかと思うのですが。 質問1.int* iptr = ~ ではなく、std:vector<int>::iteratorとすれば、     要素数が0でもエラーがおきません。この違いは何でしょうか? 質問2.そもそもイテレータをポインタに代入して何か得することがあるんでしょうか?     ただイテレータとポインタは同じようなものだと思って、コーディングしてるだけなんでしょうか・・・ コード: // vVectorIntの要素を間接参照して(参照先はint)、そのアドレスをポインタに格納 std::vector<int> vVectorInt; int* iptr = &*vVectorInt.begin(); // ここでvector iterator not dereferencable // vVectorIntPtrの要素を間接参照して(参照先はint*)、ポインタに格納 std::vector<int*> vVectorIntPtr; int* iptr = *vVectorIntPtr.begin(); // ここでvector iterator not dereferencable // vVecotrIntPtr2の要素数0のときでも、イテレータを使えば問題ない std::vector<int*> vVectorIntPtr2; std::vector<int*>::iterator itr = vVectorIntPtr2.begin();

  • STLのvectorの削除

    たびたび申し訳ありませんが、ご教示願います。 vector配列をeraseを使用して削除しているのですが、 どうしてもうまくいかず躓いています。 仮にvectorのサイズが3で1番目の要素を削除したいのですが、 どうしても、サイズに関わらず最後の要素が削除されてしまいます。 下記のコードのように簡略化しましたが、結果は変わりませんでした。 vector<class>obj; vector<class>::iterator it; ・・・ it=obj.begin(); it=obj.erase(it); 結果は最後の要素(サイズが3であれば3番目の要素)が削除されます。 erase時点でのitは削除したい要素をさしているのは確認済みです。 eraseの戻り値も削除したい要素を指してしまっています・・・・ なぜ最後の要素が削除されてしまうのでしょうか。 全く分かりません。よろしくお願いします。

  • ベクターの初歩について

    ベクターについて勉強し始めた所です。ベクターについて解らない事があるので教えて下さい。 今ベクターに10個数字を登録します。 後で3か5があれば取り除きます。 #include <vector> #include <iostream> int main(){   using namespace std;   vector<int> array1;   for( int i = 0; i < 10; ++i )     array1.push_back( i );   vector<int>::iterator it;   for(it = array1.begin(); it != array1.end(); ){     if(*it == 3 || *it==5)       it = array1.erase(it);     else       ++it;   }   for( it = array1.begin(); it != array1.end(); ++it )     cout << *it << endl;   return 0; } 一応出来たんですが、これが構造体だったらどうしたらいいのでしょう? typedef struct{   int x,y; }xy_t; vector<xy_t> array1; だとして、最初にx,yのそれぞれ10個に適当な値を入れておき、xが3か5ならそれを削除するにはどうしたらいいのでしょうか。 また、一つずつ削除する方法と、remove関数で出来そうな気がするので、もし一括で出来る方法があればそちらも2種類お願いします。 (構造体を用いたベクターの使い方が書いてある参考サイトでも結構です) XP Pro VS2005Pro よろしくお願いします。

  • Vectorのポインタが入ったvector

    windows Vista sp1, Visual C++ 2008でC++の勉強をしています。 Vectorへのポインタが入ったvectorを使うプログラムを書いているのですがうまくいかず、困っています。 どういうプログラムかというと、 入力ファイルの">"という記号を区切りとして、その間にある各行をひとまとめのグループとしてvectorにいれます。 さらに各vectorのポインタをべつのvectorに入れます。 最終的に区切りの数だけvectorができ、入力ファイルを読み終わった後に すべてのvectorを"各グループのポインタが入ったvector"からループ処理ですべて出力する、というものです。 /入力ファイル input.txt/ > human cat dog > beetle dragonfly spider > salmon saury catfish > vector1には human cat dog vector2にはbeetle dragonfly spider vector3にはsalmon saury catfish が入り、 別のvectorにそれぞれのvectorのポインタをいれ、 最後にこのvectorをつかって全ファイル内容を出力するというものです。 具体的に書くと、 ">"の区切りごとの各行のstringを入れるvectorとしてeach_vector。 each_vectorのポインタを入れるvectorをvector_of_ptr_each_vectorとします。 ">"を認識するごとに new で each_vectorの領域を確保し、そのポインタをvector_of_ptr_each_vectorに追加していき、">"のない行のstringを each_vectorに入れます。 ファイルの読み込みが終わった後でvector_of_ptr_each_vectorからイテレータを使って各vector(each_vector)の全要素をそれぞれ出力する、というものです。 以下のようにコードを書きました。 #include <fstream> #include <string> #include <vector> #include <iostream> using namespace std; int main( ) { ifstream ifs("input.txt"); string buf; std::vector<string> each_vector; std::vector<std::vector<string> *> vector_of_ptr_each_vector; while(ifs && getline(ifs, buf)) { if(buf[0] == '>'){ std::vector<string>* ptr_eachvector ; ptr_eachvector = new std::vector<string>; each_vector = *ptr_eachvector ; vector_of_ptr_each_vector.push_back(ptr_eachvector) ; } each_vector.push_back(buf) ; } printf("\n output from vector of ptr of vector\n"); std::vector<std::vector<string> *>::iterator it_b = vector_of_ptr_each_vector.begin(); while( it_b != vector_of_ptr_each_vector.end() ) { std::vector<string>::iterator it_c = it_b->begin();    //エラー1 while( it_c != it_b->end() ) //エラー2 { cout << *it_c << endl; ++it_c; } ++it_b; } return 0; } ですが、エラーでビルドされず、 std::vector<string>::iterator it_c = it_b->begin(); の行に関して error C2839: invalid return type 'std::vector<_Ty> **' for overloaded 'operator ->' error C2039: 'begin' : is not a member of 'std::_Vector_iterator<_Ty,_Alloc>' while( it_c != it_b->end() )   の行に関して error C2839: invalid return type 'std::vector<_Ty> **' for overloaded 'operator ->' 1> with 1> [ 1> _Ty=std::string 1> ] error C2039: 'end' : is not a member of 'std::_Vector_iterator<_Ty,_Alloc>' 1> with 1> [ 1> _Ty=std::vector<std::string> , 1> _Alloc=std::allocator<std::vector<std::string> > 1> ] fatal error C1903: unable to recover from previous error(s); stopping compilation というようなエラーが出ます。 vectorのポインタを入れたvectorの扱い、特にイテレータに関して問題があると思うのですが原因が分かりません。 また、new でのeach_vectorの領域確保の方法も怪しいという感じがします。 解決策、アドバイスありましたらよろしくお願いします。

  • C++のvectorについて教えてください。

    C++のvectorについて教えてください。 現在悩んでいる問題について簡単に説明するために、テストコードを書きました。 #include <vector> class IntType { private: int num; public: IntType( int n ):num( n ){}; }; std::vector< IntType > IntVector; void main() { } このコードをDebug版でコンパイルすると 1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(285) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'const size_t' から減少できませんでした 1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2236) : 'std::operator <' の宣言を確認してください。 のようなエラーが出ます。 しかし、Release版でコンパイルするとコンパイルは通ります。 Debug版でコンパイルを通すにはどのようなコードを追加すればよいでしょうか? 知恵を貸してください。 よろしくおねがいします。 /** VisualStudio2008 AcademiEdition */

  • C言語の配列をC++のvectorに高速に変換したい

    質問は表題のとおりです。 単純な方法では以下の通りになると思いますが、 (C言語文字列から string への変換のように) 一括変換の仕組みは vector にないのでしょうか? static const int n=5; int a[n]={0,1,2,3,4}; std::vector<int> v(n); std::vector<int>::iterator vit=v.begin(); for(int i=0; i<n; i++){ *vit++ = a[i]; } 上記の例では n=5 ですが、nがとても大きな場合に適用したいと考えています。 ちなみに、gcc 3.4.3 を使っています。

  • classの中の配列の初期化

    以下のようにclassの中で定義されている配列xを、 x[0]=x0,x[1]=x1,x[2]=x2 となるように初期化するコントラクタを作成したいのですが、 int test[3]={1,2,3}; vector<int> x(1,4,1);//--------1 vector<int> y(test);//---------2 1の場合でも2の場合でもエラーがでます。 どの様にすればいいのでしょうか? template<class TT> class vector{ private:  TT x[3]; public:  vector(TT* vv):x[0](vv[0]),x[1](vv[1]),x[2](vv[2]){}  vector(TT x0,TT x1,TT x2):x[0](x0),x[1](x1),x[2](x2){} };

  • STLのvectorで・・・

    4次元配列を使いたいので以下のようなプログラムを組んでみました。 -------------------------------------------------- #pragma warning( disable : 4786 ) #include <vector> #include <iostream> using namespace std; void EditYMatrix(vector< vector< vector<int> > > *vi, int i); void EditSquareMatrix(vector< vector<int> > *vi, int i); int main(int argc, char* argv[]) { int i, j, c; vector< vector< vector< vector<int> > > > vi; cout << "Xの要素数を入力してください" << endl; cin >> c; vi.resize(c); cout << "Yの要素数を入力してください" << endl; cin >> c; for(i=0 ; i<vi.size() ; i++) EditYMatrix(&vi[i], c); cout << "Zとωの入力" << endl; for(i=0; i<vi.size() ; i++){ for(j=0; j<vi[i].size() ; j++){ cout << i << "," << j << "番目の自由度を入力してください" << endl; cin >> c; EditSquareMatrix(&vi[i][j], c); } } return 0; } void EditYMatrix(vector< vector< vector<int> > > *vi, int i) { vi->resize(i); } void EditSquareMatrix(vector< vector<int> > *vi, int i) { vi->resize(i); for(int j=0; j<i ; j++) vi[j].resize(i); } -------------------------------------------------- Y,Z,ωは可変で、Zとωは同じにするので、 ためしにこのようなプログラムを組んでみました。 ですが、実行途中でエラーが起きてしまいます。 /* verify block type */ _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); という部分でエラーが起きているのですが 知識不足で、どのような内容なのかわかりません。 どなたか分かる方教えてください。 OS:Win2000 VC++6.0

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

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