2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【C++】STL(Standard Template Library)相談室 6

1 :デフォルトの名無しさん:2006/10/14(土) 19:20:40
入門ページなど
・STLとは
ttp://e-words.jp/w/STL.html;
・入門
ttp://www.jah.ne.jp/~naoyuki/Writings/STL.html
・入門,一覧,使い方
ttp://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
ttp://www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
ttp://www.s34.co.jp/cpptechdoc/reference/stl_samples/
・TIPS集
ttp://www.nantekotta.com/stl.html
・メルマガ(お勧め)
ttp://www.kab-studio.biz/Programing/STLiostream/
・解説
ttp://ja.wikipedia.org/wiki/Standard_Template_Library
ttp://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html

マルチスレッドプログラミングの時には
ttp://www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html

STLPort
http://www.sgi.com/tech/stl/
http://www.stlport.org/

STLに関する話題は『ここ』で
C++に関する話題は『C++相談室』
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
でよろしくお願いします

2 :デフォルトの名無しさん:2006/10/14(土) 19:23:15
とりあえず貼っとく。

http://pc8.2ch.net/test/read.cgi/tech/1104898734/562

562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。

このスレが不要である事に疑いの余地は無い。

3 :デフォルトの名無しさん:2006/10/14(土) 19:28:17
とりあえずこちら使いきってから
http://pc8.2ch.net/test/read.cgi/tech/1104092624/


4 :デフォルトの名無しさん:2006/10/14(土) 19:29:47
・和書の紹介
STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
ttp://www.amazon.co.jp/gp/product/4881357786/sr=8-13/qid=1160821482/ref=sr_1_13/503-1115923-0965566?ie=UTF8&s=books
STL―標準テンプレートライブラリによるC++プログラミング 第2版
ttp://www.amazon.co.jp/gp/product/4894714329/sr=8-19/qid=1160821482/ref=sr_1_19/503-1115923-0965566?ie=UTF8&s=books
標準C++:STLの基礎知識
http://www.amazon.co.jp/gp/product/4756138047/sr=8-29/qid=1160821588/ref=sr_1_29/503-1115923-0965566?ie=UTF8&s=books
標準講座C++―基礎からSTLを利用したプログラミングまで
http://www.amazon.co.jp/gp/product/4881357050/sr=8-35/qid=1160821588/ref=sr_1_35/503-1115923-0965566?ie=UTF8&s=books
STLによるコンポーネントデザイン
http://www.amazon.co.jp/gp/product/475613422X/sr=8-40/qid=1160821650/ref=sr_1_40/503-1115923-0965566?ie=UTF8&s=books
Effective STL―STLを効果的に使いこなす50の鉄則
http://www.amazon.co.jp/gp/product/4894714108/sr=8-3/qid=1160821680/ref=sr_1_3/503-1115923-0965566?ie=UTF8&s=books

5 :デフォルトの名無しさん:2006/10/14(土) 22:27:05
>>1


6 :デフォルトの名無しさん:2006/10/15(日) 17:04:15
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3 
http://pc8.2ch.net/test/read.cgi/tech/1116559700/ 
【C++】STL(Standard Template Library)相談室 2 
http://pc8.2ch.net/test/read.cgi/tech/1104898734/ 
【C++】STL(Standard Template Library)相談室 
http://pc5.2ch.net/test/read.cgi/tech/1095583235/ 


7 :デフォルトの名無しさん:2006/10/16(月) 02:27:40
質問。
連想コンテナへのinsert(i, j) (iとjは入力反復子)って、
例外安全性は強い保証?それとも基本?
規格を眺めたが言及が見つからず…


8 :デフォルトの名無しさん:2006/10/16(月) 05:12:29
STLのスタックはC#のスタックに比べて10倍遅い。
C++はメモリのアロケートが貧弱な気がする。

9 :デフォルトの名無しさん:2006/10/16(月) 06:34:32
>>8
どんなテストをしたの?


10 :デフォルトの名無しさん:2006/10/16(月) 06:49:26
>7
規格とDR読み通したけれどこれは単に抜けてるだけのような

11 :デフォルトの名無しさん:2006/10/16(月) 09:49:53
規格で例外安全性に関する規定ってあったっけ?
無いと困るような気はするんだが、ちょっと見当たらない。

12 :デフォルトの名無しさん:2006/10/16(月) 16:59:09
>>11
あちこちに散りばめられている。(個々の関数の解説にあったり、先頭で一斉に指定されていたり)

>>8
本当にありケーとが駄目というのが原因なら、アロケータを差し替えてみるとどうだろう?

13 :8:2006/10/16(月) 18:48:40
>>9
普通にforループでpushしていくだけのもの。

>>12
STLportに変えてみたら同じぐらいの速さが出た。
VC8標準のやつが遅かっただけみたい。

14 :8:2006/10/16(月) 18:57:27
stackのpushよりもvectorのpush_backの方が速いとは……

15 :デフォルトの名無しさん:2006/10/16(月) 19:05:33
>>14
特に指定しないと、stackはdequeを使って実装される。
ttp://www.wakhok.ac.jp/~sumi/stl/header/stack.html

16 :デフォルトの名無しさん:2006/10/16(月) 19:05:38
stack はキューだかリストだか使っているからだろう。

17 :デフォルトの名無しさん:2006/10/16(月) 19:42:42
>>13
テストしたコード晒してよ。

18 :デフォルトの名無しさん:2006/10/16(月) 20:03:37
>>17
何粘着してんだ?

19 :デフォルトの名無しさん:2006/10/16(月) 20:13:37
速度比較してソース貼らずに結果だけを主張するのはおかしいだろ。

20 :デフォルトの名無しさん:2006/10/16(月) 20:16:27
的外れ

21 :デフォルトの名無しさん:2006/10/16(月) 20:20:58
>>19
>STLportに変えてみたら同じぐらいの速さが出た。
>VC8標準のやつが遅かっただけみたい。
って、8にとっての結論は出てるみたいだからそれでいいじゃん
お前がどう評価するかは、それぐらい自分でベンチとれよ

22 :17:2006/10/16(月) 20:49:07
別にベンチマークがとりたいんじゃなくて、どんなコードで
比較したのかが知りたかったんだ。自分で新しく比較コード書く気は無いな。

本人が拒否するならわかるんだが、なんで他人が文句言ってくるんだ?

23 :デフォルトの名無しさん:2006/10/17(火) 00:02:59
確かに C# より遅いってのは屈辱的だな

24 :デフォルトの名無しさん:2006/10/17(火) 00:26:05
Dimkumwareは糞遅いからな。

25 :デフォルトの名無しさん:2006/10/17(火) 05:09:11
テンプレか思った

26 :デフォルトの名無しさん:2006/10/17(火) 11:07:37
>>22
お馬鹿さんの不思議ルールを理解しようとしても無駄。

27 :デフォルトの名無しさん:2006/10/17(火) 11:17:39
int main(int argc, char * argv[])
{
boost::numeric::ublas::vector<float > vec(2);

vec(0)=1.0;vec(1)=2.0;
boost::function1<
float,boost::numeric::ublas::vector<float>
> norm_2Functor = &boost::numeric::ublas::norm_2<boost::numeric::ublas::vector<float> >;
float out= norm_2Functor(vec) ;
}

想定外のメモリーを参照しました
で落ちる。何が悪いのだろう。

28 :デフォルトの名無しさん:2006/10/17(火) 12:56:57
>>22
ここにいること自体時間の無駄。


29 :デフォルトの名無しさん:2006/10/17(火) 17:34:25
>>27
誘導。
http://pc8.2ch.net/test/read.cgi/tech/1158991211/


30 :デフォルトの名無しさん:2006/10/18(水) 01:46:19
listについて質問です。
erase()で、イテレータで指定した位置の要素を消せますが、
消した後このイテレータは有効なのでしょうか?無効なのでしょうか?

31 :デフォルトの名無しさん:2006/10/18(水) 01:50:23
つ i++

32 :デフォルトの名無しさん:2006/10/18(水) 02:06:49
>>30 無効
>>31 エスパー乙

33 :デフォルトの名無しさん:2006/10/18(水) 02:38:20
ということは、erase(it)のあと、it++などとやったらいけないのですか?

34 :デフォルトの名無しさん:2006/10/18(水) 02:40:01
>>33
うん。ダメ。だから erase(it++) という話で >>31 に行く。

35 :デフォルトの名無しさん:2006/10/18(水) 02:56:03
エスパー過ぎたなww

36 :デフォルトの名無しさん:2006/10/18(水) 07:45:42
これってシュール?
vector<mydata*> * vec;
vec = new vector<mydata*>();
delete vec;

37 :デフォルトの名無しさん:2006/10/18(水) 07:49:32
ベンチしたらVC標準の方がSTLportより速かったぞ。

38 :デフォルトの名無しさん:2006/10/18(水) 09:28:17
>>34
vectorの場合を考えて普通eraseの戻り値使わない?

39 :デフォルトの名無しさん:2006/10/18(水) 10:57:06
>>38
>>30はlistと言っているがシーケンスコンテナとは言っていない。

40 :デフォルトの名無しさん:2006/10/18(水) 13:12:21
便乗して質問なんですが、
std::vectorのeraseしたときの要素削除で
実際にヒープ開放しないように指定することは不可能?
頻繁に数が変動する場合、自分で制御した方がいいんでしょうか


41 :デフォルトの名無しさん:2006/10/18(水) 13:39:39
vectorは確保した領域をいちいち開放しないんじゃないの?
resize()でサイズを小さくしても領域は開放されないとか書かれていたけど。

42 :デフォルトの名無しさん:2006/10/18(水) 14:15:19
>>40
std::remove

43 :デフォルトの名無しさん:2006/10/18(水) 21:21:04
>>40
std::deque

44 :デフォルトの名無しさん:2006/10/19(木) 00:38:06
struct Data { int id; (他にもいろいろ) };
std::vector<Data*> dataSet;
にid順にpush_backで詰め込んであります。

bool Compare( const Data* p, const int v) { return (p->id < v); }
int id = 探すid番号;
std::vector<Data*>::iterator it =
std::lower_bound( dataSet.begin(), dataSet.end(), index, Compare);

で、find_ifより高速に検索ができるかと思ったのですが、
vc8では lower_bound内で Compare( int, Data*)が必要らしく
コンパイルが通りません。Compare( int, Data*)を定義すると
どちらのCompareなのかあいまいだと言われてます。
解決方法を教えてください。


45 :デフォルトの名無しさん:2006/10/19(木) 00:44:38
>>44
struct compare{
static bool operator()(const Data* p,int v){return p->id<v;}
static bool operator()(int v,const Data* p){return v<p->id;}
};
を定義してCompareの代わりにcompare()を渡せばいい。

46 :44:2006/10/19(木) 01:51:22
>>45
コンパイルを通すには、 Data<int, int<Dataだけでなく、Data<Dataも必要でした。
ありがとうございました。

operator()を3つ定義するならoperator<を3つ定義して
lower_bound(start,end, 値);でも結局、手間は同じなのかも?


47 :デフォルトの名無しさん:2006/10/20(金) 20:56:10
以下のコードでコメントアウトしてあるdelete dの部分なんですが
コメントにすればメモリリーク
コメントにしなければvectorにデータが入らない
こういった場合どうすればよいのでしょうか

#include <iostream>
#include <vector>
using namespace std;
struct data{int i;};
struct my{
vector<data*> dat;
void add(){data* d = new data();
d->i=10;
dat.push_back(d);
//delete d; //コメント外すとvectorにデータが入らない
}
void p(){for(int i=0;i<dat.size();++i){cout << dat[i]->i << endl;}}
};
int main(){
my m;
m.add();
m.p();
return 0;
}

48 :デフォルトの名無しさん:2006/10/20(金) 21:24:39
>>47
myのデストラクタでdatの要素全てdeleteするか、boost::ptr_vectorを使う。

49 :デフォルトの名無しさん:2006/10/20(金) 21:25:39
あ、あとvectorの要素をdataそのものにする。

50 :デフォルトの名無しさん:2006/10/20(金) 21:30:05
data の要素が int 程度なら vector<int> を使う

51 :47:2006/10/20(金) 21:33:05
>>48,49
回答ありがとうございます
>myのデストラクタでdatの要素全てdelete
あ!つい、自動的にやってくれるもんだと思ってた
vectorはポインタの中身の削除には感知しないんでしたね
要素をdataにするほうは派生クラスのポインタも入れたりするので
今回は>>48のほうで頑張ってみます
行き詰ってましたがこれで何とか先に進めそうです
助かりました!

52 :47:2006/10/20(金) 21:36:36
>>50
補足どうもです
小さいデータでは直接intのほうがよさそうですね
47のコードは状況を再現する最小コードで
実際はもうちょっと複雑なデータ構造になっています

53 :デフォルトの名無しさん:2006/10/20(金) 23:10:47
本当にint型のメンバ1つでも、intそのままよりtypedefの方が良いと思う。

54 :デフォルトの名無しさん:2006/10/20(金) 23:31:43
>>53
つまりこうか?
template <typename T> struct data{ typedef T value_type; T i; };
と定義して、
typedef int HogeType;
とtypedefして、
my<HogeType> m;
と使う、と。

55 :デフォルトの名無しさん:2006/10/20(金) 23:56:45
>>54
typedef struct
{ int i; }data;
dataに別の変数を付け足したくなった時に便利。ってことじゃないか

56 :デフォルトの名無しさん:2006/10/21(土) 07:39:05
いや、単にtypedef int data;のつもりだったんだが。

57 :デフォルトの名無しさん:2006/10/21(土) 21:05:46
boost関係もここ?


58 :デフォルトの名無しさん:2006/10/21(土) 21:12:56
http://pc8.2ch.net/test/read.cgi/tech/1158991211/
ここかな

59 :デフォルトの名無しさん:2006/10/22(日) 18:31:51
vectorの削除について質問です

remove(v.begin(),v.end(),1)みたいなのだと要素数は減らず
eraseと組み合わせたら要素数も減る
v.clear()だと要素数は0になるんですよね
それでは要素数はそのままで、
vectorの中身を全部削除(適切な言葉がわからない)
するにはどうしたらいいのでしょうか
remove(v.begin(),v.end(),?)

60 :デフォルトの名無しさん:2006/10/22(日) 18:40:39
>>59
いったい何がしたいんだ?

61 :59:2006/10/22(日) 18:49:20
>>60
vectorをキャッシュみたいに利用できないかと考えたんです

v.begin()〜v.end()の内容をあるときに全部他に書き出して
v.begin()〜v.end()を初期化して再利用
この時、clear()を呼んで初期化すると
確保したメモリも削除されるので勿体ないかなと

62 :デフォルトの名無しさん:2006/10/22(日) 18:52:25
>>61
何が勿体ないのかわからんが、 vector には reserve() があるんで、
clear() でメモリを解放する実装は考えられない。

63 :59:2006/10/22(日) 18:59:16
>>62
すみません、どうやら勘違いしてたみたいです^^;
clear()で行こうと思います、失礼しました

64 :デフォルトの名無しさん:2006/10/22(日) 21:20:17
メモリ解放するときはreserve(0)?
明示的破棄は不可能なんでしょうか?

65 :デフォルトの名無しさん:2006/10/22(日) 21:23:51
>64
std::vector< int >().swap(v);

66 :デフォルトの名無しさん:2006/10/22(日) 21:32:35
>>65
見た感じヤバイ印象を受けるのですが
スタンダードなやり方なんですか?

67 :デフォルトの名無しさん:2006/10/22(日) 21:41:54
>66
>見た感じヤバイ印象を受けるのですが
あなたは仕様やドキュメントではなくて見た感じの印象でコードの可否を決めるの?

>スタンダードなやり方なんですか?
何をもってスタンダードとするかは分からないけれど
swapイディオムというよく使われる方法の延長

68 :デフォルトの名無しさん:2006/10/22(日) 21:47:08
>>66
vector* でも持って new/delete すれば確実だろう。

69 :デフォルトの名無しさん:2006/10/22(日) 23:21:01
>>67
初めて見るコードでイディオムっていうのを知らなくて。
無知ですみません。勉強になりました。

70 :デフォルトの名無しさん:2006/10/23(月) 00:01:07
vectorが合ったら配列っていらないような気がするけど、必要なの?


71 :デフォルトの名無しさん:2006/10/23(月) 00:11:17
>>70
C との互換性のためには必要。文字列リテラルも配列型だしね。
動的確保を必要としないという点も見逃せない。

72 :デフォルトの名無しさん:2006/10/23(月) 00:12:54
固定長配列の需要もなくなりはしないよ。

73 :デフォルトの名無しさん:2006/10/23(月) 00:15:30
boost::array, std::tr1::array でほとんど置き換えることは可能なんだろうけど、
やっぱり不要ってことにはならないだろうねぇ。

74 :デフォルトの名無しさん:2006/10/23(月) 00:32:44
>73
それらの実装に固定長配列が要るだろ。
まあそれを言ったらstd::vectorの実装にnew []が必要とかそういう次元の話になってしまうが。

75 :デフォルトの名無しさん:2006/10/23(月) 01:05:04
でも、配列を使う機会は減りそうだな。

76 :デフォルトの名無しさん:2006/10/23(月) 02:56:25
配列がなかったらvectorもなくなるじゃん

77 :デフォルトの名無しさん:2006/10/23(月) 05:24:39
mallocとポインタで何とか

78 :デフォルトの名無しさん:2006/10/23(月) 21:43:06
std::vectorに、at()という関数が見つかりません。
VisualC++だとあるのですが、gccにはありませんでした。
これは標準の関数ではないのでしょうか?

79 :デフォルトの名無しさん:2006/10/23(月) 21:45:56 ?2BP(204)
http://0xcc.net/blog/archives/000137.html

この表で、c++のjoinが無しになってるけど、vector<string>とかlist<string>に、
ほかのアルゴリズムを組み合わせればできるよね?


80 :デフォルトの名無しさん:2006/10/23(月) 21:53:42
join は難しいんじゃない?

81 :デフォルトの名無しさん:2006/10/23(月) 22:12:52
#include <vector>
#include <numeric>
#include <string>
std::vector<std::string> v;
v.push_back("test");
v.push_back("orange");
v.push_back("apple");
std::string s;
s = std::accumulate(v.begin(), v.end(), std::string());
printf("[%s]\n", s.c_str());

これでいいのかしら?


82 :デフォルトの名無しさん:2006/10/23(月) 22:19:07
あ、joinは単に結合するだけじゃなくてセパレータがいるのか…
transformもつけると意味が変わりそうな気もするし


83 :デフォルトの名無しさん:2006/10/23(月) 22:31:59 ?2BP(204)
chopもpythonのs[0:-1]がOKなら、C++でも、なにか書き方がありそうな気がする。

84 :デフォルトの名無しさん:2006/10/23(月) 22:32:54
vectorで2次元配列を作るとして、
イテレータで[]演算子を使ってアクセスすることはできますか?
at()だと、下記の書き方でうまくいくのですが…範囲チェックの分のコストが惜しいので
できるだけ[]演算子でアクセスしたいのです。

vector<vector<int> > v;

for( vector<vector<int> >::iterator i=v.begin(); i != v.end(); i++ ) {
i->at( 0 ) = 1;
}


85 :デフォルトの名無しさん:2006/10/23(月) 22:34:31
これならいける?

#include <boost/lambda/lambda.hpp>
namespace bll = boost::lambda;

