【C++】STL(Standard Template Library)相談室 9at TECH
【C++】STL(Standard Template Library)相談室 9 - 暇つぶし2ch826:デフォルトの名無しさん
08/07/05 23:35:18
こんばんは。g++でtr1::unordered_setを使おうと思ったのですが。
tr1::unordered_set< vector<unsigned char> >とすると
‘struct std::tr1::hash<std::vector<unsigned char, std::allocator<unsigned char> > >’
と怒られてしまいます。これは何が悪いのでしょうか?
(vector用のhash関数を自分で作る必要があるということでしょうか?)

827:デフォルトの名無しさん
08/07/05 23:41:48
すいませんage忘れました。

828:デフォルトの名無しさん
08/07/06 03:22:08
>>826
コードとエラーメッセージをちゃんと貼れ。

829:デフォルトの名無しさん
08/07/08 04:21:23
デバッガとかでさ、変数名長すぎでしょ。
もう嫌だ。

830:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 17:54:23
Line1とLine2の間の
push_backのリサイズ時では何が起こっているのでしょうか

832:デフォルトの名無しさん
08/07/09 18:14:06
capacityが要素を保持するのに足りなければ、メモリの再確保が起きている。

833:デフォルトの名無しさん
08/07/09 18:46:38
ということは、一度破棄していると言うことでしょうか

834:デフォルトの名無しさん
08/07/09 19:57:59
そのクラスAにコピーコンストラクタも書いてみ

835:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 20:58:59
あれ、ちょっと変ですね…3回目のプッシュで考えると
既にpushされているのが2個なので

copy  ←コピーしようとした
ここでサイズが足りないので再確保
copy  ←コピーしようとした
copy  ←前のvectorからコピー
copy  ←前のvectorからコピー
delete ←入れようとした時のテンポラリの破棄?
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
でしょうか、なんだか混乱してきました…。

837:デフォルトの名無しさん
08/07/09 21:23:27
ここでサイズが足りないので再確保
copy  ←前のvectorからコピー
copy  ←前のvectorからコピー
copy  ←前のvectorからコピー
copy  ←新しい要素のコピー
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄

だろ。まぁ新しい要素をどこでコピーするかは実装依存だろうが。
valの値も表示させれば分かるべ。

838:デフォルトの名無しさん
08/07/09 21:43:28
それが4回目のpush_backなら納得できるのですが
3回目のpush_backでcopyが4つ表示されているので混乱しています。

839:デフォルトの名無しさん
08/07/09 21:49:50
iが3だから3回目とか勘違いしてないか?

840:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 22:03:30
copy
----------------------------------0
copy
copy
delete
----------------------------------1
copy
copy
copy
delete
delete
----------------------------------2

うちではこうなった。
VC++2008EE

forループ入る前にvectorになんか入れてない?
size()の値表示させてみ。

843:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/07/09 22:36:38
2005入れてないから2003でやってみたらそうなった。
ソース追ってみると、追加する要素を一旦ローカル変数にコピーしてた。
その変数のコピーと破棄が1回ずつ多いみたい。
2005のソースはわからんが多分同じ理由だろう。

845:デフォルトの名無しさん
08/07/09 22:41:38
なるほど、これで胸のつかえが取れました
付き合ってくれた皆さん、本当にありがとうございました。

846:デフォルトの名無しさん
08/07/09 23:04:39
>>844
>追加する要素を一旦ローカル変数にコピーしてた。

list.push_back( list[3] );


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch