【C++】STL(Standard ..
792:デフォルトの名無しさん
08/06/28 15:21:29
>>791
ありがとう、だけどファイル以外のストリームに対しても同じ方法がとりたいとおもっているので、
algorithmのcopy、あるいはSTLの何かを使って解決したいのです。
で、思いついたのが790のコードなのです。
793:デフォルトの名無しさん
08/06/28 17:36:54
>>792
>791 はファイル以外のストリームにも使えるんじゃないか?
seekg() ができないかもしれないってこと?
794:デフォルトの名無しさん
08/06/28 17:41:54
そういや copy_n() ほしいな。
795:デフォルトの名無しさん
08/06/28 20:43:54
どうでもいいけどistream_iterator<char>使うな
istreambuf_iterator<char>使え
istream_iterator<char>はoperator>>で入力するから、空白とか
スキップする。コピーにならんぞ
796:デフォルトの名無しさん
08/06/28 20:57:41
どうでもいい割には念を押すね。
797:デフォルトの名無しさん
08/06/28 21:09:48
>>795
それ「どうでもいい」事じゃないと思うw
798:デフォルトの名無しさん
08/06/29 22:25:50
あげあしはどうでもいいよ。
799:デフォルトの名無しさん
08/06/30 00:24:58
揚げ足取り、って言いたかったのかな。
800:デフォルトの名無しさん
08/06/30 00:30:10
手羽先、って言いたかったんたと思うよ
801:デフォルトの名無しさん
08/06/30 01:44:47
コケコッコーーー!!!
802:デフォルトの名無しさん
08/06/30 08:15:27
お前ら鳥類食ってて何も恥じらいはないのかよ。
哺乳類としてのプライドはどこへ
803:デフォルトの名無しさん
08/06/30 08:54:17
意味不明
804:デフォルトの名無しさん
08/06/30 09:01:33
つーか、ヘビとかトカゲとか、哺乳類を食うのは許せないよな。
やつら爬虫類が生まれた頃にはまだ哺乳類も鳥類も居なかったってのに。
赤外線センサーまでつけやがって。
805:デフォルトの名無しさん
08/06/30 16:22:47
面白いと思って書いてるのかな
806:デフォルトの名無しさん
08/06/30 18:24:07
鳥類爬虫類は許せるが
鯨だけは愛と権利が与えられるべきだと思います
STL
807:デフォルトの名無しさん
08/06/30 18:27:03
何故か日本より沢山偶然鯨が掛かる隣の国には抗議しません
808:デフォルトの名無しさん
08/06/30 19:09:10
何でこんな流れに
809:デフォルトの名無しさん
08/07/01 21:42:20
みんな鳥類食ってて何も恥じらいもないからだと思う
810:デフォルトの名無しさん
08/07/01 21:49:13
牛食うのは禁止すべきだろ。
811:デフォルトの名無しさん
08/07/01 23:20:25
人食いてぇ
812:デフォルトの名無しさん
08/07/02 02:02:12
通報しますた
813:デフォルトの名無しさん
08/07/02 02:11:21
考え方を変えるんだ
そこにシニカルなアーティクルか精神的原論を見出せるかどうかを試してから通報すべきだ
日本は民主主義社会だっていってたよ確か誰かが
毎日と朝日の新聞見ながら泡噴きながら
人食いてぇ=女の子監禁してぇ
人(で)食いてぇ=女の子換金してぇ
人=幼女
人=稚児
人=人
通報しますた
814:デフォルトの名無しさん
08/07/02 07:41:04
お前らSTLの話しろよ。
鳥類とか哺乳類とか人間とかあんまり関係ないだろ。
815:デフォルトの名無しさん
08/07/02 09:19:26
>>813
通報されないように気を付けて。
ところで、map<int,bar*> mに挿入する時、
m.insert(map<int,foo*>::value_type(0, new foo))とか
m[0]=new fooとか
するのはヤバいよね。
スマポ使えない状況でどう書くのが一番スマートですか?
816:デフォルトの名無しさん
08/07/02 10:17:56
foo* p = new foo;
try
{
m.insert(map<int,foo*>::value_type(0, p));
// m[0] = p;
}
catch(...)
{
delete p;
throw;
}
817:デフォルトの名無しさん
08/07/02 10:19:22
まずmap<int,bar*>のbar*を、直接 opertaor =(bar *ptr) 出来ないようなクラスに置き換える。
・map<int, test<bar> >
後はしらね。勝手に適当にメソッドでnewが隠蔽されるようなものでも書けば良いと思うよ。
818:デフォルトの名無しさん
08/07/02 11:20:34
>>812
たった今>>811に食われたじゃないか
819:デフォルトの名無しさん
08/07/02 11:56:46
foo* p = new foo();
if (!map.insert(std::make_pair(0, p)).second) {
delete p;
p = 0;
}
820:デフォルトの名無しさん
08/07/02 12:03:46
p = repinterpret_cast<void*>(0);
821:デフォルトの名無しさん
08/07/02 12:18:09
>>819
insertで例外起きたらメモリリークするでよ
822:デフォルトの名無しさん
08/07/02 13:35:58
>>816
それだと m[0] に既存のポインタが入っていた場合にリークする。
↓これでいいかな?
foo* p = new foo;
try
{
&nbps; foo*& in = m[n];
&nbps; delete in;
&nbps; in = p;
}
catch (...)
{
&nbps; delete p;
&nbps; throw;
}
「スマポ使えない」と言ってもさすがに auto_ptr は使えるだろうから、
↓こっちのがいいと思う。
std::auto_ptr<foo> p(new foo);
foo*& in = m[n];
delete in;
in = p.release();
823:822
08/07/02 13:37:02
うわ。 nbsp ミスった。最初のコード訂正。
foo* p = new foo;
try
{
foo*& in = m[n];
delete in;
in = p;
}
catch (...)
{
delete p;
throw;
}
824:デフォルトの名無しさん
08/07/02 20:34:55
foo * p = new foo;
try {
std::swap(p, m[0]);
delete p;
}
catch(...) {
delete p;
throw;
}
825:デフォルトの名無しさん
08/07/03 01:52:19
関数内クラスでauto_ptrもどきを自作すればいいんじゃね?
簡単に
pair<map<int,bar*>::iterator, bool> ib(map.insert(std::make_pair(0, 0)));
if (ib.second)
ib.first.second = new foo;
でも良い気がするけど。
826:デフォルトの名無しさん
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
4978日前に更新/192 KB
担当:undef