std::string s = std::accumulate(
v.begin(), v.end(), std::string(),
_1 + bll::make_const(", ") + _2
);

86 :デフォルトの名無しさん:2006/10/23(月) 23:04:26
>>84
(*i)[0] = 1;

87 :デフォルトの名無しさん:2006/10/23(月) 23:29:50
STL使うと容量が増えている気がするんですが、気のせいでしょうか?

88 :デフォルトの名無しさん:2006/10/23(月) 23:31:37
>>87 ファイルサイズ見ろ。

89 :デフォルトの名無しさん:2006/10/23(月) 23:33:01
>>87
ガイシュツ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/12

90 :デフォルトの名無しさん:2006/10/23(月) 23:35:32
>>78
標準。
GCCにないわけがない。なにか古い版か?

91 :デフォルトの名無しさん:2006/10/24(火) 00:12:09
>>86
ありがとうございます。

92 :デフォルトの名無しさん:2006/10/24(火) 01:46:08
>>78
STLportでも入れろハゲ。

93 :デフォルトの名無しさん:2006/10/24(火) 15:35:52
STLをjavadoc形式で表したいんですけど、参考になるサイトとかないですか?

94 :デフォルトの名無しさん:2006/10/24(火) 18:21:15
>>93
STLをjavadoc形式で表すってどういうことか説明してみそ



95 :デフォルトの名無しさん:2006/10/24(火) 19:01:07
エスパー的にDoxygenはどうだ?

96 :デフォルトの名無しさん:2006/10/24(火) 19:13:02
doxygenを使おうとは思ってたのでインストールはしています…あと一応eclipseも

とりあえずSTLのどれからでもいいんでドキュメント化したかったんですけど
STLのソースに書き込むの難しそうだったんで
そういうの補足してくれてるサイトとかあったら教えてほしかったんですけど…

97 :デフォルトの名無しさん:2006/10/24(火) 19:23:48
>>96
gcc付属のSTLだったらlibstdc++をdoxygenに掛けたのが
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/index.html
とかにある


98 :デフォルトの名無しさん:2006/10/25(水) 03:14:21
STLくらいメジャーなものだったら本やネットで公開されてる
マニュアルのほうが完成度が高い

99 :デフォルトの名無しさん:2006/10/25(水) 07:49:08
g++3.4.5 stdc++ のrandom_shuffle() の実装なんですけど

> for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
> std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));

なんかビミョー?

100 :デフォルトの名無しさん:2006/10/25(水) 10:17:44
template<typename MANY_FLOAT >
class MyContainer
{
MANY_FLOAT &data_;
MyContainer(TWO_FLOAT &_data_ ):(data_(_data_))
};

float _data_[100];
MyContainer myContainer(_data_);

MANY_FLOAT に float*nの大きさを指定してn個飛ばしでdataにアクセスしたい。

MANY_FLOATにはどんなクラスを指定すればいいのでしょうか

101 :デフォルトの名無しさん:2006/10/25(水) 10:23:03
>>100
typename 引数で「大きさを指定」するのか?
「n個飛ばし」って何だ?
TWO_FLOAT って何?

MyContainer のコンストラクタ、コンパイルできないだろ。
MyContainer はテンプレートなのに、 myContainer の
宣言ではテンプレート引数が指定されていない。

質問を整理して、コンパイルできるコード貼ってくれ。

102 :デフォルトの名無しさん:2006/10/25(水) 12:57:11
>>99
上手いコードとはいえないな。

103 :デフォルトの名無しさん:2006/10/25(水) 14:03:14
_firstと_lastが同じでも大丈夫なんだろうか

104 :デフォルトの名無しさん:2006/10/25(水) 14:08:18
>>99
コンテナが空の場合のチェックは引用してないとこでやってるの?

ロジックはいいんじゃないの?ちゃんと確かめてないけど
http://ray.sakura.ne.jp/tips/shaffle.html

105 :デフォルトの名無しさん:2006/10/25(水) 15:00:52
rand()%Xがイマイチ

106 :100:2006/10/25(水) 16:45:39
自己解決
tinyvecorってこういうとき使うものなのね

107 :デフォルトの名無しさん:2006/10/25(水) 19:29:40
ASL
http://sourceforge.net/projects/adobe-source/
使ってる人いますか?

108 :デフォルトの名無しさん:2006/10/26(木) 00:17:55
vectorで型の違う2次元配列をtransform()を使って変換したいんですが、
どういう風に書けばいいでしょうか?


109 :デフォルトの名無しさん:2006/10/26(木) 00:23:52
>>104
> コンテナが空の場合のチェックは引用してないとこでやってるの?

たぶんそう。漏れの手元にあるのはgcc-3.4.6付属版だけど、全文はこう。
gcc-4.1.1も同じだった。

template<typename _RandomAccessIterator>
 inline void
 random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last)
 {
  // concept requirements
  __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
     _RandomAccessIterator>)
  __glibcxx_requires_valid_range(__first, __last);

  if (__first != __last)
   for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
    std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
 }

やっぱ rand() % X がなー。質にも値の範囲にも問題あるんじゃ?
気になるなら random_shuffle(first, last, op) 使えって感じか。
あと、inlineついてるのね。


110 :デフォルトの名無しさん:2006/10/26(木) 00:29:23
>>108
どういう風に書いてうまくいかなかったのか?

111 :108:2006/10/26(木) 00:51:11
すみません、自己解決しました。

vector<vector<T> > v1( 10, 10 );
vector<vector<X> > v2( 10, 10 );

vector<vector<T> >::iterator i=v1.begin();
vector<vector<X> >::iterator j=v2.begin();
for( ; i != v1.end(); i++ ) {
transform( i->begin(), i->end(), j->begin(), convert<T, X>() );
}

の記述で通りました


112 :デフォルトの名無しさん:2006/10/31(火) 23:12:04
VineLinux3.2で、libstdc++3.3.6だとワイド文字周りが正常でなかっ
た為synapticからSTLPort(4.6.2)をインストールしました。
ライブラリが/usr/libに、ヘッダーが/usr/include/stlportにインス
トールされました。
試しに
#include <iostream>
#include <locale>
using namespace std;
int main() { locale::global(locale("japanese")); }

g++ main.cpp -I/usr/include/stlport -lstlport_gcc
でコンパイルして実行したところ、何故かアボート。

何か間違ってますか?

113 :デフォルトの名無しさん:2006/10/31(火) 23:39:39
スレ違いのような気がしなくもないけれど。

単にstd::locale::global(std::locale(""));だとどう?

114 :デフォルトの名無しさん:2006/11/01(水) 01:11:12
locale("C");ならアボートしませんけど、locale("japanese")
でダメっつーのは、いかんのでは?

115 :デフォルトの名無しさん:2006/11/01(水) 01:38:22
>>112
locale のコンストラクタが例外を投げることになってるんで、こうしてみると

#include <iostream>
#include <locale>
#include <exception>
int main()
{
using namespace std;
try { locale::global(locale("japanese")); return EXIT_SUCCESS; }
catch (exception const& e) { cerr << e.what() << endl; return EXIT_FAILURE; }
}

cygwin g++ 3.4.4 だと↓のようになった。
locale::facet::_S_create_c_locale name not valid

116 :デフォルトの名無しさん:2006/11/01(水) 01:53:14
>>114
locale文字列は"C"と""以外処理系定義のはず。

117 :デフォルトの名無しさん:2006/11/01(水) 08:13:54
>>109
Working Draftにそもそもこう書いてあるから、別にgccのせいじゃないだろ。
25.2.11 Random shuffle [lib.alg.random.shuffle]
4 Remarks: The underlying source of random numbers for the first form of the function is implementation-defined.
An implementation may use the rand function from the standard C library.

実装依存なんだから結局
>気になるなら random_shuffle(first, last, op) 使えって感じか。
だな

118 :デフォルトの名無しさん:2006/11/01(水) 08:31:02
working draftで語るのはどうかな…
ISO/IEC14882 みて語ろうぜ。

119 :デフォルトの名無しさん:2006/11/01(水) 09:05:28
>>117
>別にgccのせいじゃないだろ。
単に出典を示しただけだろ。着眼点がずれてるよ。
俺が使ってるSTLportも似たようなもんだった。

120 :デフォルトの名無しさん:2006/11/01(水) 14:18:04
そもそもrand()の性能がよければ問題無いつー話では?

rand()%X より rand()*X/RAND_MAXのほうがいいとかはあるかも知らんが.


121 :120:2006/11/01(水) 14:19:28
あ、計算違ってるかも RAND_MAX じゃなくて (RAND_MAX+1)?


122 :デフォルトの名無しさん:2006/11/01(水) 16:04:12
>>117
「std::rand使うかも」まで書いてあるのね。参考になった、さんくす。

>>119
STLportの4.6.2と5.0RC2を見てみた。どっちのバージョンでもまったく同じ。

 if (__first == __last) return;
 for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
  iter_swap(__i, __first + __random_number((__i - __first) + 1));

__random_number は "rand() % X" と "lrand48() % X" のどちらか。マクロ切替。

>>120
確かに。実装で自由に定義していいんだから、
変に凝らずrandまかせで済ませるってことか。

>>121
RAND_MAX+1はinteger overflowになるかもよ。(実装定義だけど)


123 :デフォルトの名無しさん:2006/11/01(水) 16:43:25
ISよりWCの方を参考にするのかw

124 :123:2006/11/01(水) 16:45:17
ミスったWDだww

125 :デフォルトの名無しさん:2006/11/01(水) 16:57:49
typedef list< pair<string, string> > PairList;

PairList l;
(略)
it = lower_bound(l.begin(), l.end(), "text", cp());

上記コードで、textとpairのfirstで比較を行いたいのですが、
Compareオブジェクトはどのようなものを作れば良いのでしょうか?

struct compare
{
 bool operator()(PairList::value_type v, string s);
 bool operator()(string s, PairList::value_type v);
};

ではコンパイルが通りません。

126 :デフォルトの名無しさん:2006/11/01(水) 18:17:35
たぶん
string -> string const&
PairList::value_type -> PairList::value_type const&

127 :デフォルトの名無しさん:2006/11/02(木) 01:05:40
>>123
IS と WD はそんなに違わない。むしろ WD のほうが修正が進んでいる面もある。
そして IS は買わないといけないが WD はダウンロードできる。

128 :デフォルトの名無しさん:2006/11/02(木) 01:06:49
>>125
エラーメッセージは?

129 :123:2006/11/02(木) 06:07:36
>>127
屁理屈乙

130 :デフォルトの名無しさん:2006/11/02(木) 10:47:48
>>129
ISO の営業担当の方ですか?

131 :デフォルトの名無しさん:2006/11/02(木) 12:07:48
言い訳すればするほど墓穴

132 :デフォルトの名無しさん:2006/11/02(木) 12:19:22
STL学習し始めたばかりの初心者なんですが
コンテナvectorのソースコードってどうやったら見れますか?

133 :デフォルトの名無しさん:2006/11/02(木) 12:52:51
普通にファイル開けば

134 :デフォルトの名無しさん:2006/11/02(木) 13:00:08
ドライブのどこにあるのか分からなかったのでvectorで検索かけたんですけど
同じファイルが3つくらい引っかかって、しかもテキストで開いたら文字化け気味だったので…

135 :デフォルトの名無しさん:2006/11/02(木) 13:03:13
>>132 http://www.google.co.jp/search?q=stl%5fvector%2eh

136 :デフォルトの名無しさん:2006/11/02(木) 13:05:12
>>135
すみません、わざわざありがとうございます
すごく助かりました!

137 :デフォルトの名無しさん:2006/11/03(金) 18:34:46
namespace detail {
}
ってどういう時に使うの?

138 :デフォルトの名無しさん:2006/11/03(金) 18:49:07
>>137
詳細を別の名前空間に分けておきたいとき。

139 :デフォルトの名無しさん:2006/11/04(土) 11:50:23
>>137
スレ違いに気付かない程度の人には関係ありません。

140 :デフォルトの名無しさん:2006/11/04(土) 13:37:59
iteratorを適当に与えると行の始まりまで移動させる関数をかいたのですが
std::reverse_iterator(STLport4.6.2 5.0.2) のバグと思われる実装が原因でうまく動きません。

STLport-4.6.2/stlport/_iterator.hの77行目からのoperator*なのですが
  _Iterator __tmp = current;
  return *--__tmp;
となっていてデクリメントするのは間違いだと思います。
  return *__tmp;
とすると私の関数は希望どうり動くのですがどのような意図でしょうか?


かいた関数は以下のとおりです
template<class It>It& begin_line(It& it, typename It::value_type nl='\n') {
  typedef std::reverse_iterator<It> rit_t;
  for(rit_t rtmp(it); rtmp != rit_t() && (*rtmp != nl); ++rtmp) {
    it = rtmp.base();
  }
  return it;
}

141 :デフォルトの名無しさん:2006/11/04(土) 14:31:29
>>140
最後の要素の次を参照する end() で reverse_iterator を初期化したとき、
最後の要素を参照しなければならない。

142 :140:2006/11/04(土) 15:40:21
endで初期化したならreverse_iterator的にもendだと思っていました
ありがとうございました

143 :デフォルトの名無しさん:2006/11/04(土) 18:10:11
>>140
> rtmp != rit_t()
この条件何?

144 :デフォルトの名無しさん:2006/11/04(土) 18:31:14
実は引数が一番最初の行でbeginとかより前に行ったときループから抜けれるようにじゃね?

145 :デフォルトの名無しさん:2006/11/04(土) 18:58:53
でも実際はこれじゃダメだよね?

146 :デフォルトの名無しさん:2006/11/04(土) 19:07:09
>>145
reverse_iteratorから呼び出されるであろう140によるIt::operator==とかの実装によるとしかいいようがない

147 :デフォルトの名無しさん:2006/11/12(日) 12:09:23
STLがMT safeかどうかどうしたら分かりますか?

148 :デフォルトの名無しさん:2006/11/12(日) 12:24:44
ベンダーに問い合わせる。

149 :デフォルトの名無しさん:2006/11/13(月) 15:14:33
2次元のvectorをサイズを指定して作成する方法を教えてください。

150 :デフォルトの名無しさん:2006/11/13(月) 15:19:34
>>149
vector< vector<Type> > v(n, vector<Type>(m))

151 :デフォルトの名無しさん:2006/11/13(月) 15:42:08
ありがとうございます。
2次元はうまくいったのですが、3次元に拡張しようとしたところうまくいきません。
vector< vector < vector<Type> > > v(n, vector<Type>(m, vector<Type>(n)))
と書いたのですが、どこが間違えているのでしょうか? 

152 :デフォルトの名無しさん:2006/11/13(月) 16:16:37
vector< vector < vector<Type> > > v(n, vector<Type>(m, vector<Type>(n)))
                             ↑ここがまずいのでは

vector< vector < vector<Type> > > v(n, vector<vector<Type> >(m, vector<Type>(n)))


153 :デフォルトの名無しさん:2006/11/15(水) 04:50:46
algorithmのstd::copyって例外安全ですか?

154 :デフォルトの名無しさん:2006/11/15(水) 07:59:02
いいえ

155 :デフォルトの名無しさん:2006/11/15(水) 16:00:32
>algorithmのstd::copyって例外安全ですか?
という質問もおかしいし
>いいえ
という回答もおかしい

156 :デフォルトの名無しさん:2006/11/15(水) 16:07:15
>>155
何がおかしいのか言わない君の方が芥。

157 :デフォルトの名無しさん:2006/11/16(木) 10:42:44
ド素人の俺が勘で答えてみると、
・実装による
・使うコンテナによる


158 :デフォルトの名無しさん:2006/11/16(木) 11:08:29
基本的には以下が必要
・イテレータの前進・比較・間接参照・コピーコンストラクタ・デストラクタが例外を発生させない
・要素の代入・デストラクタが例外を発生させない
ってとこかね。
コピーを巻き戻しできないので処理中に例外が発生したらあぼんぬ。

159 :デフォルトの名無しさん:2006/11/17(金) 01:13:25
>>157
規格ってのがあるだろ。
実装によるなら一般的にはスレッドセーフでないことになる。
使うコンテナによるならやっぱりスレッドセーフでないことになるだろ。
=====>スレッドセーフでない。

GCCの実装を見る限りではスレッドセーフでなないな。
ただコンテナの代入演算子を使ってるだけ。
コピー作ってスワップってのはしてない。

160 :デフォルトの名無しさん:2006/11/17(金) 01:26:53
スレッド?

161 :デフォルトの名無しさん:2006/11/17(金) 08:38:12
>>158
それは「例外安全ではない」ではなくて、「基本的な例外安全」が保証されている状況

162 :デフォルトの名無しさん:2006/11/17(金) 12:13:17
C++ 標準規格としては std::copy というか, uninitialized 系を除く
アルゴリズムの例外安全性に関しては何も規定していない……

んですが,あくまで一般的な実装の話として
std::copy は, iterator の value_type のコピー代入が
strong guarantee を保持していることを (唯一の) 型に対する要件とした上で,
basic guarantee を達成する,という説明になるんじゃないでしょうか?
iterator の各操作が例外を投入しうる場合でも
basic guarantee は達成すると思います.

163 :デフォルトの名無しさん:2006/11/17(金) 21:31:53
vectorについて質問なんですが
struct kobunrui{
public:
std::string itemname;
int kosuu;
}
struct daibunrui{
public:
std::string bunruimei;
kobunrui itemsyousai;
};
大分類についてはpush_backで追加できるのですが
大分類1個の中の小分類を追加するのは、どのようにすればいいのでしょうか?
また大分類1個の中の小分類の数の取得はどのようにすればいいのでしょうか?

164 :デフォルトの名無しさん:2006/11/17(金) 22:10:18
>>163
例えば要素0個目なら

v[0].itemsyousai = kobunrui_hensuu;

165 :デフォルトの名無しさん:2006/11/17(金) 22:11:04
>>163 意味が判らん。
daibunruiはkobunruiのインスタンスを一個だけ持つっていう仕様
なのにそれを追加なんてできる訳ねーだろ。
struct daibunrui {
public
  std::string bunruimei;
  std::vector<kobunrui> itemsyousai;
};
に直せ。

daibunrui instance;
size_t index(3);
int kosuu = instance.itemsyousai[index].kosuu;
で小分類の数の取得ができる。

取り敢えずオブジェクト指向がまるで理解できてないみたいだから
もっと勉強しろ。


166 :163:2006/11/18(土) 02:43:52
>>164
>>165
std::vector<kobunrui> itemsyousai;
};
に直せ。で,できました
ありがとう。

167 :デフォルトの名無しさん:2006/11/18(土) 03:02:51
オブジェクト指向とは関係ねえ
ただのコンテナの問題だ

168 :デフォルトの名無しさん:2006/11/18(土) 03:36:01
>>167
クラス設計や質問内容見りゃあオブジェクト指向がまるで理解できてない
ことぐらい直ぐ判かんだろカス。

169 :デフォルトの名無しさん:2006/11/18(土) 03:39:40
しつこいな
何か癪に触る事でもいいましたっけ

170 :デフォルトの名無しさん:2006/11/18(土) 22:22:59
っ 旦~

171 :デフォルトの名無しさん:2006/11/21(火) 09:15:51
STL初心者です

#define containtype list
//#define containtype deque
class test
{
containtype m_buffer;
};

