1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ] C++標準ライブラリの一つ、STLについて。 前スレ 【C++】STL(Standard Template Library)相談室 8 pc11.2ch.net/test/read.cgi/tech/1198435319/ 過去ログ・リンク・書籍紹介は >>2 以降
830 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 17:51:42 ] #include <iostream> #include <vector> using namespace std; class A { int val; public: A(){cout<<"new"<<endl;} ~A(){cout<<"delete"<<endl;} void setval(int x){ val = x; } int getval(void){ return val; } }; int main () { A a; vector<A> list; cout <<"------------------------------------ Line1"<< endl; for ( int i=0; i<5; ++i ) { a.setval( i ); list.push_back( a ); } cout <<"------------------------------------ Line2"<< endl; //cout << "size:\t\t" << list.size() << endl; //cout << "list[data,3]:\t" << list[data, 3] << endl; for ( unsigned int i=0; i<list.size(); ++i ) { cout<< list[a,i].getval() << endl; } cout <<"------------------------------------ Line3"<< endl; list.clear(); cout <<"------------------------------------ Line4"<< endl; return 0; }
831 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 17:54:23 ] Line1とLine2の間の push_backのリサイズ時では何が起こっているのでしょうか
832 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:14:06 ] capacityが要素を保持するのに足りなければ、メモリの再確保が起きている。
833 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:46:38 ] ということは、一度破棄していると言うことでしょうか
834 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:57:59 ] そのクラスAにコピーコンストラクタも書いてみ
835 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:48:24 ] A(const A &obj){cout<<"copy"<<endl;} と push_back後に1loopの目安として新しく cout<<"----------------------------------"<<endl; を付け足して走らせてみたところ Line1とLine2の間の"copy"と"delete"の表示が copy がpushした回数+1 deleteがpushした回数 になりました。 copyの回数が+1なのが気になります。 入れる側の参照+listに入っている数と考えそうになりましたが これでサイズを比べて足りないようなら再確保…と考えるのは変よですね copyとdeleteの順番と回数を考えると 前のvectorから入っている分コピーした回数+付け足す側からコピーの一回分 という事でしょうか
836 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:58:59 ] あれ、ちょっと変ですね…3回目のプッシュで考えると 既にpushされているのが2個なので copy ←コピーしようとした ここでサイズが足りないので再確保 copy ←コピーしようとした copy ←前のvectorからコピー copy ←前のvectorからコピー delete ←入れようとした時のテンポラリの破棄? delete ←前のvectorに入ってるのを破棄 delete ←前のvectorに入ってるのを破棄 でしょうか、なんだか混乱してきました…。
837 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:23:27 ] ここでサイズが足りないので再確保 copy ←前のvectorからコピー copy ←前のvectorからコピー copy ←前のvectorからコピー copy ←新しい要素のコピー delete ←前のvectorに入ってるのを破棄 delete ←前のvectorに入ってるのを破棄 delete ←前のvectorに入ってるのを破棄 だろ。まぁ新しい要素をどこでコピーするかは実装依存だろうが。 valの値も表示させれば分かるべ。
838 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:43:28 ] それが4回目のpush_backなら納得できるのですが 3回目のpush_backでcopyが4つ表示されているので混乱しています。
839 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:49:50 ] iが3だから3回目とか勘違いしてないか?
840 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:54:59 ] 略 copy copy delete -----------0 copy copy copy delete delete delete -----------1 copy copy copy copy delete delete delete -----------2 略 こう表示されています 環境は VC++2005EE +SDK win2000 です
841 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:56:29 ] class A { int val; public: A(){val=0,cout<<"new"<<endl;} A(const A &obj){cout<<"copy"<<endl;} ~A(){cout<<"delete"<<endl;} void setval(int x){ this->val = x; } int getval(void){ return val; } }; 略 cout <<"------------------------------------ Line1"<< endl; for ( int i=0; i<5; ++i ) { a.setval( i ); list.push_back( a ); cout<<"----------------------------------"<< i <<endl; } cout <<"------------------------------------ Line2"<< endl; 略 ソースはこうなってます
842 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:03:30 ] copy ----------------------------------0 copy copy delete ----------------------------------1 copy copy copy delete delete ----------------------------------2 うちではこうなった。 VC++2008EE forループ入る前にvectorになんか入れてない? size()の値表示させてみ。
843 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:06:00 ] これが全文です。 #include <iostream> #include <vector> using namespace std; class A { int val; public: A(){val=0,cout<<"new"<<endl;} A(const A &obj){cout<<"copy"<<endl;} ~A(){cout<<"delete"<<endl;} void setval(int x){ this->val = x; } int getval(void){ return val; } }; int main (){ A a; vector<A> list; cout <<"------------------------------------ Line1"<< endl; for ( int i=0; i<5; ++i ){ a.setval( i ); list.push_back( a ); cout<<"----------------------------------"<< i <<endl; } cout <<"------------------------------------ Line2"<< endl; for ( unsigned int i=0; i<list.size(); ++i ) { cout<< list[a,i].getval() << endl; } cout <<"------------------------------------ Line3"<< endl; list.clear(); cout <<"------------------------------------ Line4"<< endl; return 0; }
844 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:36:38 ] 2005入れてないから2003でやってみたらそうなった。 ソース追ってみると、追加する要素を一旦ローカル変数にコピーしてた。 その変数のコピーと破棄が1回ずつ多いみたい。 2005のソースはわからんが多分同じ理由だろう。
845 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:41:38 ] なるほど、これで胸のつかえが取れました 付き合ってくれた皆さん、本当にありがとうございました。
846 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:04:39 ] >>844 >追加する要素を一旦ローカル変数にコピーしてた。 list.push_back( list[3] );