こんな感じで互換性のあるクラスを切り替えて使えるコードを
書きたいのですが、どうやってそれを実現するのが良いのでしょうか?

ご教示くださいませ
よろしくお願いします。


172 :デフォルトの名無しさん:2006/11/21(火) 10:24:58
>>171
class test
{
typedef list<T> buffer_type;
//typedef deque<T> buffer_type;
buffer_type m_buffer;
};

173 :デフォルトの名無しさん:2006/11/22(水) 06:51:19
>>172
ありがとうございます!

174 :デフォルトの名無しさん:2006/11/23(木) 20:26:55
イテレータのループをまわす時に継続条件として
it != last
と比較するのはなぜなんでしょうか
it < last にしない理由がよくわかりません

「同じモノを指しているかどうか比較できる」が
「イテレータの大小比較はできない」パターンがあるという事でしょうか


175 :デフォルトの名無しさん:2006/11/23(木) 20:28:21
はい。

176 :デフォルトの名無しさん:2006/11/23(木) 20:33:07
一番判りやすい例は、双方向リンクリストでポインタの大小関係は
あくまでメモリ上の位置だけでリストの順番とは無関係


177 :174:2006/11/23(木) 20:36:53
>>175
>>176
そういわれればそうですね

配列やvectorしか頭になかった・・・
リンクリストのイテレータ比較しても意味ないですね

178 :初心者:2006/11/23(木) 23:37:51
こんにちは。質問です。STLというのはどこでDLできるのでしょうか。
なるべく粗相のないよう簡潔にお答え願います。

注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。

179 :デフォルトの名無しさん:2006/11/23(木) 23:38:52
>>178
朝鮮人は祖国に帰れ!

180 :デフォルトの名無しさん:2006/11/23(木) 23:42:26
こっちにも来たのかww 20世紀梨キャラメル吹いた

181 :デフォルトの名無しさん:2006/11/24(金) 00:06:41
>>178
STLport
http://stlport.sourceforge.net/

182 :デフォルトの名無しさん:2006/11/24(金) 00:34:36
>>178
現在の標準C++に準拠した処理系にはもれなく付いてくる。
付いてこないようであれば、そんな処理系窓から投げて捨ててしまえ。
勿論、質が問題になることはあるが。

183 :デフォルトの名無しさん:2006/11/24(金) 19:42:41
>>178
(´・ω・`)   n
⌒`γ´⌒`ヽ( E)
( .人 .人 γ ノ
ミ(こノこノ `ー´
)にノこ(

184 :デフォルトの名無しさん:2006/11/24(金) 21:57:15
>>178
また○u○ak○b○か

185 :デフォルトの名無しさん:2006/11/25(土) 00:32:14
いいえ、K○s○○a○eではありません。

186 :デフォルトの名無しさん:2006/11/25(土) 02:09:48
そういうことにしておきたいんですね :-)

187 :デフォルトの名無しさん:2006/11/25(土) 03:24:25
と言うことにしておいたうえでこの狸うるさい上に粘着なんてイラネ


188 :デフォルトの名無しさん:2006/11/25(土) 03:44:01
>>187

注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。


189 :デフォルトの名無しさん:2006/11/25(土) 04:03:49
うざいんであぼーんした

190 :デフォルトの名無しさん:2006/11/26(日) 03:02:39
任意の構造体を格納できるリングバッファを作ろうと考えています。
2つのスレッドがあって、一方が任意の構造体データを追加し、他方が取得します。
取得が遅いためにバッファが一杯になった場合、追加側はブロックさせたいと思います。
スレッドの排他やブロックおよびブロックの解除を実装する必要はあると思いますが
リングバッファくらいならSTLにあるような気がしていて、あるならそれを使って実装しようと考えてます。
STLで任意の構造体をリングバッファに納めるコンテナはありますか?
また速度は(自作するよりは)高速でしょうか?(主観でOKです。)

191 :デフォルトの名無しさん:2006/11/26(日) 03:06:49
>>190
deque または queue で済むんじゃないかな?

192 :デフォルトの名無しさん:2006/11/26(日) 03:13:21
>>191
ありがとうございます。早速調べてみます。

193 :デフォルトの名無しさん:2006/11/26(日) 16:05:30
STLの入門用サイトって需要あると思いますか?

194 :デフォルトの名無しさん:2006/11/26(日) 16:09:31
>>193
もうたくさんあるから、要らないと思う。不正確な内容のものも多いけど、
正確さを求めるならリファレンスっぽいやつや、規格を見るし。

195 :デフォルトの名無しさん:2006/11/26(日) 16:44:43
>>194
そっか、勉強がてらに書いてみようと思ったんだけど

196 :デフォルトの名無しさん:2006/11/26(日) 17:38:36
>>195
そういう目的があるんなら、書いたらいい。
突っ込みとそれに対する改良を重ねる前提で公開するというのは
新しいかもしれない。

197 :デフォルトの名無しさん:2006/11/26(日) 20:39:59
stl wiki japanese

198 :デフォルトの名無しさん:2006/11/26(日) 21:37:47
STLはできて結構時間たってるが
まったく枯れてないのでやる価値はある
書籍もSGI STL前提なのでどれも古くなっている

199 :デフォルトの名無しさん:2006/11/26(日) 22:24:58
後々の発展的な内容としてboost::bindくらいはあってもいいと思う。TR1にも入っているし。

197案のwikiをやるならSTLに限らず標準ライブラリ全てを対象にしてほしい。

200 :デフォルトの名無しさん:2006/11/27(月) 11:10:03
>標準ライブラリ全てを対象にしてほしい。
禿同。

201 :デフォルトの名無しさん:2006/11/27(月) 16:36:21
localeとか系統立てた解説ないしな…

202 :デフォルトの名無しさん:2006/11/27(月) 16:46:39
localeの解説は欲しいな

203 :デフォルトの名無しさん:2006/11/27(月) 20:03:37
Rogue Wave のユーザーズガイドにあるじゃん

204 :デフォルトの名無しさん:2006/11/27(月) 22:46:51
std::strstream みたいなストリームクラスで、std::string みたいに可変長のバッファを取り扱えるものはないですか?
内部でバッファを持っていて、データを書き込むたびに、バッファが足りなくなったら確保してくれる・・・みたいなやつです。


205 :デフォルトの名無しさん:2006/11/27(月) 23:00:19
std::stringstream

206 :デフォルトの名無しさん:2006/11/28(火) 00:28:34
>>205
調べてみます、ありがとうございました!

207 :デフォルトの名無しさん:2006/11/28(火) 01:08:38
みんなでwikiらない?

208 :デフォルトの名無しさん:2006/11/28(火) 01:15:19
Wiki(゚听)イラネ

STLの本を2冊も買えば十分じゃないか

209 :デフォルトの名無しさん:2006/11/28(火) 02:05:28
仕様書嫁。それ以外の多くの文献は、あてにならん。

もちろんあてになるものを作ろうという動きは面白いと思うが、
Wiki は情報の信頼性が低下する傾向にあるので、俺は好かん。

210 :デフォルトの名無しさん:2006/11/28(火) 03:37:07
俺はあっていいと思う。
既刊の書籍があれば誰にとっても十分とは思わないし、
単なるまとめサイトとしてだけでも価値を持ち得る。

211 :デフォルトの名無しさん:2006/11/28(火) 08:08:05
>>210
じゃあお前が作れ

212 :デフォルトの名無しさん:2006/11/28(火) 08:24:27
何かやる気があるなら、先に cppreference の日本語訳を最新にしてくれ。

213 :デフォルトの名無しさん:2006/11/28(火) 09:24:43
http://www.cc.nao.ac.jp/fsunman/LANG/japanese/C++/index.html
でいいだろ。google でグぐるとトップにくるくらいだ。


214 :デフォルトの名無しさん:2006/11/28(火) 12:53:46
>>204
ostringstream は?

215 :デフォルトの名無しさん:2006/11/28(火) 12:55:42
>>214
>>205

216 :デフォルトの名無しさん:2006/11/28(火) 15:36:02
いつからストリームI/OがSTLになったんだ。

217 :デフォルトの名無しさん:2006/11/28(火) 16:26:56
最近 STL がなんだかがっくりしているように見えてきた

218 :デフォルトの名無しさん:2006/11/28(火) 16:45:08
長い髪が、こう、顔の前にブァサっと来てる感じか。貞子風に。

219 :デフォルトの名無しさん:2006/11/28(火) 17:20:06
>>217-218
てめぇらゆるさねぇ。










そう見えるようになっちまった。

220 :デフォルトの名無しさん:2006/11/28(火) 19:06:05
xstringについて質問なんですが、
Vc7\includeの下とVc7\crt\srcの両方にあるんですが、
現在、私のプログラムでこの二つを勝手気ままに呼び出しててえらいことになってます。
どちらか一方だけを呼ぶことってできるのでしょうか?

221 :デフォルトの名無しさん:2006/11/28(火) 23:28:08
vc7\crt\srcをincludeに含めてるってこと?
アホか

222 :デフォルトの名無しさん:2006/11/28(火) 23:37:37
あるソースでは #include <Vc7\include\xstring>
になってて、別のでは #include <Vc7\crt\src\xstring> ってなってるとか?


223 :デフォルトの名無しさん:2006/11/28(火) 23:50:15
ワロスw
まさかとは思うがそれなら自分で変更しろよww

224 :初心者:2006/11/29(水) 01:40:11
質問です。Standaado Tenplate Libraryを使って作りたいのですがどうすればよいのでしょうか?

注:現在、私は公私ともに多忙を極め、スレを見ることが困難な状況です。
しかしその中でも何とか時間を作り、このスレに出向いて質問をしています。
そのような貴重な質問者に対し、1行レス、煽り、罵倒で返す愚か者がいるようですが
私のような質問者がいなければそもそもあなたたちの知識をひけらかす場が
存在しないことをよく認識し、身の程をわきまえるべきであります。
よって、私のような貴重な質問者に対し、見下した回答、儀礼を欠いた回答
(例:質問してくれてありがとうございました等のお礼がない、である調で答える、
様をつけない、w等の意味不明な言葉を発する)を禁止いたします。
ましてや自分の立場もわきまえず逆にお礼を強要したり、各人の目に触れやすくなるよう
多数のレスに同様の質問をしているのを「マルチポスト」呼ばわりするような輩は
当然加害対象として私のリストに載ることになります(賢い方は意味がおわかりでしょう)
この規則は2chの精神にものっとっており、強制的に施行されます。もし違反した場合には
2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には
2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから
FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置
を取らせていただきます。また、形式的にはちゃんとした回答であっても、知識不足のため
不正確な知識を回答することも禁止いたします。よく考え、よく調べ、正確な回答を
するように心がけましょう。なお、当方が質問に対し多少は役に立つと判断した場合は
それなりに評価するのでご安心下さい。なお、確認はこの啓蒙文を読んでいることを
前提としており、読んでいない、理解できない等のいいわけは一切通用しません。
また、有識ある諸君は今後自分の発言に対しこの啓蒙文をコピペすることが義務になります。

225 :デフォルトの名無しさん:2006/11/29(水) 01:43:01
あぼーんした

226 :デフォルトの名無しさん:2006/11/29(水) 01:46:40
>>225
でましたね。啓蒙文にしっかり書いておいたのにこういう輩が。
おそらく私に対抗しうる人物は国家権力を使えるということでしょうが
こちらは世界権力を行使できる立場にいます。
国連をご存じでしょうか?そう、あのアメリカさえも畏れる恐怖の世界組織です。
私はそこと内通しており、今回のような自体には世界権力の行使も辞さない構えです。

227 :デフォルトの名無しさん:2006/11/29(水) 01:50:36
おいおい、深夜にわらかすなよw

228 :デフォルトの名無しさん:2006/11/29(水) 01:57:29
>>226
あぼーんした

229 :デフォルトの名無しさん:2006/11/29(水) 02:06:29
マジレスすると、Standaado Tenplate Libraryというものは未だこの世に存在しないはず。
少なくとも俺は聞いたことが無い。知っている奴は是非とも名乗りを上げてくれ。

さて、存在しないということはこれから作られるということだ。
つまり、224が自分の思い通りに描けば、それがStandaado Tenplate Libraryになる。
それが芸術というものではないだろうか。

230 :デフォルトの名無しさん:2006/11/29(水) 02:13:42
正直面白いwwww

231 :デフォルトの名無しさん:2006/11/29(水) 08:17:10
>>224
>2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には
>2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから
>FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置
>を取らせていただきます
通報しました。

232 :デフォルトの名無しさん:2006/11/29(水) 12:31:08
229のマジレスに惚れた

233 :デフォルトの名無しさん:2006/12/01(金) 07:55:16
STL語ろよ

234 :デフォルトの名無しさん:2006/12/02(土) 06:01:13
STLゴロよ

最近はそんな商売もあるのか。


235 :デフォルトの名無しさん:2006/12/03(日) 11:48:02
テンプレートのインスタンス化結果を
ソースレベルで表示できるコンパイラってありますか?

template<typename T>
void foo(T arg){
cout << T;
}
foo<int>(50);

void foo(int arg){
cout << arg;
}
に展開してくれる様な

この機能があればテンプレート絡みの意味不明なコンパイルエラー
の修正が、かなり楽になりそうなんですが・・・

236 :デフォルトの名無しさん:2006/12/03(日) 12:15:29
VC8のエラー表示は十分分かりやすいと思うけど
普段使ってるコンパイラはどんなエラー表示を出すの?


237 :デフォルトの名無しさん:2006/12/03(日) 13:12:32
>>235の質問にはそんなコンパイラ知らないだけど、テンプレートのエラーで悩むくらいならいっそ使うのやめたほうがいいと思う。


238 :236:2006/12/03(日) 13:18:24
>>237 いやーでもVC6の呪文のようなエラーだったら挫折しても仕方なくない?
effective STLでもエラー表示を理解しようみたいな項目があったくらいだし


239 :235:2006/12/03(日) 13:52:47
いやー自分で作ったテンプレートライブラリならわかるんですけど
boostとか使用していて特殊化やオーバーロードが絡んでくると
エラー解析に時間がかかって・・・

さんざん悩んでタイプミスでした。とかたまにあるんで

ちなみにVC6使ってるのでVC8に変えてみます


240 :デフォルトの名無しさん:2006/12/03(日) 15:06:09
STLのエラー解析ならSTLFilt使ってみろよ。

http://www.bdsoft.com/tools/stlfilt.html

241 :デフォルトの名無しさん:2006/12/03(日) 19:46:56
まあ、俺も初めて std::string を知ったばかりのころは、
basic_string ってなーに? traits?? allocator??? ヽ(`Д´)ノ だったな

242 :237:2006/12/03(日) 19:58:04
たしかにSTL関連のエラーはわけ分からんな。
ただ、大量にエラー出るわりに、ミスってるのは一箇所とかだったりするんで見慣れてると何とかなるかも。
まあ、経験論なので参考にはならんな。

243 :デフォルトの名無しさん:2006/12/03(日) 19:59:55
まあアロケータだのコンテナだの細部まで理解しなくても簡単かつ安全に使えるようなライブラリがかける
ってのがオブジェクト指向の目指してることだと思うんだけどね。


244 :デフォルトの名無しさん:2006/12/03(日) 20:49:00
STLとオブジェクト指向は関係ないと思うが

245 :デフォルトの名無しさん:2006/12/03(日) 20:58:45
>>244
ですよねー^^

246 :デフォルトの名無しさん:2006/12/03(日) 21:06:53
>>245
お前>>243か?お前みたいなオブジェクト指向を勘違いしてる奴が多いから
巷に間違ったオブジェクト指向の知識があふれてるんだよ。STLってのはジェネリックプログラミング
のC++での実装方法であってオブジェクト指向とは何の関係もない。

247 :デフォルトの名無しさん:2006/12/03(日) 21:08:48
>>246が正論だな。激しく同意する。

248 :デフォルトの名無しさん:2006/12/03(日) 21:10:08
>>246俺も日頃そう思っていたところだ・・・。正直オブジェクト指向も分かってない素人はプログラミングをやるべきじゃないと思う。

249 :デフォルトの名無しさん:2006/12/03(日) 21:12:36
何この流れ('A`)

250 :デフォルトの名無しさん:2006/12/03(日) 21:14:27
ジェネリック指向とオブジェクト指向の関係を的確に言い当てると…↓↓↓

251 :デフォルトの名無しさん:2006/12/03(日) 21:16:19
アルゴリズムとデータ構造をパッケージングしたクラス、それがSTL。

252 :デフォルトの名無しさん:2006/12/03(日) 21:18:09
こういう言葉の定義とかになるとやたらハッスルする人ってよくいるよね

253 :デフォルトの名無しさん:2006/12/03(日) 21:21:02
>>252みたいなやつっていっこうに消えないよね

254 :デフォルトの名無しさん:2006/12/03(日) 21:25:14
オブジェクト指向的ジェネリック指向まだー?

255 :デフォルトの名無しさん:2006/12/03(日) 21:26:20
>>250,254 関係ない。

256 :デフォルトの名無しさん:2006/12/03(日) 21:28:22
ジェネリックはオブジェクト指向とは関係ないと思うがSTLはオブジェクト指向で作られてるやん。

257 :デフォルトの名無しさん:2006/12/03(日) 21:29:38
>>255
物ベースでジェネリック!

258 :デフォルトの名無しさん:2006/12/03(日) 23:24:15
>>256
違う。STLはジェネリックプログラミングを用いているがオブジェクト指向は
用いていない。端的なポイントを挙げるなら、仮想関数に基づいていない。

継承と動的多態がないものをオブジェクト指向と呼ぶのは、
>>246の言う巷に溢れる間違い。
(言語によっては多少異なった形で実現されることもあるのがややこしいところだけど)


259 :デフォルトの名無しさん:2006/12/04(月) 00:06:26
正直オブジェクト指向とか出てくるとこういう定義厨がでてくるからうざい

260 :デフォルトの名無しさん:2006/12/04(月) 00:13:38
>>258
何を根拠にそんな不可解な定義を信じてるの?

261 :デフォルトの名無しさん:2006/12/04(月) 00:35:58
RUBY最強杉!!!

262 :デフォルトの名無しさん:2006/12/04(月) 00:58:43
>>260
258ではないけど、お前は何だったらオブジェクト指向と言うと思うのか?

>>256
258によれば(と言っておく)、クラスを使っているからといってオブジェクト指向プログラミングではないぞ。

263 :デフォルトの名無しさん:2006/12/04(月) 01:01:26
スレ違いだからほどほどを願いたいが
「便利なクラス」を作ることがOOだと主張する困ったちゃんはちょくちょく見る

264 :デフォルトの名無しさん:2006/12/04(月) 01:08:03
スレ違いだからほどほどを願いたいが
OOというといきなりその定義を延々と語り説教を始める困ったちゃんはちょくちょく見る

265 :デフォルトの名無しさん:2006/12/04(月) 01:09:10
>>264
おまえのことだな

266 :デフォルトの名無しさん:2006/12/04(月) 01:14:36
スレ違い。OOがどうとか話してる低レベル野郎はどっかいけ

267 :デフォルトの名無しさん:2006/12/04(月) 01:42:46
オブジェクト指向云々以前にさ

>>243
>まあアロケータだのコンテナだの細部まで理解しなくても簡単かつ安全に使えるようなライブラリがかける

これはSTLのことを指して言ってるの?
どうでもいい使い捨てのコードを書く場合は確かに細部を気にせず使うけど、
仕事で使う場合は結局STLの細部まで知っている必要がある気がする。


268 :258:2006/12/04(月) 01:42:54
>>260
不可解かな。根拠は、例えばこのへん:
ttp://en.wikipedia.org/wiki/Object-oriented_programming
→ "1 Fundamental concepts"
オブジェクト指向プログラミングを特徴づけるものは7つ。クラス、オブジェクト、
メソッド、メッセージ送信、継承、カプセル化、抽象、多態(ポリモーフィズム)。
これらを備えるものをオブジェクト指向言語と呼ぶが、場合によってはいくつかを
欠く。

ダメ情報源でなければ、およそ似たことが書いてあると思う。

STLはtemplateによる静的多態性に立脚しているわけで、
STLそれ自体は動的多態性を旨とするオブジェクト指向とは異なる作りをしている。
ユーザがオブジェクト指向とSTLを同一プログラム内で使い分けるのは自由だけどね。


269 :デフォルトの名無しさん:2006/12/04(月) 01:56:28
>>268
リンク先にだいぶマシな定義が書いてあるじゃねーか。
"Object-oriented programming (OOP) is a programming paradigm that uses abstraction to create models based on the real world."

引用した箇所にあるのは「オブジェクト指向言語」についての説明で、
しかもいくつかを欠いたものも「オブジェクト指向言語」に含むことになっている。
何を以って「オブジェクト指向(プログラミング)」と呼ぶかの定義にはならない。
多態だって動的か静的かの区別なんてしてないだろ。

270 :デフォルトの名無しさん:2006/12/04(月) 02:22:30
なんでおまえらは荒れるとわかっててその話題をスルーしませんか

271 :デフォルトの名無しさん:2006/12/04(月) 02:28:16
このスレは要らないと思ってるから。

272 :デフォルトの名無しさん:2006/12/04(月) 02:28:39
コードの多態っぷりはまさにオブジェクト指向っぽいんだが
ランタイムに動的ディスパッチしないと一部の人は納得しないんだろうなあ

273 :258:2006/12/04(月) 02:46:50
>>269
> リンク先にだいぶマシな定義が書いてあるじゃねーか。
> "Object-oriented programming (OOP) is a programming paradigm that uses abstraction to create models based on the real world."
ここまでで止めると曖昧すぎていまいちじゃね?

> 引用した箇所にあるのは「オブジェクト指向言語」についての説明で、
> しかもいくつかを欠いたものも「オブジェクト指向言語」に含むことになっている。
要約が悪かったせいですまんが、引用の前の文がOOPに関する説明で、
後ろの文が言語に関する補足。よくわからん向きは、長いけど原文読んでくれ。

> 多態だって動的か静的かの区別なんてしてないだろ。
んーむ。確かにそうだね。言語によらない元々の定義は動的静的を区別しないのかも。

C++でのより狭義なOOPの定義は、Stroustrup の C++ Glossary に記載がある:
ttp://www.research.att.com/~bs/glossary.html#Gobject-oriented-programming
object-oriented programming - programming using class hierarchies and
virtual functions to allow manipulation of objects of a variety of
types through well-defined interfaces and allow a program to be
extended incrementally through derivation.

んで、クラス階層と仮想関数を使わずにユーザ型だけに基づいて行うプログラミングは
データ抽象(プログラミング)と区別して呼んでる。

てことで、>>258の記述は「C++での定義では」という注釈をつけないと
いまいち正しくないかもね。


274 :デフォルトの名無しさん:2006/12/04(月) 07:24:07
>>270
能力の無さを、必死さとか粘着質とかでカバーして
それなりに「論陣張ってるっぽく振る舞える」話題だからだよ。

普通の「出来る奴だけが輝ける」話題で一切まともなこと言えない馬鹿が
ここぞとばかりに頑張ってる。
「自分の居場所を見つけた!」ってね。

275 :デフォルトの名無しさん:2006/12/04(月) 11:05:15
real worldってまだそんな妄想を語る奴がいるのかよ
信じられん

276 :デフォルトの名無しさん:2006/12/04(月) 13:45:28
流れ自体がどうでもいいから、ここでもどうでもいいこと言うぜ
知ってるやつも多いだろうが


今年の基本情報の問題に "自動車のサブクラス" を問う問題が出たんだ…
さすがに内心笑ったやつは多いと思うよ…

277 :デフォルトの名無しさん:2006/12/04(月) 15:54:45
全然ダメだな
やっぱオブジェクト指向は”動物クラス”から”犬クラス”と”猫クラス”を派生させないとね!
そして多態で鳴く

278 :デフォルトの名無しさん:2006/12/04(月) 16:13:41
実務に関係ない喩えで出題してんのか・・
まあ基本情報はそんなものだろうけど

279 :デフォルトの名無しさん:2006/12/04(月) 16:19:11
大切なのは概念…って馬鹿かって感じだわな。

280 :デフォルトの名無しさん:2006/12/04(月) 17:41:10
オブジェクト指向:関連するデータ構造とアルゴリズムを乖離させないのが目的。クラスその他は実現のための手段
じゃだめなの?
多態性の本質を的確に教えてくれ(´・ω・`)

281 :デフォルトの名無しさん:2006/12/04(月) 18:02:05
>多態性の本質を的確に教えてくれ(´・ω・`)

インタフェイスと実装の論理的な分割じゃねーの。
実装が変わっても、インタフェイスが同一であれば接続可能。

282 :デフォルトの名無しさん:2006/12/04(月) 18:13:34
クラス使えればオブジェクト指向かとおもってたよorz
具体的にコード書くのは仕事やってればいやでも身につくけど
こういうのは自分で勉強しないとだめだからねぇ・・・
今からでもまじめに勉強しようかな

283 :デフォルトの名無しさん:2006/12/04(月) 19:03:36
>>282
英語版のwikipediaお薦め

284 :デフォルトの名無しさん:2006/12/04(月) 20:24:10
これぞ窮極のオブジェクト指向
http://pc8.2ch.net/test/read.cgi/tech/1164736142/

話をSTLに戻そうぜ。

285 :デフォルトの名無しさん:2006/12/04(月) 20:36:16
>>284
もっとましなスレを出せよ。やはり嵐か?

286 :デフォルトの名無しさん:2006/12/04(月) 20:45:11
話をSTLに戻そうっていってるだけなのに荒らし扱いなんかよ・・・
OO厨は怖いな・・・

287 :デフォルトの名無しさん:2006/12/04(月) 21:12:07
そりゃお前、「俺はこんなにもわかってる奴なんだ」ってのを
必死でアピールする場を奪われちゃたまらないだろう。

288 :デフォルトの名無しさん:2006/12/04(月) 21:30:17
>>284がもっとマシなスレを出していればねぇ('A`)

289 :デフォルトの名無しさん:2006/12/04(月) 22:23:41
至高スレなくなっちゃったしなぁ。

290 :デフォルトの名無しさん:2006/12/04(月) 22:49:55
RUBYYYYYYYYYYYYYYYYYYYYYYY!!!!!!!!!!!!!!!!!!!!!!!

291 :デフォルトの名無しさん:2006/12/04(月) 23:15:02
しーしゃああああああああぷうううううううううううううううううううううううううううううううううううううう!!!!!!!!!!!!!!!!!!!!!!!!!!!

292 :デフォルトの名無しさん:2006/12/04(月) 23:30:27
しいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい

293 :デフォルトの名無しさん:2006/12/05(火) 00:13:47
RubyがC++よりはるかに優れているのは自明であって
今さらそんなことで荒らしに来るRuby信者なんか居ないから
騙っても無駄だよ。

294 :デフォルトの名無しさん:2006/12/05(火) 00:15:49
>>293
騙りも何も君みたいなのがいるじゃない^^

295 :デフォルトの名無しさん:2006/12/05(火) 05:55:02
293みたいなまともな人間がいる、から、なに?

296 :デフォルトの名無しさん:2006/12/05(火) 10:05:45
RUBYを知らない者はオブジェクト指向を知らず、という格言もあることだし。

297 :デフォルトの名無しさん:2006/12/05(火) 12:52:05
言語が優れてるだの劣ってるだのいってる人間がまともなのか・・・
言語のある特定の部分、という点ならわかるけど。

298 :デフォルトの名無しさん:2006/12/05(火) 13:06:21
ようするにD言語マンセーと。

299 :デフォルトの名無しさん:2006/12/05(火) 13:13:41
なにいってんだE言語だろ

300 :デフォルトの名無しさん:2006/12/06(水) 00:09:34
print_anyでコンストラクタを直接呼んでオブジェクト渡してますが、参照を渡していないのに
slink_iteratorのコンストラクタが2回しか呼ばれないのは、なぜでしょうか?いるんでしょうか?
以下ソースコード
template<class Iterator>
void print_any(Iterator first, Iterator last) {
while ( first != last ) {
cout << *first << ' ';
++first;
}
}
class slink_iterator {
slink_of_int* cursor;
public:
// コンストラクタ
explicit slink_iterator(slink_of_int* p =0) : cursor(p) {cout << "Constractor" << endl;}
~slink_iterator() { cout << "Destractor" << endl; }
// '++' 演算子
slink_iterator& operator++() { cursor = cursor->next; return *this; }
// '*' 演算子
int operator*() { return cursor->data; }
// '!=' 演算子
friend bool operator!=(const slink_iterator& x, const slink_iterator& y)
{ return x.cursor != y.cursor; }
};

int main() {
print_any(slink_iterator(&s1),slink_iterator());
return 0;
}


301 :デフォルトの名無しさん:2006/12/06(水) 00:24:28
>>296
RUBY信者のキモさを見事なまでに表現した格言だな。

302 :デフォルトの名無しさん:2006/12/06(水) 00:24:36
RVOとは違うんだっけ?

303 :デフォルトの名無しさん:2006/12/06(水) 01:48:05
Rubyは完全オブジェクト指向でRuby使えると大体下位互換のC++とかPythonとかJavaは
簡単に使えるようになるから東大の教養学部でもRuby教えるようになったんだよね。


304 :デフォルトの名無しさん:2006/12/06(水) 01:51:38
C++はオブジェクト指向「も」使えるだからね。正直C++で書いてるという人の9割はオブジェクト指向
というものを分かってないと思う。Ruby自体はオブジェクト指向に関してはC++より圧倒的に優れてるけど
いかんせんスクリプト言語だから遅いんだよね・・・
まあ最初に勉強する教育目的の言語ではRubyの方がいいと思うが。

305 :デフォルトの名無しさん:2006/12/06(水) 01:51:55
Ruby みたいな低級言語ですら Ruby では書けない。
その程度の記述力、実行効率。

306 :デフォルトの名無しさん:2006/12/06(水) 01:55:34
低級っていうのは言語としてよりネイティブであるということですが・・・(笑)
まあ揚げ足取りはさておき、少なくともネイティブアプリをかけること自体は
今はそんなにマイナスポイントではないね。そういうのは一部のハッカーが書けばいい。
RubyとかJavaがCとかC++に比べて今世界でもっとも広く使われるようになってきたのは
そういうネイティブコードよりも可読性、オブジェクト指向との親和性が高いからだしね。

307 :デフォルトの名無しさん:2006/12/06(水) 01:56:39
rubyがC++より圧倒的に優れてるのは当たり前だがそれはスレ違いだろ・・・

308 :デフォルトの名無しさん:2006/12/06(水) 01:58:33
いやまぁそれは同意するけど、可読性の高い良い言語でもやりたいことが
妥当な性能で出来なきゃ使えないってことも事実なわけで。

309 :デフォルトの名無しさん:2006/12/06(水) 02:06:09
でも性能が必要な現場なんてそうそうないような・・・
それに数値計算以外はrubyはCに匹敵する速度が出るし
特にネットワークアプリとかをわざわざ他の言語で書く理由がみあたらない。
スレ違いスマソ

310 :デフォルトの名無しさん:2006/12/06(水) 02:13:12
>>309
>でも性能が必要な現場なんてそうそうないような・・・
ここ C++ のスレだから、基本的に性能が必要な現場の人が語らうとこだと思う・・

311 :デフォルトの名無しさん:2006/12/06(水) 02:14:49
なんだこの流れ・・・

312 :デフォルトの名無しさん:2006/12/06(水) 02:20:37
Rubyへの嫉妬心が、
普通ならあっという間に流れて終わるだけの限りなく独り言に近い書き込みを
ここまでのホットトピックに育ててしまったのです。

313 :デフォルトの名無しさん:2006/12/06(水) 03:07:36
ルビ厨復活か?
Del厨は結局復活しなかったな

314 :デフォルトの名無しさん:2006/12/06(水) 03:42:26
ネタが無いから一人で煽ってるものとばかり

315 :デフォルトの名無しさん:2006/12/06(水) 06:30:51
>>300
デフォルトコピーコンストラクタが呼ばれてるんじゃないの?

316 :デフォルトの名無しさん:2006/12/06(水) 07:34:27
>>303
シラバス検索してみてもヒット0件だったが。

317 :デフォルトの名無しさん:2006/12/06(水) 11:17:37
>>316
ニュースで出たぞ

318 :デフォルトの名無しさん:2006/12/06(水) 17:27:23
11/3の日経一面に出てたね。来年からだって。

319 :デフォルトの名無しさん:2006/12/06(水) 17:31:34
下位互換・・・・・

320 :デフォルトの名無しさん:2006/12/06(水) 17:35:30
>>303
rubyってdefine や templateとかもあんの?
オブジェクト指向型の言語やってりゃJavaとかの習得が楽ってのはわかるけど、
それだけじゃC++を使いこなすには足りないと思うし。

321 :デフォルトの名無しさん:2006/12/06(水) 18:02:35
STLとはあんま関係ないけど自分でTemplateクラス書くときってFriend関数使う?
それともFriend関数はなるべくないようなクラス設計を目指す?

322 :デフォルトの名無しさん:2006/12/06(水) 18:55:50
>>321
使う。A.Alex が述べてたように、SmartPtr みたいなものだとメンバ関数より、
フレンド関数の方が都合がいい。

さらには、↓の理由からフレンドを使うこともある。

template< typename A > void indirect_call( A & a ) {
 ...
 do_something( a ); // a.do_something() だと、A が限定される。
 ...
}


323 :デフォルトの名無しさん:2006/12/06(水) 19:10:59
>>322
あーまさに後者の場合が問題だったんだよね。こういうときも無理矢理でもfriend使わないような
設計にしちゃった方がいいのか気になってた。
レスありがとう!


324 :デフォルトの名無しさん:2006/12/07(木) 12:02:35
C言語で構造体のコピーってmemcpyでやってましたが、
C++で構造体にstd::stringメンバが入ってる場合の構造体コピーってどうやるんでしょうか?

325 :デフォルトの名無しさん:2006/12/07(木) 12:17:48
C でも C++ でも、構造体のコピーには代入を使っておけばいい。

326 :デフォルトの名無しさん:2006/12/07(木) 20:01:50
STLport 5.1.0 release.
http://sourceforge.net/project/showfiles.php?group_id=146814&package_id=162032&release_id=352516

327 :デフォルトの名無しさん:2006/12/07(木) 20:50:01
またインストールせねば・・・

328 :デフォルトの名無しさん:2006/12/07(木) 23:31:58
もうSTLportの役目は終わっただろ

329 :デフォルトの名無しさん:2006/12/08(金) 00:12:32
>>328
_STLP_NO_EXCEPTIONS をと同等の設定をわざわざサポートしてくれるコンパイラベンダは無さそう。

330 :デフォルトの名無しさん:2006/12/08(金) 00:25:47
>>328
状態を持つアロケータをサポートしてくれたのは大きいだろう。

331 :デフォルトの名無しさん:2006/12/08(金) 00:44:17
>>330
状態って?

332 :デフォルトの名無しさん:2006/12/08(金) 00:48:50
>>331 非 static データメンバ

333 :デフォルトの名無しさん:2006/12/08(金) 01:14:37
フツーのSTLのアロケータの実装は、なんちゃってシングルトンってこと?

334 :デフォルトの名無しさん:2006/12/08(金) 01:57:08
>>333
そんなところ。
インスタンスをコンテナごとに持つところまでは決まってるんだけど、
同じ型のインスタンスを区別して扱うことを標準が強制しておらず、
現行の実装はそのことに依存してしまっているものがほとんど。

list a, b があって、これらが異なるアロケータインスタンスを使っているとき、
splice() を使って a <-> b 間で部分的な要素を受け渡すと面倒なことが起こるはず。
標準が強制しなかったのも理解できるし、 STLport の実装も(まだ見てないけど)興味深い。

335 :デフォルトの名無しさん:2006/12/09(土) 22:41:28
てすてす

336 :デフォルトの名無しさん:2006/12/13(水) 19:26:04
質問です。

multimap利用して同一キーに複数の値をinsertしたとき

iterator itr = lower_bound(key) のあと
itr++の順番で値を表示していく場合
insertされた順番に表示される、でいいのですか?

なんかうまく表現できないけど察していただけるとうれしいです。


337 :デフォルトの名無しさん:2006/12/13(水) 20:33:52
set<int> a;
a.insert(5);
setのaがあって、全ての要素に10を足す、ということをやろうとしてます
一応↓これで動く(ちゃんと15が表示される)のですが
transform(a.begin(),a.end(),ostream_iterator<int,char>(cout,"\n"),bind1st(plus<int>(),10));

aのデータの中身も変更したい時はどのようにすればよいのでしょうか
次のように書くと、5が表示されてしまいます

for_each(a.begin(),a.end(),bind1st(plus<int>(),8));
copy(a.begin(),a.end(),ostream_iterator<int,char>(cout,"\n"));

338 :デフォルトの名無しさん:2006/12/13(水) 20:41:49
>>337
setは中の値を使ってデータを並べてるんだから書き換え不可。
新たなsetを作り直すしかないと思う。

339 :デフォルトの名無しさん:2006/12/13(水) 21:46:17
足したい値が負なら要素の小さい方から、正なら要素の大きい方から足して要素並びを保証すればいいじゃない

set<int, less<int> > a;
for (int i = 0; i < 10; ++i) {a.insert(i); }
//要素の後ろから足す
transform(a.rbegin(), a.rend(), inserter(a, a.begin()), bind1st(plus<int>(), 10) );

copy(a.begin(),a.end(),ostream_iterator<int,char>(cout,"¥n"));

340 :デフォルトの名無しさん:2006/12/13(水) 22:19:02
>>336
multiset/multimapでは同値なオブジェクト同士の順番に関する保証はない

341 :デフォルトの名無しさん:2006/12/13(水) 22:35:59
>>336
それらしい記述が見つからないから未定義かもしれん。

342 :341:2006/12/13(水) 22:37:00
やべ

343 :337:2006/12/14(木) 08:53:30
>>338,339
なるほど、ちょっと理解が深まりました
一度データを追加&削除で対応することにします
ありがとうございました

344 :336:2006/12/14(木) 13:17:44
並び順に関する保証はないですか・・・

ファイルの内容を読み込んで、いくつかの種類に順番に分類するとしたら
順序コンテナを分類する数だけ用意するほか無いのでしょうか?



345 :デフォルトの名無しさん:2006/12/14(木) 13:49:41
std::map<Key, std::list<T> > でええやん

346 :デフォルトの名無しさん:2006/12/14(木) 16:50:02
vector & stable_sort & equal_rangeもあるな

347 :デフォルトの名無しさん:2006/12/15(金) 06:42:32
intやdoubleをstring型にしたいんだけど
一度sprintfなどでchar*にコピーしてからコンストラクタに渡すしか方法はないかな

348 :デフォルトの名無しさん:2006/12/15(金) 06:50:20
boostを入れてたのを思い出したのでlexical_castで解決しますた
けど、boostない環境では普通にsprintfやstringstream経由でないと不可能?

349 :デフォルトの名無しさん:2006/12/15(金) 06:51:55
>>348
Exceptional C++ Style の最初の項を立ち読みしてきなさい

350 :デフォルトの名無しさん:2006/12/15(金) 13:32:41
>>348
boostのソースを読んでみればいいじゃないか。
普通にstringstream使ってるだけだぜ?

351 :デフォルトの名無しさん:2006/12/15(金) 22:31:32
つうかstringstreamの何が不満なのか

352 :デフォルトの名無しさん:2006/12/15(金) 23:08:59
標準をそのまま使うのが急にダサいと感じ、ズレたものを好むようになる・・・中二病?

353 :デフォルトの名無しさん:2006/12/15(金) 23:16:42
強いて言うなら速度とかメモリ消費量?

354 :デフォルトの名無しさん:2006/12/15(金) 23:22:14
速度とかメモリ消費量を無意味に気にして、保守性を低下させる・・・中二病?

355 :デフォルトの名無しさん:2006/12/16(土) 03:00:41
速度を重視すべきな場合STLは使うべきではないのでしょうか。
std::vectorくらいなら大丈夫だと思ってたんですけど。
でも実装によるとか言われそうだ。

356 :デフォルトの名無しさん:2006/12/16(土) 06:27:10
>>355
使ってみて(≒測定して)から文句言え。

357 :デフォルトの名無しさん:2006/12/16(土) 06:29:23
いよいよmove semanticsが欲しくなるな

358 :デフォルトの名無しさん:2006/12/16(土) 12:09:57
iostream系は書式指定が面倒

というか俺が覚えてないから調べるのが面倒

359 :デフォルトの名無しさん:2006/12/16(土) 12:12:52
>>358
覚えていても面倒だよ。
そこでboost::ほにゃららですよ、と言うといろいろ召還しそうなのでやめとく。

360 :デフォルトの名無しさん:2006/12/16(土) 12:13:38
sage忘れごめんorz

361 :デフォルトの名無しさん:2006/12/16(土) 13:29:52
boostっていつc++にはいるんだろうね?

362 :デフォルトの名無しさん:2006/12/16(土) 14:10:09
boostのサイトでTR云々かいてあるのは入る予定なんじゃないの

363 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/16(土) 15:39:43
それは時期正式リリース候補だ


364 :デフォルトの名無しさん:2006/12/16(土) 16:54:14
俺printf使ったこと無いからiostreamの方が駱駝

365 :デフォルトの名無しさん:2006/12/16(土) 17:44:55
STL勉強中です
次のような状況で、ファンクタが書きたいんですが
こういうことって可能でしょうか

nを入力すると、nの2倍とnの2乗の集合を返す関数fがあります
set<int> f(int n);
f(1)={2,1}
f(2)={4,4}
f(3)={6,9}
f(n)={2*n,n^2}
集合aがあってaのそれぞれにfを適用して新たにbを作りたい
例えばa={1,2,3}だとするとb=f(a)={f(1),f(2),f(3)}={{2,1},{4,4},{6,9}}
このような場合に
transform(a.rbegin(),a.rend(), inserter(b, b.begin()),作りたいファンクタ);
のようなファンクタを書くことはできますか
もっと適しているデータ構造とかあるんでしょうか

366 :デフォルトの名無しさん:2006/12/16(土) 17:50:59
>>365
これじゃダメなのか?
transform(a.begin(),a.end(), inserter(b, b.begin()), f);

367 :デフォルトの名無しさん:2006/12/16(土) 19:02:21
>>366
レスありがとうございます
要領を得ない質問の仕方でした、すみません
set<int> a;
set<set<int> > b;としたら一応動くのですが
このbのデータ型もset<int>のままで動かすことは出来ないのでしょうか
(要素のほうのsetも全部親に繰り入れた感じで)
このデータ型にはとくにこだわりはなくて
ファンクタを連鎖的に適用できるような形にはできるでしょうか

一度setのsetでデータを得て、その後そのデータをsetに変更して
bにデータを代入することで目的の動作は達成できるんですが
こういう方法しかないのでしょうか

fの入力と戻り値の型が違うからこういうことになるのかと思い
set<int> g(set<int>)というのを考えたら
結局gの内部で同様の問題が起こってしまいました

368 :365,367:2006/12/16(土) 19:15:58
次のプログラムで言えば
関数gを経由しないで集合bdashを求めるようなファンクタは書けるんでしょうか

typedef set<int> SET;
typedef set<SET> SETSET;
SET f(int n){
SET a;
a.insert(n+n);a.insert(n*n);
return a;
}
SET g(SETSET a){
SET res;
for(SETSET::iterator it = a.begin();it!=a.end();++it){
for(SET::iterator it2 = it->begin();it2!=it->end();++it2){res.insert(*it2);}
}
return res;
}
int main(){
SET a,bdash;SETSET b;
for(int i=0;i<3;++i){a.insert(i+1);}
transform(a.begin(),a.end(), inserter(b, b.begin()), f);
bdash = g(b);
copy(bdash.begin(),bdash.end(),ostream_iterator<int,char>(cout,"\n"));
}

369 :デフォルトの名無しさん:2006/12/16(土) 19:22:31
>nの2倍とnの2乗の集合を返す関数fがあります
これを分けて
int get_twice (int n) {return n;}
int get_square (int n) {return n * n;}
2回transformするとか?


370 :デフォルトの名無しさん:2006/12/16(土) 19:23:17
失礼
-int get_twice (int n) {return n;}
+int get_twice (int n) {return n * 2;}


371 :デフォルトの名無しさん:2006/12/16(土) 19:37:22
>>368
こう
typedef set<int> SET;
int get_twice(int n){return n+n;}
int get_square(int n){return n*n;}
int main(){
SET a,bdash;
for(int i=0;i<3;++i){a.insert(i+1);}
transform(a.begin(),a.end(), inserter(bdash, bdash.begin()), get_twice);
transform(a.begin(),a.end(), inserter(bdash, bdash.begin()), get_square);
copy(bdash.begin(),bdash.end(),ostream_iterator<int,char>(cout,"\n"));
}


372 :デフォルトの名無しさん:2006/12/16(土) 19:39:38
>>367
set の set がただの set に変換できるの?
4 の2乗の 16 と 8 の2倍の 16 が区別できないんじゃないか?
あ、その前に set だと {4,4} からして無理だな。

373 :デフォルトの名無しさん:2006/12/16(土) 19:49:05
>>372
それがもし問題ならmultisetにすれば解決するね


374 :365,367:2006/12/16(土) 19:51:43
>>369,370
レスありがとうございます
確かにそれでうまくいきそうですね

ちょっと後出しになってしまって申し訳ないですが
今回2倍と2乗を返すという設定にしたのは、
質問内容の簡略化のため要素数が変わるような関数の例として作ったものです
実は、あるパズルを解くために
数字をn個使って作れる数の集合を求める関数というのが必要になり
この場合、2倍と2乗のように入力と出力の数が同じになるように
うまく分割することが出来なさそうなんです
(出来るかもしれないけど、自分にはわからないので・・
一応、さっきのプログラムの要領で解決はできそうなんですが
他に良い方法ってあるでしょうか

375 :デフォルトの名無しさん:2006/12/16(土) 19:57:04
> 数字をn個使って作れる数の集合
こういう感じ?
n = 1のとき{1, 2, 3, ..., 9}
n = 2のとき{10, 11, 12, ..., 99}

376 :365,367:2006/12/16(土) 20:00:34
>>371
申し訳ないです
レス書いてる間にプログラムまで、感謝です

>>372
今回は区別の必要がないので、
同じ値があったら追加しないということにしたら変換できるかなと
必要なら>>373さんのようにすればよいと思います

377 :365,367:2006/12/16(土) 20:04:51
>>375
はい、イメージとしてはそんな感じです
自分が今やっているのは、
例えば加算の演算子+と、同じ数値を並べる演算子があったとして
1をn個並べる関数をfとしたら
f(1)={1}
f(2)={1+1,11}={2,11}
f(3)={1+1+1,11+1,111}={3,12,111}
というような関数です

378 :デフォルトの名無しさん:2006/12/16(土) 23:08:17
質問があります。

typedef struct stdata{
int nNum;
string sText;
}LISTDATA_T;

vector<LISTDATA_T> vlist;

というデータがあるとして、vectorのデータ内を
nNumの値でソートしたいのですが可能でしょうか?

379 :デフォルトの名無しさん:2006/12/16(土) 23:11:26
そういう関数オブジェクトを作れば可能。
或いは全体的にnNumで比較するのが適切であれば、
operator <の定義を考えたほうが良いかもしれない。

380 :デフォルトの名無しさん:2006/12/16(土) 23:18:47
template <class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
お使いのでこれが対応知れてば余裕。

381 :378:2006/12/16(土) 23:27:23
>>379,380
レスありがとうございます。
試してみます。

382 :355:2006/12/17(日) 03:34:55
容量1000の配列全要素に対してforで回して0を代入するという動作を10000回繰り返した。
配列は配列([])とstd::vectorで[]を使ったのとiteratorを使ったの3通り。
std::vectorで[]を使うと配列の時の約2.5倍、
iteratorを使うと配列の時の約1.5倍時間がかかった。

383 :デフォルトの名無しさん:2006/12/17(日) 05:03:01
処理時間が一時間とか一日とかかかるプログラムでは致命的だな。
どうしようもない。

384 :デフォルトの名無しさん:2006/12/17(日) 05:10:57
最適化で全くかわるね
Linux GCC 

-O3 だと
vector[] = array[] > vector::iterator > vector.at()

-O1 だと
array[] > vector[] > vector.at() > vector::iterator

ただ、最速、最遅で4倍も違わないからどれでもいいと思う。
こんなのカスみたいなコストだ。

385 :デフォルトの名無しさん:2006/12/17(日) 08:26:07
そりゃまぁ、ほぼ無意味なループで速度比較してもそんなもんだよな。
実際にはループ一回辺りの処理時間が増えるからますますその差の意義が薄れる。

386 :デフォルトの名無しさん:2006/12/17(日) 11:44:53
>>382
0で埋めた後でその総和を取ったりとかしてないと、そもそもループ丸ごと最適化で消されたりするんだが。
ちゃんとやってるよな?

んでうちの結果はイテレータのみ倍遅い。あとは全部誤差の範囲。
つーか、10000回程度だと負荷が軽すぎだろ。

387 :デフォルトの名無しさん:2006/12/17(日) 12:27:17
vectorの提供する機能と必要なコストを天秤にかけて
妥当だと思うときにvectorを使うのよね
array[]で済むならarray[]使えばいいのです

388 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/17(日) 20:48:16
内側でvolatileな変数宣言したりしてればきちんと阻害される

389 :デフォルトの名無しさん:2006/12/18(月) 21:51:49
iteratorのforでの書き方にもよりそうだが

390 :デフォルトの名無しさん:2006/12/18(月) 23:41:25
>>382,>>387
vector<int> v;
v.resize(1000);
int *p=&v[0];
としてv[i]のかわりに *(p+i)を使えば速度は同じになる。

391 :デフォルトの名無しさん:2006/12/18(月) 23:45:00
ループのマイクロベンチが何だというんだ。
マイクロベンチで1:2.5みたいな差が出ても
アプリに落ちれば30:31.5くらいだろw

392 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/18(月) 23:59:29
そこでvector<Is32vec4>とか

393 :デフォルトの名無しさん:2006/12/19(火) 00:05:01
>>382
配列は代入のみでvectorはallocateと代入で、比較してる操作が
違うから当然の結果だろうね。resizeしての比較をするべきだろう。

394 :デフォルトの名無しさん:2006/12/19(火) 01:41:46
>>393
allocateは関係なく、単純な代入だけでも差がでる。
関数をコールしている分vectorは遅いのではないか?


395 :デフォルトの名無しさん:2006/12/19(火) 01:55:41
>>394
最適化はかけたか?デバッグオプションは付いてないか?

396 :デフォルトの名無しさん:2006/12/19(火) 03:10:31
>>394
具体的なベンチコードとコンパイラの名前とバージョンさらせ。

397 :デフォルトの名無しさん:2006/12/19(火) 06:54:48
>>394
inline関数が遅いなんてことはない。operator[]が
*(begin() + _Pos)なので遅い。

398 :デフォルトの名無しさん:2006/12/19(火) 07:57:08
>>397
> *(begin() + _Pos)なので遅い。
なんでだよ

399 :デフォルトの名無しさん:2006/12/19(火) 09:20:35
beginはinspectorだろ。

400 :デフォルトの名無しさん:2006/12/19(火) 09:26:13
>>399
それが遅い理由なの?
ごめん。意味わかんない。 inspector って、何の用語?

401 :394:2006/12/19(火) 14:23:35
>>395-397
VC++7.1,stlportをマルチスレッドオプションを付けてコンパイルしている
(cl /GX /O2 /MT ...)
やはりvectorの方が普通の配列より2割ぐらい遅いね。

402 :デフォルトの名無しさん:2006/12/19(火) 14:24:54
マルチスレッドだとアロケートがコスト(比較的)大だからなぁ・・・

403 :394:2006/12/19(火) 14:33:26
resizeしてから計測しているのでallocateは関係ないはず

404 :デフォルトの名無しさん:2006/12/19(火) 14:57:45
forなんかでまわさずTSCで計ったら?


405 :デフォルトの名無しさん:2006/12/19(火) 15:31:20
javaでいうLinkedHashMapみたいなのは自作しないと無理?
挿入順序覚えてくれてる連想配列なんだけどvectorとmap併用かしら?

406 :デフォルトの名無しさん:2006/12/19(火) 15:41:56
とりあえずVC++7.1+付属のSTLでは、
for (int i = 0; i < 1000; ++i)
array[i] = 0;
for (int* b = array, *e = array + 1000; b != e; ++b)
*b = 0;
for (int i = 0; i < 1000; ++i)
vec[i] = 0;
の三つに対して、同じ
lea edi, DWORD PTR _array$[esp+4064]
xor eax, eax
mov ecx, 1000
rep stosd

というようなコードを吐いた。よってこの3者は完全に等価。STLportはシラネ

407 :デフォルトの名無しさん:2006/12/19(火) 16:55:23
Boostにmulti_index_containerという複数の順序付けを指定できるコンテナがあるんだが、だめか?

408 :デフォルトの名無しさん:2006/12/19(火) 18:42:47
>>407
だめ だけど勉強になりました。
ありがとう。

409 :デフォルトの名無しさん:2006/12/19(火) 18:57:04
vectorはヒープから割り当てるから、
スタック上の配列と比べてメモリのキャッシュに乗りにくいのかな。

410 :デフォルトの名無しさん:2006/12/19(火) 18:59:14
アロケー(ry

411 :デフォルトの名無しさん:2006/12/19(火) 19:35:04
すみません、質問させてください
基本型あるいはユーザ定義型の配列の要素数を返す関数を作ろうとしてるんですが
arrayがユーザ定義型の配列であった場合でも
/* @ */の処理がコンパイルされるためエラーになってしまいます

template <typename T> void count(T array[]){
if(boost::is_pod<T>::value){/* @ */}
else{/* A */}}

WEBで調べているとenable_ifで解決できそうな予感がしたのですが
自分には次の例がよく理解できません(特に::type*=0の部分)
これはどういった理屈で動いているんでしょうか

template<typename T> void copy_n( const T* from, int n, T* to,
typename enable_if< is_pod<T> >::type* =0 ){/* 省略 */}

412 :411:2006/12/19(火) 19:49:26
あ、boostスレと間違えた^^;
向こうで質問しなおしますね

413 :デフォルトの名無しさん:2006/12/20(水) 11:18:30
質問です。
for(vector<shared_ptr<A> >::iterator itr = a.begin(); itr!=a.end(); ++itr) {
hogehoge....
}
とやろうとしたのですが、vector<shared_ptr<A> >::iteratorじゃなくて
vector<shared_ptr<A> >::const_iteratorで a.begin()を受けろとコンパイラに怒られてしまいました。
vector<shared_ptr<A> >::iteratorで受けたいのですが、どうすればよいのでしょうか。

vector<shared_ptr<A> >::const_iteratorをvector<shared_ptr<A> >::iteratorに変換できれば
それでもよいですが・・・。

414 :デフォルトの名無しさん:2006/12/20(水) 11:25:44
>>413
aがconstなんだろ。
const_castすればいけるだろうが、それは何か間違ってる。

415 :デフォルトの名無しさん:2006/12/20(水) 11:42:13
>>413
vector< shared_ptr<A> > b = a;
for( vector< shared_ptr<A> >::iterator itr = b.begin(); ...

416 :デフォルトの名無しさん:2006/12/20(水) 11:46:55
おっしゃるとおり、aがconstでした。ありがとうございました。

417 :デフォルトの名無しさん:2006/12/20(水) 18:27:26
STLのsetを使っていて、だいたい

set<X> a;
a.insert(b);

のようなことをやると、

Core was generated by `XYZXYZ'.
Program terminated with signal 11, Segmentation fault.
#0  0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique ()
(gdb) backtrace
#0  0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique ()
#1  0x4000000000002aa0 in main??unw ()

のような感じでエラーになってしまうようです。
(完全に再現性のある小さいコードを用意することが
出来ませんでした。すみません。)

コンパイラはicc9.0で、gccだと問題なく動作します。
個人的にはsetのinsertでcoreを吐くというのは、
あまりないような気がするのですが、どういうことを
念頭におきながらデバッグすればよいでしょうか?

418 :デフォルトの名無しさん:2006/12/20(水) 18:34:15
まず何処で落ちてるのか、STLの中まで追っかける。

419 :デフォルトの名無しさん:2006/12/20(水) 18:41:02
>>417
原因はsetというより十中八九
Xだろうね


420 :デフォルトの名無しさん:2006/12/20(水) 19:08:30
とりあえず、-fastをつけずにコンパイルすると大丈夫みたいです。
-fastと-ggdbをつけてデバッグした結果です:

Core was generated by `./XYZXYZ'.
Program terminated with signal 11, Segmentation fault.
#0  0x400000000002f320 in _ZNSt8_Rb_treeI6XS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE13insert_uniqueERKS0_ ()
    at /usr/include/c++/3.2.3/bits/stl_algobase.h:747
747             if (*__first1 < *__first2)
(gdb) backtrace
#0  0x400000000002f320 in _ZNSt8_Rb_treeI6XS0_St9_IdentityIS0_ESt4lessIS0_ESaIS0_EE13insert_uniqueERKS0_ ()
    at /usr/include/c++/3.2.3/bits/stl_algobase.h:747
#1  0x4000000000002aa0 in main () at /usr/include/c++/3.2.3/bits/stl_alloc.h:248

ええっと、参照されてるSTLがgcc由来のものなのが気になります。
(icc9はgcc3系と結合出来るみたいですけど)
とりあえずOSはGNU/LinuxでCPUはItanium2です。

421 :デフォルトの名無しさん:2006/12/21(木) 03:32:29
-fastの代わりに-O3 -ipoにしてみるとどうなるかな。

422 :デフォルトの名無しさん:2006/12/21(木) 06:27:28
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。


423 :デフォルトの名無しさん:2006/12/21(木) 07:44:03
>>417
問題の再現するソースと再現しないソースの違いを洗っていけばいいんだよ。

424 :デフォルトの名無しさん:2006/12/21(木) 12:08:27
選択機

425 :デフォルトの名無しさん:2006/12/21(木) 15:52:54
STLの定数(std::ios::outとか)の定義について
VC6付属のSTLではenumで定義されてるけど、
VC8付属のSTLではclass _Iosbのメンバで
static const _Openmodeで実体があるのはなぜ?

VC6の時はstatic const に初期値を設定できないから
enumハックを使用していると思うんだけど
static const にして実体を持つようにした理由がわからない。
なにか利点あるの?


426 :デフォルトの名無しさん:2006/12/21(木) 21:22:37
>>425
元々列挙値じゃないのに enum を使ってたのが不自然なんだから、
普通に改めたんだろ。逆に、何か不満な点でもあるの?

427 :425:2006/12/22(金) 15:36:23
enumの方が実体がない分サイズの節約になるし(微々たる量だけど)
利用する箇所でもコンパイル時に値が確定するから、
高速化しそうな気がするんですが。
(static constも最適化されて同じかもしれませんが、
それを期待するのはどうかと思って。)

428 :デフォルトの名無しさん:2006/12/22(金) 16:03:40
>>427
サイズのデメリットは型の正しさの前では無視できる範囲だと思うよ。
サイズと引き換えにアドレス(参照)を取ることができるようになるから、
相殺と考えることもできるだろう。

static const でも、整数型(および列挙型)でクラス定義内で初期化子を
つけたものはコンパイル時定数として使うことができる。
これは規格で定められた動作なので、最適化に期待するというものではない。

429 :425:2006/12/22(金) 17:29:48
>>428
参照ってのは思いつきませんでした。なるほど。
型の正しさはenumでも同じですよね。

>static const でも、整数型(および列挙型)でクラス定義内で初期化子を
>つけたものはコンパイル時定数として使うことができる。

 規格で定義されてるんですね。
 知りませんでした、ありがとうございます。


430 :デフォルトの名無しさん:2006/12/22(金) 23:04:23
>>429
> 型の正しさはenumでも同じですよね。

typesafe enum知らない人?
enumはあまりtypesafeじゃないよ。初級なんでググってみて。

431 :425:2006/12/23(土) 04:28:27
>>430
typesafe enum知らなかったからぐぐって見た。
javaばっかりヒットするのね。
Cはtypesafeではないけど、C++のenum は 型チェックしてくれるから、
typesafeなんじゃないのと思ったり。


それはそれとして、enumはtypesafeではないかも知れないけど、
static const _Openmodeで実体を持つ場合も同じではないの?

432 :デフォルトの名無しさん:2006/12/23(土) 11:53:17
>C++のenum は 型チェックしてくれる
???

433 :デフォルトの名無しさん:2006/12/23(土) 14:49:18
>>429
> 型の正しさはenumでも同じですよね。

組み込み整数型で特殊化した template に
enum で定義された定数を渡して特殊化版が
呼び出されないとか、困るかもしれない。

434 :デフォルトの名無しさん:2006/12/23(土) 20:21:18
初心者です。

listのメンバ関数のsortで、
↓みたいな使い方が出来るそうですが、使い方を詳しく紹介している
 サイトがあったら教えてください。
c.sort()
c.sort(op)
※ cはリスト

sort()だと昇順にソートすることは、分かったつもりですが、
listの型がcharだった場合とかsort(op)の使い方がわかりません。
↓私は今ここを参考にしています。
http://wing.zero.ad.jp/~zbe11018/cycode/tips/cbuilder/stl-master.html



435 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/23(土) 21:02:38
opに比較関数を渡してやればおk

struct comp {
 bool operator() ( const char a, const char b ) const {
  bool bResult;
  //ここに必要な処理を書く
  return bResult;
 }
};


c.sort( comp() );

ファンクタを渡してやれば、逆順ソートとか文字列の大文字小文字区別無しソートとかも可能。
Windows XPのファイル名ソートみたいに、文字コード順ではなく含まれる数値順でソートやるのだって可能。




俺的にはここがいいかな
http://www.wakhok.ac.jp/~sumi/stl/index.html

デスクトップリファレンス的なものは置いておいた方がいいよ。
俺が使ってるのはオライリーのC++ランゲージクリックリファレンス/C++ライブラリクリックリファレンス。

436 :デフォルトの名無しさん:2006/12/23(土) 21:23:38
>>435
>opに比較関数を渡してやればおk
>
>struct comp {
> bool operator() ( const char a, const char b ) const {
>  bool bResult;
>  //ここに必要な処理を書く
>  return bResult;
> }
>};
>
>
>c.sort( comp() );
>
>ファンクタを渡してやれば、逆順ソートとか文字列の大文字小文字区別無しソートとかも可能。
>Windows XPのファイル名ソートみたいに、文字コード順ではなく含まれる数値順でソートやるのだって可能。

丁寧な回答感謝します。昇順ソートだけじゃなくて
いろいろなソートが出来るんですね。


>俺的にはここがいいかな
>http://www.wakhok.ac.jp/~sumi/stl/index.html
>
>デスクトップリファレンス的なものは置いておいた方がいいよ。
>俺が使ってるのはオライリーのC++ランゲージクリックリファレンス/C++ライブラリクリックリファレンス。

私も参考にしたいと思います。


437 :デフォルトの名無しさん:2006/12/23(土) 22:56:38
>>436
不要な引用は見づらいだけなので気をつけたほうがいいよ。

438 :デフォルトの名無しさん:2006/12/24(日) 04:19:11
良質なSTL本を教えて下さい。
2冊欲しいと思っています。

1.
STLの基本概念や、各機能の説明が分かりやすく
説明されている物(vector, mapとはどういう物かとか)。

2.
STLの内部実装の事や、効率面を考えた時に、知っておいた方が良い事が纏められている様な物。
要するに、かなり深く突っ込んだ内容のものがいいです。

439 :デフォルトの名無しさん:2006/12/24(日) 04:22:38
>>1
1.C++標準ライブラリ
ISBN4-7561-3715-6

2,Effective STL
ISBN4-89471-410-8

440 :438:2006/12/24(日) 04:22:57
じゃなかった
>>438

441 :439:2006/12/24(日) 04:24:02
酔ってるゴメン
でもISBNは合ってると思うのでとりあえずamazonで見てみて

442 :デフォルトの名無しさん:2006/12/24(日) 04:26:29
>>441
おお、即レスありがとうございます。
早速色々と見てみたいと思います。

443 :デフォルトの名無しさん:2006/12/24(日) 06:38:49
初心者です。わからないのですが教えてください。

444 :デフォルトの名無しさん:2006/12/24(日) 11:20:56
イテレータのスコープがよくわかりません。
同一関数のスコープ内で同名で違うイテレータを定義した場合、前に定義したイテレータは消えるようですが、
宣言としては、グローバル変数や引数と名前がかぶらないように注意するだけでよい、ということでしょうか?

445 :デフォルトの名無しさん:2006/12/24(日) 11:28:25
定義って何?
typedefのこと?
それとも実体をつくること?

446 :444:2006/12/24(日) 12:27:51
失礼しました。実体のほうです。たとえば、2つのベクトルの最大値を求めたい場合、

vector<T> vect1, vct2;
(データを代入)
vector<T>::iterator k = max_element( vct1.begin(), vct1.end() );
vector<T>::iterator k = max_element( vct2.begin(), vct2.end() );

とするわけですが、このときのイテレータkのスコープを知りたい、ということです。
STLは勉強し始めたばかりなので、何かへんなことを聞いていたら申し訳ないです。

447 :デフォルトの名無しさん:2006/12/24(日) 12:35:52
そっちか。
STL関係ない。
「イテレータ」を「変数」に置き換えて >>444 を復唱してみろ。

448 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/24(日) 12:38:16
コンパイル通るかどうか試してみましょう。
通らないものを作っても無駄な作業でしかないです。

449 :444:2006/12/24(日) 12:43:16
>>447-448
もちろん、通ることは確認済みなのですが、理屈がわからずに使うのは気持ち悪い、と思いまして確認させていただきました。
イテレータのスコープはローカル変数と同じと考えてよい、ということですね。
ありがとうございました。

450 :デフォルトの名無しさん:2006/12/24(日) 12:49:28
>>449
同じスコープで同名の変数は定義できないよ。
どんなクズコンパイラ使ってんだ?

それに、結論も違う。「イテレータの値をローカル変数に入れている」と考えろ。
そうなればスコープについてローカル変数のルールに従うのは自明なはず。

451 :デフォルトの名無しさん:2006/12/24(日) 13:08:36
イタレータに限らずオブジェクトにスコープという概念はないよ。
スコープを持つのは、宣言や定義。
オブジェクトはエクステント(extent)。普通生存期間と訳されている。
この区別は、言葉だけの問題ではなく、基礎概念の理解につながっている。

452 :デフォルトの名無しさん:2006/12/24(日) 14:25:55
STLが使えて>>446がコンパイル通るコンパイラっていったいなんだろう…。

453 :デフォルトの名無しさん:2006/12/24(日) 14:33:06
んなもんあるわけねーだろ
通ったってのはウソだよ

454 :デフォルトの名無しさん:2006/12/24(日) 14:42:57
彼女いなくてもtypo位許してやれよ

455 :444:2006/12/24(日) 14:54:32
>>450
vector<T> vect1, vct2;
(データを代入)
vector<T>::iterator k = max_element( vct1.begin(), vct1.end() );
k = max_element( vct2.begin(), vct2.end() );

でした。すみません・・・
>>450-451については、基礎的概念をきちんと勉強してステップアップにつなげたいと思います。
ハウツー本ばかりの自我流で、まともな概念書を読んだこともなかったので。
今、「STLによるC++プログラミング」2rd,マッサー他 を読んでいるのですが、敷居が高いっす。
ネットのハウツー参考にしながら感覚的には理解し始めているのですが・・

456 :デフォルトの名無しさん:2006/12/24(日) 14:56:16
>>455
一般的な変数のスコープとオブジェクトの生存期間について理解してからSTLに取り組むことをお勧めします。

457 :デフォルトの名無しさん:2006/12/24(日) 15:45:18
>>455
君のそのコードは
int hoge = 10;
hoge = 5;
と何が違うんだい?

458 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/24(日) 16:16:37
そもそもCをわかってないのにSTLを使おうとしてないかな

459 :デフォルトの名無しさん:2006/12/24(日) 16:19:56
そもそもsageを分かってないのにスレに書き込もうとしてないかな

460 :デフォルトの名無しさん:2006/12/24(日) 19:17:04
頭の悪い切り返しにもほどがあるな

461 :デフォルトの名無しさん:2006/12/24(日) 21:07:13
>>392見ればsageを知らないわけではないことくらいわかるだろうに

462 :・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6 :2006/12/24(日) 21:07:58
チェック抜けてただけなんだよね

463 :デフォルトの名無しさん:2006/12/24(日) 21:12:11
そこは気付よ

464 :デフォルトの名無しさん:2006/12/25(月) 22:02:58
あるファイルのiostreamを与えられるんだが、
そのファイルはユニコードで書かれている。
なのでiostreamをbasic_iostream<wchar_t>あたりに変換したいんだが
なんか便利な方法ある?
std::wstring str;
std::getline(stream,str);
みたいに使いたいわけなんだが。


465 :デフォルトの名無しさん:2006/12/25(月) 22:54:43
最近ageるのがデフォなのか?

466 :デフォルトの名無しさん:2006/12/25(月) 22:58:05
昔、「質問するときはage」って誰かに聞いたんだが
間違いだったか。
ならスマソ


467 :デフォルトの名無しさん:2006/12/25(月) 23:18:27
「とにかくsageなきゃいけない」と思い込んでる頭のおかしな人が
たまにいるんだよ。

ちなみに、そういう人に「なんでageちゃいけないのか」を訊くと、
なぜか回答らしい回答が無いかわりに人格攻撃とか始めるから注意な。

468 :デフォルトの名無しさん:2006/12/25(月) 23:36:34
結局>>464はぬるぽ

469 :デフォルトの名無しさん:2006/12/26(火) 01:01:35
>>464
ない

470 :デフォルトの名無しさん:2006/12/26(火) 13:28:12
あげ

471 :デフォルトの名無しさん:2006/12/26(火) 15:05:06
>>464
codecvtで頑張ってくれ


472 :デフォルトの名無しさん:2006/12/26(火) 16:18:38
>>464
read でバイト列読んで、memcpy でもすれば?

473 :デフォルトの名無しさん:2006/12/27(水) 13:41:47
>>464
あんまり分かってないんで、とりあえず「最悪、これなら行ける」方法。
iostreamをstringで受けて、それをここにあるような関数で変換する。
http://hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html
(↑の一番下のリンク)
iostreamそのものを変換ができるのかは知らない。すみません。


474 :デフォルトの名無しさん:2006/12/27(水) 14:31:59
それにしても、最初から wifstream を渡してもらえたら楽なのにねえ。

475 :デフォルトの名無しさん:2006/12/27(水) 17:24:59
>>464
 便利だけど簡単かどうかはわからない。
Boost.Iostreamsでなんとかするというのはどうだ?

476 :デフォルトの名無しさん:2006/12/27(水) 17:52:06
>>464
ファイルの中身が Unicode (UTF-16と仮定)なら、2BYTEずつ読んで、
wstring に追加していけばいいんじゃない。楽な方法はないと思う。

wgetline( istream & i, wstring & str ) {
 char wrk[2] = {0};
 while( !!i.read( wrk, 2 ) ) {
  wchar_t ch;
  memcpy( ch, wrk, 2 );
  if( ch == L'\n' ) break; // 超適当。
  str += ch;
 }
}

477 :デフォルトの名無しさん:2006/12/27(水) 19:27:47
streambuf実装してwistreamでラップするとか

478 :デフォルトの名無しさん:2006/12/28(木) 20:40:59
Boost.Iostreamsも結局やることはそれなんだよな。

479 :デフォルトの名無しさん:2007/01/03(水) 23:15:54
WikipediaのSTLの項目で難解さのコード例があるけど、
remove_ifよりpartitionの方が効率がよかったりするの?

480 :デフォルトの名無しさん:2007/01/04(木) 02:17:07
>>479
remove_if() は operator = () によるコピー、
partition() は swap() による移動を使う。
あとは中身によってどっちが効率いいか決まるだろう。

481 :デフォルトの名無しさん:2007/01/04(木) 10:02:54
サンクス。把握した。

482 :デフォルトの名無しさん:2007/01/09(火) 21:46:58
すみませんが、質問です。
テンプレート関数の宣言で、型名がやたらと長くなってしまう場合、typedef
などで短縮名を付けることはできないのでしょうか?

T::value_type ぐらいならまだしも、boost::range_value< S >::type ぐらい
長くなると、これを引数や戻り値に何度も書くのは、なかなか冗長です。

こういう宣言を、
//------------動くが、戻り値の型名が長い----------
template <typename S>
typename boost::range_value< S >::type
join5(S b, // 開始イテレータ
S e, // 終了イテレータ
typename boost::range_value< S >::type s // 区切り文字列
)

//------------↓は実際は動かない----------
template <typename S>
typedef boost::range_value< S >::type T;
T join5(S b, // 開始イテレータ
S e, // 終了イテレータ
typename boost::range_value< S >::type s // 区切り文字列
)

などと書きたいところなのですが。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep08032000.asp
しかしここを見ると、typedefのテンプレート化はできないようです。


483 :482:2007/01/09(火) 21:49:00
すみません、貼るコードを少し間違えました。

//------------↓は実際は動かない----------
template <typename S>
typedef boost::range_value< S >::type T;
T join5(S b, // 開始イテレータ
S e, // 終了イテレータ
T s // 区切り文字列
)

まあ、動かない擬似コードではありますが。

484 :デフォルトの名無しさん:2007/01/09(火) 23:10:50
そこで前処理、#defineはどうでしょう。

485 :デフォルトの名無しさん:2007/01/09(火) 23:30:59
Oeeeee

486 :デフォルトの名無しさん:2007/01/09(火) 23:50:50
>>482の記事は2000年のものなのですが、2007年の今も状況は変わっていない
ということなのでしょうか?Boostあたりで何か便利なものが生まれていない
かと思ったのですが。

>>484
C++なので、できたらマクロは使いたくないです。482の記事にもありますが、
予測を裏切る作用が多いので。


487 :デフォルトの名無しさん:2007/01/10(水) 00:44:49
template<typename S>
struct Hoge { typedef typename boost::range_value< S >::type T; };

template <typename S>
Hoge<S>::T join5(S b, // 開始イテレータ
S e, // 終了イテレータ
Hoge<S>::T s // 区切り文字列
)

488 :482:2007/01/10(水) 01:15:48
>>487
ありがとうございます。さっそく試してみました。

GCCなどでは、Hoge<S>::T の前の typename は省略できません。すると、
typename boost::range_value< S >::type

typename Hoge<S>::T

かなり短くなりますが、T 一文字まで短くはならないようです。

また、構造体Hogeには他の応用がほとんどないのに、グローバルな名前空間に
登録されてしまうのも、ちょっと残念な気がします。


489 :デフォルトの名無しさん:2007/01/10(水) 14:44:14
書く以外にない
むしろフルネームなのに相当短いぞ
boost::range_library::metafunctions::range_value_of<S>::type
とかじゃなくて良かっただろう

490 :482:2007/01/10(水) 17:12:23
>>489
おっしゃることはもっともですが、では実際にそういう型名の関数を宣言しな
ければならなかったら、どうしたら良いのでしょう?

関数じゃなくてクラスだったら、typename boost::range_value<S>::type 程
度の長さでも、誰もがすぐに内部でtypedefしてしまうと思うのです。

template <typename S>
class join11 {
  typedef typename boost::range_value<S>::type T;
public:
  T operator()(S b, // 開始イテレータ
               S e, // 終了イテレータ
               T s  // 区切り文字列
               )
  {
    T ss;
    for (S i = b; i != e; ) {
      ss += *i++;

    if (i != e)
      ss += s;
    }
    return ss;
  }
};

だけどファンクタって、型変数指定が必須で、こういう用途には使いづらいですよね。
wcout << join11<vector<wstring>::iterator>()(v1.begin(), v1.end(), L"*") << endl;


491 :デフォルトの名無しさん:2007/01/10(水) 17:30:21
書く以外に無い。
どうしてもイヤだったら>>487みたいなヘルパ書いて
適当なnamespaceに閉じ込めておけばよかろう。

492 :デフォルトの名無しさん:2007/01/10(水) 19:19:04
>>490
それにレイヤーを被せると

template<template<class> class Join>
struct xjoin_
{
template<typename S, typename T>
typename Join<S>::T operator()(S b, S e, T s) const
{
return Join<S>()(b, e, s);
}
};

xjoin_<join11> const xjoin = {};

xjoin(v1.begin(), v1.end(), ..);

一般的に解決するのは難しい。が、
タイプを減らすように部分的にデザインすることはできる

493 :482:2007/01/10(水) 20:49:27
みなさん、ありがとうございます。

>>491
たしかに、それが現実的な気もします。

>>492
template<template<class> class Join>
恥ずかしながら、この記述が分かりませんでした。
テンプレートを引数に取るテンプレートなのでしょうか?
何か参考になるリンクを教えていただけませんか?


494 :482:2007/01/10(水) 21:06:10
じつは、>>482のリンク先もよく分かってません。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep08032000.asp
の一番下のほうに、
> rebind<T>::other の方法で十分であると判断した

と書いてありますが、
この方法は、自分自身が持つ型変数を変更した型を返せるクラスと、それを
保持するコンテナの定義の仕方でしかないと思うのです。
これがどうしてtypedefのテンプレートとして使えるのか、理解できないのです。


495 :デフォルトの名無しさん:2007/01/10(水) 21:06:56
class Test
{
public:
int hoge(int x)
{
std::cout << x << std::endl;

return x;
}

};

int main()
{

Test t;

std::bind2nd(std::mem_fun_ref(&Test::hoge),100)(t);

}

Test::hoge が constメンバ関数でないのにコンパイルエラーにならないのはなぜ?

cygwin gcc 3.4.4 です。

496 :デフォルトの名無しさん:2007/01/10(水) 22:25:30
>>495 なんでコンパイルエラーになると思うの?

497 :デフォルトの名無しさん:2007/01/10(水) 22:45:41
>>496
bind2nd の第一引数が const で Test::hoge が constメンバでないから

498 :デフォルトの名無しさん:2007/01/10(水) 22:57:44
constになるのは、std::mem_fun_refの戻り値であるstd::mem_fun_ref_t<int, Test, int>のオブジェクト。

499 :デフォルトの名無しさん:2007/01/10(水) 23:13:07
>>498
しかし std::bind1st(std::mem_fun_ref(&Test::hoge),t)(100)
ではコンパイルエラーになります。
Test::hoge を const メンバにすればエラーになりません。




500 :482:2007/01/10(水) 23:34:45
何度もすみません、>>494だけ分かりました。

このようにコンテナとその要素を設計すると、
要素のクラス<型変数> を
X::rebind<型変数>::allocator_type
という決まった形式で呼べる、ということです。
だから呼び出し側の形式を固定化、汎用化できる、ということです。

しかし、固定化はできますが、その固定の形式は全然自由でありません。
この実装だと、
呼び出される側は 要素のクラス<型変数>
呼び出す側はX::rebind<型変数>::allocator_type
この形式でしか扱えないのです。typedef の自由さとはかけ離れています。
しかもたいていの場合、呼び出し側は元の型名より長くなってしまいます。

まあそれ以前に「コンテナとその要素の組み合わせでしか使えない」
ので、今回の「関数に与える型名を短くしたい」という目的には全く適わない
のですが。


501 :482:2007/01/10(水) 23:36:42
>>492については、私はテンプレートにうとくて分かりません。
もっと勉強して、考えてみます。


502 :デフォルトの名無しさん:2007/01/11(木) 00:11:43
>>499
bind1stの第2引数はconst参照を取る。
std::mem_fun_ref_t<int, Test, int>::operator()はTestの非const参照を取る。

どっかで見たことあると思ったら、ここのか。
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200701/07010013.txt

503 :デフォルトの名無しさん:2007/01/11(木) 00:13:35
>>499
bind1st(), bind2nd() で束縛する引数の型が const T& と定義されているせい。

関連して、こんなの見つかったけど、ちょっと違うか?
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#109

まぁ boost::bind() に逃げるのがいいんだろうな。
boost::bind(&Test::hoge, _1, 100)(t);
boost::bind(&Test::hoge, t, _1)(100);

504 :デフォルトの名無しさん:2007/01/11(木) 00:15:08
なんだマルチか。

505 :デフォルトの名無しさん:2007/01/13(土) 21:35:18
stl::stringラップして
sprintf書式でバッファサイズ気にしなくてよくてある程度高速なformat()を実装してる例ってないですか?

506 :デフォルトの名無しさん:2007/01/13(土) 21:40:43
STLと関係ないな

507 :デフォルトの名無しさん:2007/01/13(土) 22:08:21
>>505
その条件に完全にマッチするわけではないが
http://tricklib.com/cxx/dagger/xstring.h
こんなのならある。

508 :デフォルトの名無しさん:2007/01/13(土) 22:25:54
サンクス

509 :デフォルトの名無しさん:2007/01/14(日) 00:25:56
boost::format

510 :デフォルトの名無しさん:2007/01/15(月) 19:58:53
質問です
VC8ではエラーになるんですが、これは書式としてはあっているんでしょうか
//STLコンテナと、データを入れて、データがコンテナにあるか調べる関数
template <template <typename T,class Allocator = allocator<T> >
class STLC,typename U>
bool has_data(STLC<U>&data,U&value){
STLC<U>::iterator it = find(data.begin(),data.end(),value);
if(it!=data.end())return true;
elsereturn false;
}

511 :デフォルトの名無しさん:2007/01/15(月) 21:45:47
Allocator = std::allocator<T>とtypename STLC<U>::iterator

512 :デフォルトの名無しさん:2007/01/16(火) 00:12:10
>>511
ありがとうございます
あ、typenameないとマズいですね
ご指摘の部分と、findもstd::findになおしてコンパイルしてみましたが
エラーで動いてくれないようです
あれから試行錯誤の末、型チェックはコンパイラ任せで
とりあえずは目的の動作はしました
template <template <typename T> class STLC,typename U,typename R> bool has_data(STLC<U>&data,const R&value){
typename STLC<U>::iterator it = std::find(data.begin(),data.end(),value);
if(it!=data.end())return true;
elsereturn false;
}

もしエラーが文法の問題だったとするとちょっと悔しいなぁ

513 :デフォルトの名無しさん:2007/01/17(水) 11:29:48
ちょっと疑問なんだけど
> template <template <typename T> class STLC
みたいな書き方初めて見たんだけど、どういう意味なの?

514 :デフォルトの名無しさん:2007/01/17(水) 12:25:16
template <template <typename T> class STLC,typename U,typename R>

515 :デフォルトの名無しさん:2007/01/17(水) 13:23:15
>>513
テンプレート・テンプレート・パラメータ
§8.2.3、C++ Templates
Template template parameters are placeholders for class templates.
They are declared much like class templates, but the keywords struct
and union cannot be used:

In the scope of their declaration, template template parameters are used
just like other class templates.
The parameters of template template parameters can have default
template arguments. These default arguments apply when the corresponding
parameters are not specified in uses of the template template parameter:

簡単に言うとクラステンプレートをテンプレートの引数に持てるという意味だな。
そしてそれにデフォルトの型を指定する事もできる、と。

516 :デフォルトの名無しさん:2007/01/17(水) 13:27:21
僕も一つ質問していいですか?

template <typename T, typename U> と書くのと

template <typename T>
template <typename U>

と書くのでは、どういう風に意味が違ってくるのですか?

517 :デフォルトの名無しさん:2007/01/17(水) 13:28:39
>>515
テンプレート・テンプレート・パラメータと言うのか。
勉強になった。

518 :デフォルトの名無しさん:2007/01/17(水) 14:37:05
>>516
それコンパイル通る?

519 :デフォルトの名無しさん:2007/01/17(水) 15:04:56
>>516
下は通常あり得ない書き方だろう。
あるとすれば、クラステンプレートのメンバ関数テンプレート、の実装部分くらい。

template <class T>
class hoge {
  template <class U>
  void fuga(U arg);
};

template<class T>
template<class U>
void hoge<T>::fuga<U>(U arg) { }

みたいな。

520 :デフォルトの名無しさん:2007/01/17(水) 15:26:00
>>519
あ、なるほど、確かに説明の所にメンバテンプレートと
書いてありました。

わかりやすい説明ありがとうございます。

521 :デフォルトの名無しさん:2007/01/18(木) 02:26:39
STLのsetやmapのメモリ構造って、ただの2分木なんですか?
それともB木や2色木みたいなバランス調整される構造なんでしょうか?

522 :デフォルトの名無しさん:2007/01/18(木) 04:04:43
実装に依るだろ。GCCのSTLは赤黒木みたいだけど

523 :デフォルトの名無しさん:2007/01/18(木) 06:11:51
VCだとどうなんでしょうかね?

524 :デフォルトの名無しさん:2007/01/18(木) 08:02:42
ビタミンC

525 :デフォルトの名無しさん:2007/01/18(木) 09:01:36
わざとバランス悪くなりそうな要素を突っ込んでみたら?


526 :デフォルトの名無しさん:2007/01/18(木) 11:45:22
ていうかソース見れよ
STLならヘッダでいいし
そうでなくともVC++にはC/C++ランタイムのソースついてるだろ

527 :デフォルトの名無しさん:2007/01/18(木) 13:10:48
VC8のDinkumwareのヘッダを見てみたが、xtreeという名前の
ヘッダに赤黒木の実装が使われているようだ。

528 :デフォルトの名無しさん:2007/01/18(木) 15:31:20
SortedAssociativeContainer コンセプトが探索その他の操作に対する
複雑性保証として最悪で O(log N) を要求しているので,
必然的に何らかの balanced tree による実装が必然になります.

さらに iterator を指定しての (木構造中のノードを指定しての) 削除に
最悪で O(1) の複雑性を要求するので, AVL tree もダメでしょうね.
あまりデータ構造に詳しくないのであれですが,
B-tree も要素削除後の再平衡化が O(1) では無理だったように記憶しています.
もちろん,どちらのデータ構造も欠点に代わる利点を持っていますけれど.

したがって,実装としてはおおよそにおいて赤黒木に落ち着くのではないかと思います.

>527
VC7.1, VC8.0 の set, multiset, map, multimap の実装は赤黒木です.

529 :デフォルトの名無しさん:2007/01/18(木) 17:47:04
皆さん検証乙です

530 :デフォルトの名無しさん:2007/01/19(金) 09:22:18
>>528
上のほうの主張はほとんどすべて間違っている。
データ構造について再履修しよう。

まず
>最悪で O(log N) を要求しているので,
>必然的に何らかの balanced tree による実装が必然になります.
は嘘。balanced tree 以外にもこの条件を達成できる
データ構造は存在する。もちろん bst が最も普通ではあるが。

次に
>さらに iterator を指定しての (木構造中のノードを指定しての) 削除に
>最悪で O(1) の複雑性を要求するので,
は致命的な嘘。要求するのは amortized O(1)。amortized の意味を
確認せよ。最悪 O(1) の削除は赤黒木でも普通は達成しない。

そして
>AVL tree もダメでしょうね.
は二つの意味で嘘。
一つ目は、AVL 木の削除は amortized O(1) なので条件を満たす。
二つ目は余談だが、deamortized という手法で削除を O(1) で
実行できるAVL木 O(1) が構成できる。


531 :デフォルトの名無しさん:2007/01/19(金) 20:16:30
>>529
こういうのは「検証」というんだろうか?

532 :デフォルトの名無しさん:2007/01/19(金) 21:21:53
検証と言わずに正直に「頭の悪い私の代わりに考えて下さって
どうもありがとうございます」とでも書けばいいのに。

533 :デフォルトの名無しさん:2007/01/19(金) 21:32:57
>>530
>>最悪で O(log N) を要求しているので,
>>必然的に何らかの balanced tree による実装が必然になります.
>は嘘。balanced tree 以外にもこの条件を達成できる
>データ構造は存在する。もちろん bst が最も普通ではあるが。
は521へ対するレスとして「ただの2分木か,それとも branced tree か」という
暗黙の仮定をおいてレスを書いてしまってました.すいません.

それ以降指摘されたことに関しては完全に自分の非で,特に赤黒木に対しては
自分でもなんでこんなトンチンカンなこと書いたのか,恥ずかしい限りです.
528の内容については,完全に無視してやってください.本当にすいません.

猛省して,データ構造について勉強しなおしてきます.

534 :デフォルトの名無しさん:2007/01/22(月) 15:14:59
計算結果がvectorで返ってくる計算の場合、
関数のreturnにvectorをもってくるとおかしくなるから
計算結果込みのオブジェクトにしちゃうんだけど、
何か間違ってる気がする。
return vector<...>しても問題ないような書き方できないでしょうか?

struct do_and_result
{
vector<Data> return_data;
template< typename T>
operator()(T &t)
{
...
return_data.push_back(..)
..
return_data.push_back(..)

//return(return_data); // できない?
}
};

535 :デフォルトの名無しさん:2007/01/22(月) 15:26:56

下記のコードで
unary_function<T,T>
のTを指定する方法ないでしょうか?

struct obj:public unary_function<
T,T //Tをここから指定できない.なおかつTはオブジェトを適用したときにわかる
>
{
T operator()(T &t)
{
...
return t;
}
};

使用例
std::vector<int> ar
for_each(ar.begin(),ar.end(),obj())

std::vector<float> ar2
for_each(ar2.begin(),ar2.end(),obj())

unary_functionはbindを使うときに必要らしく
Tを自動設定できないかと思いました

536 :デフォルトの名無しさん:2007/01/22(月) 16:06:17
>>534
template< typename T> 
vector<Data> operator()(T &t)ではないのか。

>>535
objもクラステンプレートにしてはだめなのか。

537 :デフォルトの名無しさん:2007/01/23(火) 01:07:29
>>534
> 関数のreturnにvectorをもってくるとおかしくなるから

何がおかしくなるのか言ってみな。

538 :デフォルトの名無しさん:2007/01/23(火) 06:30:14
>何がおかしくなるのか言ってみな。
決まっているじゃないか、>534の頭だよ。

539 :デフォルトの名無しさん:2007/01/23(火) 07:12:20
頭が悪いのに無理して煽らなくても。

540 :デフォルトの名無しさん:2007/01/23(火) 07:17:38
煽りは挨拶
そして最後は釣りだったことに

541 :534:2007/01/23(火) 13:43:28
vector<int> func( )
{
vector<int> ar(20);
return ar;
}
にすると、スコープを抜けるとarのメモリーが解放されてしまうらしく
エラーになっておちる

542 :デフォルトの名無しさん:2007/01/23(火) 13:59:43
そんなことはない。

543 :デフォルトの名無しさん:2007/01/23(火) 13:59:51
それなんて糞コンパイラ?

544 :デフォルトの名無しさん:2007/01/23(火) 14:06:43
できないのも、しようとするのも問題外だな。

545 :534:2007/01/23(火) 14:29:44
忘れてた.
巨大配列をコピーすると計算時間かかるので参照で返してました。

std::vector<int> & vec_out_fun()
{
std::vector<int> vec(10);
std::fill(vec.begin(),vec.end(),1 );
return vec;
}

void vector_return_func_test()
{
std::vector<int> vec;
vec = vec_out_fun();
std::cout << vec[3];

}

546 :デフォルトの名無しさん:2007/01/23(火) 14:41:07
>>545
それは落ちるだろ

こうするとか
std::vector<int> & vec_out_fun(std::vector<int> & buf)
{
buf.resize(10);
std::fill(buf.begin(),buf.end(),1 );
return buf;
}

スマートポインタの類を使うとか
typedef std::auto_ptr<std::vector<int> > ApVec;
ApVec vec_out_fun()
{
ApVec vec(new std::vector<int>(10));
std::fill(vec->begin(),vec->end(),1 );
return vec;
}

547 :デフォルトの名無しさん:2007/01/23(火) 14:48:27
忘れ方が初心者すぎる

548 :デフォルトの名無しさん:2007/01/23(火) 14:49:36
やっぱり>538だったか。

549 :デフォルトの名無しさん:2007/01/23(火) 15:16:18
NRVO効かないの?

550 :デフォルトの名無しさん:2007/01/23(火) 17:47:58
ローカル変数のアドレスを返すアホ

551 :デフォルトの名無しさん:2007/01/23(火) 18:06:03
>>545はEffective C++なんかにも書いてある典型的な誤りって奴だぁな

552 :デフォルトの名無しさん:2007/01/23(火) 19:10:29
STLでもC++でもなくてCレベルの誤りだな
ポインタじゃなく参照になるとこういうところで気が抜けちゃうんだろうか?

553 :534:2007/01/23(火) 19:15:52
話題を最初の話に戻すけど
ローカル変数をコピー(大きい配列の場合、したくない)
なしに返すには、関数を関数オブジェクトにして、
計算結果を関数オブジェクトのメンバー変数においておく
という方針は、いいのかどうか?

他にもっといい方法があるのか知りたい


554 :デフォルトの名無しさん:2007/01/23(火) 19:30:55
>>553
>>546


555 :デフォルトの名無しさん:2007/01/23(火) 22:18:22
STL的には関数をイテレータにするとか

556 :デフォルトの名無しさん:2007/01/24(水) 21:58:31
上の方に出てた
template <template <typename T> class U>

template <template <typename T> typename U>
だとコンパイル通らないですね。

templateの中のclassとtypenameって同じことだと思っていましたが
多少異なるんでしょうか?

557 :デフォルトの名無しさん:2007/01/24(水) 22:15:13
>>556
Uは実在の型でないといけないから、テンプレートパラメータではなく
クラス名を書かなければならない。だからtypenameではだめ。

558 :デフォルトの名無しさん:2007/01/25(木) 09:10:16
>>557
それ、ほんと?

559 :デフォルトの名無しさん:2007/01/25(木) 09:58:22
>>556
通常、U は、クラスか構造体にしかならないから…らしい。

560 :デフォルトの名無しさん:2007/01/25(木) 10:23:17
ほうほう、これはEffective C++の著者にも教えてあげたほうがいいんじゃねーの

561 :デフォルトの名無しさん:2007/01/27(土) 09:04:22
入力を2つとる
for_each transform
がない。
自分で作るのもいいけどbindとかと組み合わせると不安
どこかに安定したのがないだろうか

562 :デフォルトの名無しさん:2007/01/27(土) 09:35:48
transformには2入力版もあるぞ。

563 :デフォルトの名無しさん:2007/01/27(土) 11:24:18
2つ入力が必要なfor_eachはtransformで代用?

564 :デフォルトの名無しさん:2007/01/27(土) 14:35:10
boost::zip_iteratorとか

565 :デフォルトの名無しさん:2007/01/27(土) 21:10:39
>>574
あ、それでいけそう
ありがとう。


566 :デフォルトの名無しさん:2007/01/28(日) 15:05:06
なんで未来にレスしてるんだろう…
エスパー登場!?

567 :デフォルトの名無しさん:2007/01/28(日) 16:25:18
つまんねえ反応だ

568 :デフォルトの名無しさん:2007/02/01(木) 19:31:32
先頭の空白を除去しようと思っていくつか試したんだが
eraseってこんなに遅いもん?

//1つ目
str.replace(0,space_num,L"");
//2つ目
wstring tmp = str.substr(0,str.size()-space_num);
//3つ目
str.erase(str.begin(),str.begin()+space_num);

100万回小さなループで試した結果
1つ目:1.6秒ぐらい
2つ目:1.8秒ぐらい
3つ目:5.7秒ぐらい
テストコード
boost::timer t;
t.restart();
for(int i=0;i<1000000;++i){std::wstring str(L"123456789");
str.replace(0,2,L"");}
t.restart();
for(int i=0;i<1000000;++i){std::wstring str(L"123456789");
std::wstring tmp = str.substr(2,str.size()-2);}
t.restart();
for(int i=0;i<1000000;++i){std::wstring str(L"123456789");
str.erase(str.begin(),str.begin()+2);}


569 :デフォルトの名無しさん:2007/02/01(木) 23:12:27
>>568
std::stringはstd::vectorに似てerase()は遅いぞ。

570 :デフォルトの名無しさん:2007/02/02(金) 23:38:27
>>569
そっか、さんくす

571 :デフォルトの名無しさん:2007/02/03(土) 15:16:13
class my_class {
public:
 my_class(int i) : i(i) {}
 void print_ptr(ostream* os) { *os << i << endl; }
 void print_ref(ostream& os) { os << i << endl; }
 void plus_ptr(int* n) { i += *n; }
 void plus_ref(int n) { i += n; }
 int i;
};

int main()
{
 vector<my_class> v;
 for (int i=0; i<10; i++) v.push_back(my_class(i));

 for_each (v.begin(), v.end(), bind2nd(mem_fun_ref(&my_class::print_ptr), &cout));  // ポインタ渡しはOK
 for_each (v.begin(), v.end(), bind2nd(mem_fun_ref(&my_class::print_ref), cout));   // ※リファレンス渡しはコンパイルエラー

 int i=5;
 for_each (v.begin(), v.end(), bind2nd(mem_fun_ref(&my_class::plus_ptr), &i)); // ポインタ渡しはOK
 for_each (v.begin(), v.end(), bind2nd(mem_fun_ref(&my_class::plus_ref), i));  // オブジェクトのコピーでもOK
}


572 :デフォルトの名無しさん:2007/02/03(土) 15:17:24
※のところでerror: forming reference to reference type `std::ostream&'と言われます。
リファレンスを引数に取るメンバ関数からmem_fun1_ref_tを生成することはできないのでしょうか。
for_eachをつかってコンテナの中身を任意のストリームに吐けるようにしたいのです。
ポインタ渡しを使えばやりたいことは実現できるんだけど、好みの問題でできればリファレンスで渡したいのです。

あと、グローバル関数のoperator<<の特定の特殊化バージョンのポインタを取得することはできるのでしょうか。
operator<< <ostream, const my_class>
とかやっても
error: no matching function for call to `bind1st(<unresolved overloaded function type>, std::ostream&)'
と言われてしまいます。

573 :デフォルトの名無しさん:2007/02/03(土) 15:23:14
>>571
リファレンスリファリンス問題だな。標準ライブラリの欠陥だよ。
boost::bindでも使いなせえ。

574 :デフォルトの名無しさん:2007/02/03(土) 19:07:58
http://sourceforge.net/project/showfiles.php?group_id=146814&package_id=162032&release_id=483468
STLport 5.0.3

575 :デフォルトの名無しさん:2007/02/03(土) 20:27:21
いつも一緒にいたかった。
隣で笑ってたかった。
boostは次々変わるのに
STLは立ち止まったまま。

576 :デフォルトの名無しさん:2007/02/03(土) 20:46:24
次々変わったら、何のためのSだよ

577 :571:2007/02/03(土) 20:53:51
>>573
なるほど自分ではいかんともしがたい問題なのですね。ありがとうございました。


578 :デフォルトの名無しさん:2007/02/03(土) 22:17:52
>>575
それなんてプリンセスプリンセス?

579 :デフォルトの名無しさん:2007/02/03(土) 22:22:14
しっぽ落とさないんだよな

580 :デフォルトの名無しさん:2007/02/04(日) 22:31:50
>>573
あぁ、前に悩んであきらめたなぁ・・
boost::bindだと平気なの?

581 :デフォルトの名無しさん:2007/02/05(月) 00:50:31
>>580
http://0xcc.net/blog/archives/000090.html

582 :デフォルトの名無しさん:2007/02/05(月) 01:04:06
g++だとこんなメッセージ出るのかよ
heboい俺にはVCから移行できる気がしない

583 :580:2007/02/05(月) 03:01:53
そのためにboostを導入ってのも気が引けるんだよなあ・・

binder2ndとbind2ndの第2引数を
const _Ty& _Right → _Ty _Right
強引にこうしちゃうと動くようになったりするんだが、他のとこが動かなく
なりそうだしなあ・・

584 :デフォルトの名無しさん:2007/02/05(月) 08:33:00
TR1が使えるのならstd::tr1::bindはどうよ。

585 :デフォルトの名無しさん:2007/02/05(月) 16:32:22
mapにはPerlのkeysに相当する機能ってありませんか?
キーの一覧を取得したいんです。
イテレータ使ってループ回すしかないですか?

586 :デフォルトの名無しさん:2007/02/05(月) 16:38:11
「取得」ねぇ・・・

587 :デフォルトの名無しさん:2007/02/05(月) 17:15:43
あ、わからない人は反応しなくていいです。

588 :デフォルトの名無しさん:2007/02/05(月) 17:28:38
あ、わかる人も反応しなくていいです。

589 :585:2007/02/05(月) 17:33:38
間抜けなことを聞いてしまった。タイピング数を減らせればどうでもよかった。今は反省している。
素直にイテレータ使ってmapを巡回させることにします。スレ汚しすみません。

590 :デフォルトの名無しさん:2007/02/05(月) 23:18:27
select1st作ってtransformするとか

591 :585:2007/02/06(火) 10:16:30
サンクス。そういうの探してました。
だがしかし、VC++に標準で付いてるSTLで開発してるんで使えません。

592 :デフォルトの名無しさん:2007/02/06(火) 10:27:14
>>591
transform なら VC++6.0 にもあるよ。

593 :デフォルトの名無しさん:2007/02/06(火) 11:05:53
こんな感じか。[Generic Programmingより]
ただしVCはselect1stを含んでいないのでコンパイルできない。
STLportをインストールする必要がある。

#include <iostream>
#include <map>
#include <algorithm>
#include <iterator>
#include <functional>

int main()
{
std::map<int, double> m;

m[1] = 0.3;
m[47] = 0.8;
m[33] = 0.1;

std::transform(m.begin(), m.end(), std::ostream_iterator<int>(std::cout, " "), std::select1st<std::map<int, double>::value_type>());
std::cout << std::endl;
}

594 :デフォルトの名無しさん:2007/02/06(火) 11:18:21
すげー
VCしか使ったことないからかselect1stしらなかったけど
当然2ndもあるんね すげー便利そう

595 :デフォルトの名無しさん:2007/02/06(火) 11:21:04
std::unary_functionを継承して自分で作れるよ

596 :デフォルトの名無しさん:2007/02/06(火) 11:23:49
template <class T, typename U>
struct select1st : public std::unary_function<T, U>
{
const U& operator() (const T& x) const { return x.first; }
};

template <class T, typename U>
struct select2nd : public std::unary_function<T, U>
{
const U& operator() (const T& x) const { return x.second; }
};

たったこれだけ

597 :594:2007/02/06(火) 11:29:51
自分用には似たようなの作ってはいたけど、STLportの実装もそれだけなのか
これは横槍ながら感謝です

598 :デフォルトの名無しさん:2007/02/06(火) 11:36:17
悪い
上の実装ではコンパイルが通らないようだ
こっちを使ってください

template <class T>
struct select1st : public std::unary_function<T, typename T::first_type>
{
const typename T::first_type& operator() (const T& x) const { return x.first; }
};

template <class T>
struct select2nd : public std::unary_function<T, typename T::second_type>
{
const typename T::second_type& operator() (const T& x) const { return x.second; }
};

599 :585:2007/02/06(火) 13:57:26
おー、これは感謝です。
select1st, select2ndのコードまで教えていただけるとは思いも寄りませんでした。
ありがとうございます。

600 :デフォルトの名無しさん:2007/02/06(火) 15:24:10
STLの利点は「もし無くても自分で作れる」という点が大きいな。
だからboostでtupleなんかが活躍しているんだろうけど。

601 :デフォルトの名無しさん :2007/02/07(水) 02:42:28
自分はVC++2005を使っているのですが
STLPortっていうのはどこで確認できるんでしょうか。
boost1_33_1を入れて普通にIncludeフォルダlibフォルダを
VC++2005に設定したらboostは使えてるんですが
STLPortっていうのが気になります。
確認方法が、あるんでしょうか。
板違いかもしれませんが、どなたか分かる方が居れば
教えていただきたいです。

602 :デフォルトの名無しさん:2007/02/07(水) 09:33:21
ググれよ

603 :デフォルトの名無しさん:2007/02/07(水) 20:42:50
stlportそれは・・・・・・・・使わないんじゃないか?

604 :デフォルトの名無しさん:2007/02/07(水) 21:19:09
GDBでコンテナやイテレータを探索したいんですが、どうすれば参照出来るでしょうか?ただツール落として使うのは不可です。

vectorは参照出来ましたが、listはさっぱり構造がわからずうまく行きません。と言うのも、GDBから演算子関数が呼び出せないんです。
使い易く別でシーケンスを出力する関数を用意するにもテンプレの実行時特化で弾かれます。

何か解決策は無いでしょうか?

605 :デフォルトの名無しさん:2007/02/16(金) 19:30:23
http://sourceforge.net/project/showfiles.php?group_id=146814&package_id=162032&release_id=486837
STLport 5.1.1 Notes (2007-02-16 01:46)

606 :デフォルトの名無しさん:2007/02/18(日) 04:01:16
stringの
size_type find(const charT* s, size_type pos) const;
のposにstring::nposを指定した時の戻り値って規格で決まっていないんですかね?
g++とVC6では結果が違ったので

607 :デフォルトの名無しさん:2007/02/18(日) 04:06:39
>>606
普通に考えると npos 以外返しようがないと思うんだが、
npos じゃない値が出てきたの?

608 :デフォルトの名無しさん:2007/02/18(日) 04:18:19
>>607
string s = "abcdefbc";
printf("%d\n", s.find("bc", string::npos));

を試してg++3.4.4(cygwin)で1が返り、VC6では-1(npos)が返りました。

609 :デフォルトの名無しさん:2007/02/18(日) 04:19:39
どうせVC6が、nposの実値である -1 でそのまま処理したんじゃねぇの?

610 :デフォルトの名無しさん:2007/02/18(日) 04:20:22
あ、志村った。てか、珍しく逆だったか。

611 :デフォルトの名無しさん:2007/02/18(日) 04:38:42
規格的には 0 が文字列の先頭(==*.begin())を指すインデックスとして使われるのに対し、
npos はその逆で文字列の末尾(==*.end())を指すインデックスとして使われていることを考えると
VC6の挙動のほうが規格的には正しい。が、nposが指定された場合の挙動が明記はされとらんねぇ。

612 :デフォルトの名無しさん:2007/02/18(日) 08:27:15
明記されてないなら未定義だろう

613 :デフォルトの名無しさん:2007/02/18(日) 08:53:38
>>612
直接明記はされてないけど、仕様としては最大値扱いのnposが渡されただけの
話なんで、普通に行間を読めばVC6の挙動が規格通りだと思うんだけど、
はっきりと明記されてない限りは未定義扱いになるんだっけ?

614 :デフォルトの名無しさん:2007/02/18(日) 09:24:12
rfind は検索開始位置にデフォルト値でnposが渡されるが、特にnposが渡された時の扱いは
明記されてないまま、nposが最大値扱いな説明がされているところを見ると、VC6の挙動が
規格通りの挙動ってことでいいんじゃないか? はっきり明記されていない限り未定義って
ことだと、rfind で検索開始位置を指定しなかった場合の挙動も未定義ってことになるぞ。

615 :デフォルトの名無しさん:2007/02/18(日) 10:26:15
規格には見つからなかったらnposを返すと書いてあった気がするが

616 :615:2007/02/18(日) 11:21:39
ん、そういう話じゃなかったな。
定義上 npos == -1 == std::numeric_limits<std::string::size_type>::max()
なんだから、見つかるはずがない(必ずnposを返す)という解釈が
正しいんじゃないかな?つまり>>614で。

ちなみにSTLport4.6.2では位置を返すが、5.0.2ではnposが返るようになってた。

617 :デフォルトの名無しさん:2007/02/18(日) 11:26:49
見つからないときは npos が返る。
今回のは gcc のバグ。

いくらか調べてみると、やっぱり npos がどっかで signed に
突っ込まれてるみたい。 npos を小さくしながら試していくと、
npos / 2 を渡したところから npos が返るようになった。

618 :デフォルトの名無しさん:2007/02/18(日) 12:14:16
・・・

619 :606:2007/02/18(日) 12:32:21
いろいろ試していただいた方、サンクスです。
findにnposを渡した時、
・規格で特に明記されているわけではない。
・明記されていないがnposは-1で最大値扱いされているので、nposを返すと考えるのが自然。
・現実にはSTLの実装によって動作が変わるのでこういうコードは書かないほうが良い。

しかし今度はnposの規格が疑問になってきた。
nposの規格って
1.検索失敗時に返す値
2.符号なし整数の最大値

1は規格にあると思うけど2は規格にあるんですか?
2がもしないならrfindにnposを指定した場合も未定義なのかな

規格ってISOで買うしかないんですかね。。。

620 :デフォルトの名無しさん:2007/02/18(日) 12:47:10
規格書に曰く、
static const size_type npos = 1;

621 :デフォルトの名無しさん:2007/02/18(日) 13:10:58
>>620
1?
-1じゃなくて?

622 :デフォルトの名無しさん:2007/02/18(日) 13:21:43
>>619
size_type は符号無し整数で、符号無し整数に変換された -1 が
その型の最大値を取ることは規格から導くことができる。

623 :デフォルトの名無しさん:2007/02/18(日) 13:31:14
なるほど。nposが規格で-1となっているなら
rfindにnposを渡すと最後尾から検索開始することが保証されますね。
となるとやっぱりg++3.4.4のfindにnposを渡した時の動作は変だ。

624 :デフォルトの名無しさん:2007/02/18(日) 15:56:17
>>619
C++標準ライブラリ(規格の17章から27章)の部分だけでいいなら
国際規格(ISO) C++ライブラリハンドブックを買う手もある。

625 :デフォルトの名無しさん:2007/02/18(日) 16:07:04
eMuleで落とす手もある

626 :デフォルトの名無しさん:2007/02/18(日) 16:41:24
>>619
英語のドラフトでよければダウンロードできるよ。

627 :デフォルトの名無しさん:2007/02/18(日) 16:45:29
日本語でよければJIS X3014の画像PDFという手もある。

628 :デフォルトの名無しさん:2007/02/18(日) 17:09:29
文字列に属さない位置(0〜文字列の長さの範囲にない位置)
を検索開始位置にした場合は、未定義なんじゃないの?

rfindについては、検索開始位置が未指定の場合は末尾からの検索を
行うというのが仕様で、大半の処理系はその仕様をdefault値をnposにする
ことで実装しているだけだと思うが。

629 :デフォルトの名無しさん:2007/02/18(日) 17:26:12
>>628
rfindのデフォルト値は規格でnposと決まっている。

630 :デフォルトの名無しさん:2007/02/18(日) 17:50:42
>>628
条件が満たされない場合はnposを返すとある。

631 :デフォルトの名無しさん:2007/02/18(日) 21:07:46
gcc3よりvc6のほうが規格に合致してるのは気に入らない
なんとかしてgcc3の挙動が規格上問題ないという証拠を見つけたい

632 :デフォルトの名無しさん:2007/02/18(日) 21:43:33
>>631
もう結果が出てるんだから無理。

633 :デフォルトの名無しさん:2007/02/18(日) 21:59:17
>>631
patch投げるほうがたぶん建設的やで。

634 :デフォルトの名無しさん:2007/02/18(日) 22:01:49
g++2.95のstringでさらにおかしな動作発見。
size_type find(const charT* s, size_type pos, size_type n) const;
でn = 0を指定

string s = "abcdefb";
printf("%d\n", s.find("bc", 2, 0));
を実行して、
g++2.95: 6 ←"b"を検索しちゃってる
g++3.4 : 2
VC6    : 2
を返した。
g++2.95の結果はおかしいとして、
検索文字列の長さを0にした時は規格的にはどれが正しいんだろ?
検索開始インデックス or npos?

635 :デフォルトの名無しさん:2007/02/18(日) 22:16:05
size_type find(const charT* s, size_type pos, size_type n) const;
Returns: find(basic_string<charT,traits,Allocator>(s,n),pos).

s.find( "", 2 );と同じ。空文字列は当然、先頭にマッチする

636 :デフォルトの名無しさん:2007/02/19(月) 00:59:34
>>631
gccのbasic_stringまわりは糞だからなぁ。


637 :デフォルトの名無しさん:2007/02/19(月) 04:04:49
>>631
VC6のじゃなくてDinkumwareのと言えばOK

638 :デフォルトの名無しさん:2007/02/19(月) 19:07:23
おまえらそんなにVC++6が嫌いですか

639 :デフォルトの名無しさん:2007/02/19(月) 19:38:47
>>638
俺はgccのほうが大嫌いだけど、なんていうかさぁ、ほら、
のびたの癖に生意気だぞ〜、みたいな?

640 :デフォルトの名無しさん:2007/02/19(月) 20:05:41
2.95まだ使ってる奴いたのか。

641 :デフォルトの名無しさん:2007/02/20(火) 02:34:11
VCでもgccでもいいけど、
VC6とgcc2.95は早く滅びてくれるとみんな幸せになれると思うんだ…。

642 :デフォルトの名無しさん:2007/02/20(火) 02:54:21
C言語新生児な俺はもvc6もgcc2.95も触ったことないけど、vc6は噂に聞いてる
gcc2.95も似たようなものなのけ?

643 :デフォルトの名無しさん:2007/02/21(水) 22:20:15
時期的にはだいたい同じじゃなかったかな

そういやgcc2の終わりごろってegccとかforkしてた暗黒時代だった希ガス

644 :デフォルトの名無しさん:2007/02/21(水) 22:40:03
ググってみると、
>途中からCygnus社(後Red Hatに吸収)が中心となってEGCSプロジェクトと称して
>新しいGCCの開発に着手し,現在ではEGCSプロジェクトが正式なGCC開発元となっています。
と出てきた。gcc2.95は今のgccの先祖じゃないみたい。

645 :デフォルトの名無しさん:2007/02/22(木) 00:01:28
どっちも下手に広まっちゃったから
なかなかしがらみが消えないのが問題なんだよな。

646 :デフォルトの名無しさん:2007/02/22(木) 00:11:27
2.95は結構珍しいと思う


647 :デフォルトの名無しさん:2007/02/22(木) 08:21:43
Visual C++ 7.1 and higher
GNU C++ 3.2 and higher
Intel for Linux 8.1 and higher
Intel for Windows 8.1 and higher
tru64cxx 65 and higher
QNX qcc 3.3 and higher
MinGW 3.4 and higher
Metrowerks CodeWarrior 9.4 and higher

たぶんこれら以外はC++コンパイラではない
Turbo C++は詐欺な気がする

648 :デフォルトの名無しさん:2007/02/22(木) 11:02:04
現行規格からの逸脱が激しい、ぐらいにしたほうがいいと思うよ

649 :デフォルトの名無しさん:2007/02/22(木) 12:46:43
ARMには準拠していると言える水準のものもあるわけだし。

650 :デフォルトの名無しさん:2007/02/23(金) 00:22:42
2.96の挙動不審さは異常

651 :デフォルトの名無しさん:2007/02/26(月) 19:10:54
2.95.2とか今でも結構使われてるな

163 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)