06/10/14 19:20:40
入門ページなど
・STLとは
URLリンク(e-words.jp)
・入門
URLリンク(www.jah.ne.jp)
・入門,一覧,使い方
URLリンク(www5c.biglobe.ne.jp)
・メソッド一覧
URLリンク(www.wakhok.ac.jp)
・サンプルプログラム集
URLリンク(www.s34.co.jp)
・TIPS集
URLリンク(www.nantekotta.com)
・メルマガ(お勧め)
URLリンク(www.kab-studio.biz)
・解説
URLリンク(ja.wikipedia.org)
URLリンク(www-ise2.ise.eng.osaka-u.ac.jp)
マルチスレッドプログラミングの時には
URLリンク(www.logos.ic.i.u-tokyo.ac.jp)
STLPort
URLリンク(www.sgi.com)
URLリンク(www.stlport.org)
STLに関する話題は『ここ』で
C++に関する話題は『C++相談室』
スレリンク(tech板)
でよろしくお願いします
2:デフォルトの名無しさん
06/10/14 19:23:15
とりあえず貼っとく。
スレリンク(tech板:562番)
562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。
このスレが不要である事に疑いの余地は無い。
3:デフォルトの名無しさん
06/10/14 19:28:17
とりあえずこちら使いきってから
スレリンク(tech板)
4:デフォルトの名無しさん
06/10/14 19:29:47
・和書の紹介
STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
URLリンク(www.amazon.co.jp)
STL―標準テンプレートライブラリによるC++プログラミング 第2版
URLリンク(www.amazon.co.jp)
標準C++:STLの基礎知識
URLリンク(www.amazon.co.jp)
標準講座C++―基礎からSTLを利用したプログラミングまで
URLリンク(www.amazon.co.jp)
STLによるコンポーネントデザイン
URLリンク(www.amazon.co.jp)
Effective STL―STLを効果的に使いこなす50の鉄則
URLリンク(www.amazon.co.jp)
5:デフォルトの名無しさん
06/10/14 22:27:05
>>1
乙
6:デフォルトの名無しさん
06/10/15 17:04:15
【C++】STL(Standard Template Library)相談室 5
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 4
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 3
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 2
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室
スレリンク(tech板)
7:デフォルトの名無しさん
06/10/16 02:27:40
質問。
連想コンテナへのinsert(i, j) (iとjは入力反復子)って、
例外安全性は強い保証?それとも基本?
規格を眺めたが言及が見つからず…
8:デフォルトの名無しさん
06/10/16 05:12:29
STLのスタックはC#のスタックに比べて10倍遅い。
C++はメモリのアロケートが貧弱な気がする。
9:デフォルトの名無しさん
06/10/16 06:34:32
>>8
どんなテストをしたの?
10:デフォルトの名無しさん
06/10/16 06:49:26
>7
規格とDR読み通したけれどこれは単に抜けてるだけのような
11:デフォルトの名無しさん
06/10/16 09:49:53
規格で例外安全性に関する規定ってあったっけ?
無いと困るような気はするんだが、ちょっと見当たらない。
12:デフォルトの名無しさん
06/10/16 16:59:09
>>11
あちこちに散りばめられている。(個々の関数の解説にあったり、先頭で一斉に指定されていたり)
>>8
本当にありケーとが駄目というのが原因なら、アロケータを差し替えてみるとどうだろう?
13:8
06/10/16 18:48:40
>>9
普通にforループでpushしていくだけのもの。
>>12
STLportに変えてみたら同じぐらいの速さが出た。
VC8標準のやつが遅かっただけみたい。
14:8
06/10/16 18:57:27
stackのpushよりもvectorのpush_backの方が速いとは……
15:デフォルトの名無しさん
06/10/16 19:05:33
>>14
特に指定しないと、stackはdequeを使って実装される。
URLリンク(www.wakhok.ac.jp)
16:デフォルトの名無しさん
06/10/16 19:05:38
stack はキューだかリストだか使っているからだろう。
17:デフォルトの名無しさん
06/10/16 19:42:42
>>13
テストしたコード晒してよ。
18:デフォルトの名無しさん
06/10/16 20:03:37
>>17
何粘着してんだ?
19:デフォルトの名無しさん
06/10/16 20:13:37
速度比較してソース貼らずに結果だけを主張するのはおかしいだろ。
20:デフォルトの名無しさん
06/10/16 20:16:27
的外れ
21:デフォルトの名無しさん
06/10/16 20:20:58
>>19
>STLportに変えてみたら同じぐらいの速さが出た。
>VC8標準のやつが遅かっただけみたい。
って、8にとっての結論は出てるみたいだからそれでいいじゃん
お前がどう評価するかは、それぐらい自分でベンチとれよ
22:17
06/10/16 20:49:07
別にベンチマークがとりたいんじゃなくて、どんなコードで
比較したのかが知りたかったんだ。自分で新しく比較コード書く気は無いな。
本人が拒否するならわかるんだが、なんで他人が文句言ってくるんだ?
23:デフォルトの名無しさん
06/10/17 00:02:59
確かに C# より遅いってのは屈辱的だな
24:デフォルトの名無しさん
06/10/17 00:26:05
Dimkumwareは糞遅いからな。
25:デフォルトの名無しさん
06/10/17 05:09:11
テンプレか思った
26:デフォルトの名無しさん
06/10/17 11:07:37
>>22
お馬鹿さんの不思議ルールを理解しようとしても無駄。
27:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/17 12:56:57
>>22
ここにいること自体時間の無駄。
29:デフォルトの名無しさん
06/10/17 17:34:25
>>27
誘導。
スレリンク(tech板)
30:デフォルトの名無しさん
06/10/18 01:46:19
listについて質問です。
erase()で、イテレータで指定した位置の要素を消せますが、
消した後このイテレータは有効なのでしょうか?無効なのでしょうか?
31:デフォルトの名無しさん
06/10/18 01:50:23
つ i++
32:デフォルトの名無しさん
06/10/18 02:06:49
>>30 無効
>>31 エスパー乙
33:デフォルトの名無しさん
06/10/18 02:38:20
ということは、erase(it)のあと、it++などとやったらいけないのですか?
34:デフォルトの名無しさん
06/10/18 02:40:01
>>33
うん。ダメ。だから erase(it++) という話で >>31 に行く。
35:デフォルトの名無しさん
06/10/18 02:56:03
エスパー過ぎたなww
36:デフォルトの名無しさん
06/10/18 07:45:42
これってシュール?
vector<mydata*> * vec;
vec = new vector<mydata*>();
delete vec;
37:デフォルトの名無しさん
06/10/18 07:49:32
ベンチしたらVC標準の方がSTLportより速かったぞ。
38:デフォルトの名無しさん
06/10/18 09:28:17
>>34
vectorの場合を考えて普通eraseの戻り値使わない?
39:デフォルトの名無しさん
06/10/18 10:57:06
>>38
>>30はlistと言っているがシーケンスコンテナとは言っていない。
40:デフォルトの名無しさん
06/10/18 13:12:21
便乗して質問なんですが、
std::vectorのeraseしたときの要素削除で
実際にヒープ開放しないように指定することは不可能?
頻繁に数が変動する場合、自分で制御した方がいいんでしょうか
41:デフォルトの名無しさん
06/10/18 13:39:39
vectorは確保した領域をいちいち開放しないんじゃないの?
resize()でサイズを小さくしても領域は開放されないとか書かれていたけど。
42:デフォルトの名無しさん
06/10/18 14:15:19
>>40
std::remove
43:デフォルトの名無しさん
06/10/18 21:21:04
>>40
std::deque
44:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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
06/10/19 01:51:22
>>45
コンパイルを通すには、 Data<int, int<Dataだけでなく、Data<Dataも必要でした。
ありがとうございました。
operator()を3つ定義するならoperator<を3つ定義して
lower_bound(start,end, 値);でも結局、手間は同じなのかも?
47:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/20 21:24:39
>>47
myのデストラクタでdatの要素全てdeleteするか、boost::ptr_vectorを使う。
49:デフォルトの名無しさん
06/10/20 21:25:39
あ、あとvectorの要素をdataそのものにする。
50:デフォルトの名無しさん
06/10/20 21:30:05
data の要素が int 程度なら vector<int> を使う
51:47
06/10/20 21:33:05
>>48,49
回答ありがとうございます
>myのデストラクタでdatの要素全てdelete
あ!つい、自動的にやってくれるもんだと思ってた
vectorはポインタの中身の削除には感知しないんでしたね
要素をdataにするほうは派生クラスのポインタも入れたりするので
今回は>>48のほうで頑張ってみます
行き詰ってましたがこれで何とか先に進めそうです
助かりました!
52:47
06/10/20 21:36:36
>>50
補足どうもです
小さいデータでは直接intのほうがよさそうですね
47のコードは状況を再現する最小コードで
実際はもうちょっと複雑なデータ構造になっています
53:デフォルトの名無しさん
06/10/20 23:10:47
本当にint型のメンバ1つでも、intそのままよりtypedefの方が良いと思う。
54:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/20 23:56:45
>>54
typedef struct
{ int i; }data;
dataに別の変数を付け足したくなった時に便利。ってことじゃないか
56:デフォルトの名無しさん
06/10/21 07:39:05
いや、単にtypedef int data;のつもりだったんだが。
57:デフォルトの名無しさん
06/10/21 21:05:46
boost関係もここ?
58:デフォルトの名無しさん
06/10/21 21:12:56
スレリンク(tech板)
ここかな
59:デフォルトの名無しさん
06/10/22 18:31:51
vectorの削除について質問です
remove(v.begin(),v.end(),1)みたいなのだと要素数は減らず
eraseと組み合わせたら要素数も減る
v.clear()だと要素数は0になるんですよね
それでは要素数はそのままで、
vectorの中身を全部削除(適切な言葉がわからない)
するにはどうしたらいいのでしょうか
remove(v.begin(),v.end(),?)
60:デフォルトの名無しさん
06/10/22 18:40:39
>>59
いったい何がしたいんだ?
61:59
06/10/22 18:49:20
>>60
vectorをキャッシュみたいに利用できないかと考えたんです
v.begin()~v.end()の内容をあるときに全部他に書き出して
v.begin()~v.end()を初期化して再利用
この時、clear()を呼んで初期化すると
確保したメモリも削除されるので勿体ないかなと
62:デフォルトの名無しさん
06/10/22 18:52:25
>>61
何が勿体ないのかわからんが、 vector には reserve() があるんで、
clear() でメモリを解放する実装は考えられない。
63:59
06/10/22 18:59:16
>>62
すみません、どうやら勘違いしてたみたいです^^;
clear()で行こうと思います、失礼しました
64:デフォルトの名無しさん
06/10/22 21:20:17
メモリ解放するときはreserve(0)?
明示的破棄は不可能なんでしょうか?
65:デフォルトの名無しさん
06/10/22 21:23:51
>64
std::vector< int >().swap(v);
66:デフォルトの名無しさん
06/10/22 21:32:35
>>65
見た感じヤバイ印象を受けるのですが
スタンダードなやり方なんですか?
67:デフォルトの名無しさん
06/10/22 21:41:54
>66
>見た感じヤバイ印象を受けるのですが
あなたは仕様やドキュメントではなくて見た感じの印象でコードの可否を決めるの?
>スタンダードなやり方なんですか?
何をもってスタンダードとするかは分からないけれど
swapイディオムというよく使われる方法の延長
68:デフォルトの名無しさん
06/10/22 21:47:08
>>66
vector* でも持って new/delete すれば確実だろう。
69:デフォルトの名無しさん
06/10/22 23:21:01
>>67
初めて見るコードでイディオムっていうのを知らなくて。
無知ですみません。勉強になりました。
70:デフォルトの名無しさん
06/10/23 00:01:07
vectorが合ったら配列っていらないような気がするけど、必要なの?
71:デフォルトの名無しさん
06/10/23 00:11:17
>>70
C との互換性のためには必要。文字列リテラルも配列型だしね。
動的確保を必要としないという点も見逃せない。
72:デフォルトの名無しさん
06/10/23 00:12:54
固定長配列の需要もなくなりはしないよ。
73:デフォルトの名無しさん
06/10/23 00:15:30
boost::array, std::tr1::array でほとんど置き換えることは可能なんだろうけど、
やっぱり不要ってことにはならないだろうねぇ。
74:デフォルトの名無しさん
06/10/23 00:32:44
>73
それらの実装に固定長配列が要るだろ。
まあそれを言ったらstd::vectorの実装にnew []が必要とかそういう次元の話になってしまうが。
75:デフォルトの名無しさん
06/10/23 01:05:04
でも、配列を使う機会は減りそうだな。
76:デフォルトの名無しさん
06/10/23 02:56:25
配列がなかったらvectorもなくなるじゃん
77:デフォルトの名無しさん
06/10/23 05:24:39
mallocとポインタで何とか
78:デフォルトの名無しさん
06/10/23 21:43:06
std::vectorに、at()という関数が見つかりません。
VisualC++だとあるのですが、gccにはありませんでした。
これは標準の関数ではないのでしょうか?
79:デフォルトの名無しさん
06/10/23 21:45:56 BE:29954232-2BP(204)
URLリンク(0xcc.net)
この表で、c++のjoinが無しになってるけど、vector<string>とかlist<string>に、
ほかのアルゴリズムを組み合わせればできるよね?
80:デフォルトの名無しさん
06/10/23 21:53:42
join は難しいんじゃない?
81:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/23 22:19:07
あ、joinは単に結合するだけじゃなくてセパレータがいるのか…
transformもつけると意味が変わりそうな気もするし
83:デフォルトの名無しさん
06/10/23 22:31:59 BE:149769465-2BP(204)
chopもpythonのs[0:-1]がOKなら、C++でも、なにか書き方がありそうな気がする。
84:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/23 23:04:26
>>84
(*i)[0] = 1;
87:デフォルトの名無しさん
06/10/23 23:29:50
STL使うと容量が増えている気がするんですが、気のせいでしょうか?
88:デフォルトの名無しさん
06/10/23 23:31:37
>>87 ファイルサイズ見ろ。
89:デフォルトの名無しさん
06/10/23 23:33:01
>>87
ガイシュツ
C++相談室 part53
スレリンク(tech板:12番)
90:デフォルトの名無しさん
06/10/23 23:35:32
>>78
標準。
GCCにないわけがない。なにか古い版か?
91:デフォルトの名無しさん
06/10/24 00:12:09
>>86
ありがとうございます。
92:デフォルトの名無しさん
06/10/24 01:46:08
>>78
STLportでも入れろハゲ。
93:デフォルトの名無しさん
06/10/24 15:35:52
STLをjavadoc形式で表したいんですけど、参考になるサイトとかないですか?
94:デフォルトの名無しさん
06/10/24 18:21:15
>>93
STLをjavadoc形式で表すってどういうことか説明してみそ
95:デフォルトの名無しさん
06/10/24 19:01:07
エスパー的にDoxygenはどうだ?
96:デフォルトの名無しさん
06/10/24 19:13:02
doxygenを使おうとは思ってたのでインストールはしています…あと一応eclipseも
とりあえずSTLのどれからでもいいんでドキュメント化したかったんですけど
STLのソースに書き込むの難しそうだったんで
そういうの補足してくれてるサイトとかあったら教えてほしかったんですけど…
97:デフォルトの名無しさん
06/10/24 19:23:48
>>96
gcc付属のSTLだったらlibstdc++をdoxygenに掛けたのが
URLリンク(gcc.gnu.org)
とかにある
98:デフォルトの名無しさん
06/10/25 03:14:21
STLくらいメジャーなものだったら本やネットで公開されてる
マニュアルのほうが完成度が高い
99:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/25 10:23:03
>>100
typename 引数で「大きさを指定」するのか?
「n個飛ばし」って何だ?
TWO_FLOAT って何?
MyContainer のコンストラクタ、コンパイルできないだろ。
MyContainer はテンプレートなのに、 myContainer の
宣言ではテンプレート引数が指定されていない。
質問を整理して、コンパイルできるコード貼ってくれ。
102:デフォルトの名無しさん
06/10/25 12:57:11
>>99
上手いコードとはいえないな。
103:デフォルトの名無しさん
06/10/25 14:03:14
_firstと_lastが同じでも大丈夫なんだろうか
104:デフォルトの名無しさん
06/10/25 14:08:18
>>99
コンテナが空の場合のチェックは引用してないとこでやってるの?
ロジックはいいんじゃないの?ちゃんと確かめてないけど
URLリンク(ray.sakura.ne.jp)
105:デフォルトの名無しさん
06/10/25 15:00:52
rand()%Xがイマイチ
106:100
06/10/25 16:45:39
自己解決
tinyvecorってこういうとき使うものなのね
107:デフォルトの名無しさん
06/10/25 19:29:40
ASL
URLリンク(sourceforge.net)
使ってる人いますか?
108:デフォルトの名無しさん
06/10/26 00:17:55
vectorで型の違う2次元配列をtransform()を使って変換したいんですが、
どういう風に書けばいいでしょうか?
109:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/26 00:29:23
>>108
どういう風に書いてうまくいかなかったのか?
111:108
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/10/31 23:39:39
スレ違いのような気がしなくもないけれど。
単にstd::locale::global(std::locale(""));だとどう?
114:デフォルトの名無しさん
06/11/01 01:11:12
locale("C");ならアボートしませんけど、locale("japanese")
でダメっつーのは、いかんのでは?
115:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/01 01:53:14
>>114
locale文字列は"C"と""以外処理系定義のはず。
117:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/01 08:31:02
working draftで語るのはどうかな…
ISO/IEC14882 みて語ろうぜ。
119:デフォルトの名無しさん
06/11/01 09:05:28
>>117
>別にgccのせいじゃないだろ。
単に出典を示しただけだろ。着眼点がずれてるよ。
俺が使ってるSTLportも似たようなもんだった。
120:デフォルトの名無しさん
06/11/01 14:18:04
そもそもrand()の性能がよければ問題無いつー話では?
rand()%X より rand()*X/RAND_MAXのほうがいいとかはあるかも知らんが.
121:120
06/11/01 14:19:28
あ、計算違ってるかも RAND_MAX じゃなくて (RAND_MAX+1)?
122:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/01 16:43:25
ISよりWCの方を参考にするのかw
124:123
06/11/01 16:45:17
ミスったWDだww
125:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/01 18:17:35
たぶん
string -> string const&
PairList::value_type -> PairList::value_type const&
127:デフォルトの名無しさん
06/11/02 01:05:40
>>123
IS と WD はそんなに違わない。むしろ WD のほうが修正が進んでいる面もある。
そして IS は買わないといけないが WD はダウンロードできる。
128:デフォルトの名無しさん
06/11/02 01:06:49
>>125
エラーメッセージは?
129:123
06/11/02 06:07:36
>>127
屁理屈乙
130:デフォルトの名無しさん
06/11/02 10:47:48
>>129
ISO の営業担当の方ですか?
131:デフォルトの名無しさん
06/11/02 12:07:48
言い訳すればするほど墓穴
132:デフォルトの名無しさん
06/11/02 12:19:22
STL学習し始めたばかりの初心者なんですが
コンテナvectorのソースコードってどうやったら見れますか?
133:デフォルトの名無しさん
06/11/02 12:52:51
普通にファイル開けば
134:デフォルトの名無しさん
06/11/02 13:00:08
ドライブのどこにあるのか分からなかったのでvectorで検索かけたんですけど
同じファイルが3つくらい引っかかって、しかもテキストで開いたら文字化け気味だったので…
135:デフォルトの名無しさん
06/11/02 13:03:13
>>132 URLリンク(www.google.co.jp)
136:デフォルトの名無しさん
06/11/02 13:05:12
>>135
すみません、わざわざありがとうございます
すごく助かりました!
137:デフォルトの名無しさん
06/11/03 18:34:46
namespace detail {
}
ってどういう時に使うの?
138:デフォルトの名無しさん
06/11/03 18:49:07
>>137
詳細を別の名前空間に分けておきたいとき。
139:デフォルトの名無しさん
06/11/04 11:50:23
>>137
スレ違いに気付かない程度の人には関係ありません。
140:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/04 14:31:29
>>140
最後の要素の次を参照する end() で reverse_iterator を初期化したとき、
最後の要素を参照しなければならない。
142:140
06/11/04 15:40:21
endで初期化したならreverse_iterator的にもendだと思っていました
ありがとうございました
143:デフォルトの名無しさん
06/11/04 18:10:11
>>140
> rtmp != rit_t()
この条件何?
144:デフォルトの名無しさん
06/11/04 18:31:14
実は引数が一番最初の行でbeginとかより前に行ったときループから抜けれるようにじゃね?
145:デフォルトの名無しさん
06/11/04 18:58:53
でも実際はこれじゃダメだよね?
146:デフォルトの名無しさん
06/11/04 19:07:09
>>145
reverse_iteratorから呼び出されるであろう140によるIt::operator==とかの実装によるとしかいいようがない
147:デフォルトの名無しさん
06/11/12 12:09:23
STLがMT safeかどうかどうしたら分かりますか?
148:デフォルトの名無しさん
06/11/12 12:24:44
ベンダーに問い合わせる。
149:デフォルトの名無しさん
06/11/13 15:14:33
2次元のvectorをサイズを指定して作成する方法を教えてください。
150:デフォルトの名無しさん
06/11/13 15:19:34
>>149
vector< vector<Type> > v(n, vector<Type>(m))
151:デフォルトの名無しさん
06/11/13 15:42:08
ありがとうございます。
2次元はうまくいったのですが、3次元に拡張しようとしたところうまくいきません。
vector< vector < vector<Type> > > v(n, vector<Type>(m, vector<Type>(n)))
と書いたのですが、どこが間違えているのでしょうか?
152:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/15 04:50:46
algorithmのstd::copyって例外安全ですか?
154:デフォルトの名無しさん
06/11/15 07:59:02
いいえ
155:デフォルトの名無しさん
06/11/15 16:00:32
>algorithmのstd::copyって例外安全ですか?
という質問もおかしいし
>いいえ
という回答もおかしい
156:デフォルトの名無しさん
06/11/15 16:07:15
>>155
何がおかしいのか言わない君の方が芥。
157:デフォルトの名無しさん
06/11/16 10:42:44
ド素人の俺が勘で答えてみると、
・実装による
・使うコンテナによる
158:デフォルトの名無しさん
06/11/16 11:08:29
基本的には以下が必要
・イテレータの前進・比較・間接参照・コピーコンストラクタ・デストラクタが例外を発生させない
・要素の代入・デストラクタが例外を発生させない
ってとこかね。
コピーを巻き戻しできないので処理中に例外が発生したらあぼんぬ。
159:デフォルトの名無しさん
06/11/17 01:13:25
>>157
規格ってのがあるだろ。
実装によるなら一般的にはスレッドセーフでないことになる。
使うコンテナによるならやっぱりスレッドセーフでないことになるだろ。
=====>スレッドセーフでない。
GCCの実装を見る限りではスレッドセーフでなないな。
ただコンテナの代入演算子を使ってるだけ。
コピー作ってスワップってのはしてない。
160:デフォルトの名無しさん
06/11/17 01:26:53
スレッド?
161:デフォルトの名無しさん
06/11/17 08:38:12
>>158
それは「例外安全ではない」ではなくて、「基本的な例外安全」が保証されている状況
162:デフォルトの名無しさん
06/11/17 12:13:17
C++ 標準規格としては std::copy というか, uninitialized 系を除く
アルゴリズムの例外安全性に関しては何も規定していない……
んですが,あくまで一般的な実装の話として
std::copy は, iterator の value_type のコピー代入が
strong guarantee を保持していることを (唯一の) 型に対する要件とした上で,
basic guarantee を達成する,という説明になるんじゃないでしょうか?
iterator の各操作が例外を投入しうる場合でも
basic guarantee は達成すると思います.
163:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/11/17 22:10:18
>>163
例えば要素0個目なら
v[0].itemsyousai = kobunrui_hensuu;
165:デフォルトの名無しさん
06/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
06/11/18 02:43:52
>>164
>>165
std::vector<kobunrui> itemsyousai;
};
に直せ。で,できました
ありがとう。
167:デフォルトの名無しさん
06/11/18 03:02:51
オブジェクト指向とは関係ねえ
ただのコンテナの問題だ
168:デフォルトの名無しさん
06/11/18 03:36:01
>>167
クラス設計や質問内容見りゃあオブジェクト指向がまるで理解できてない
ことぐらい直ぐ判かんだろカス。
169:デフォルトの名無しさん
06/11/18 03:39:40
しつこいな
何か癪に触る事でもいいましたっけ
170:デフォルトの名無しさん
06/11/18 22:22:59
っ 旦~
171:デフォルトの名無しさん
06/11/21 09:15:51
STL初心者です
#define containtype list
//#define containtype deque
class test
{
containtype m_buffer;
};
こんな感じで互換性のあるクラスを切り替えて使えるコードを
書きたいのですが、どうやってそれを実現するのが良いのでしょうか?
ご教示くださいませ
よろしくお願いします。
172:デフォルトの名無しさん
06/11/21 10:24:58
>>171
class test
{
typedef list<T> buffer_type;
//typedef deque<T> buffer_type;
buffer_type m_buffer;
};
173:デフォルトの名無しさん
06/11/22 06:51:19
>>172
ありがとうございます!
174:デフォルトの名無しさん
06/11/23 20:26:55
イテレータのループをまわす時に継続条件として
it != last
と比較するのはなぜなんでしょうか
it < last にしない理由がよくわかりません
「同じモノを指しているかどうか比較できる」が
「イテレータの大小比較はできない」パターンがあるという事でしょうか
175:デフォルトの名無しさん
06/11/23 20:28:21
はい。
176:デフォルトの名無しさん
06/11/23 20:33:07
一番判りやすい例は、双方向リンクリストでポインタの大小関係は
あくまでメモリ上の位置だけでリストの順番とは無関係
177:174
06/11/23 20:36:53
>>175
>>176
そういわれればそうですね
配列やvectorしか頭になかった・・・
リンクリストのイテレータ比較しても意味ないですね
178:初心者
06/11/23 23:37:51
こんにちは。質問です。STLというのはどこでDLできるのでしょうか。
なるべく粗相のないよう簡潔にお答え願います。
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。
179:デフォルトの名無しさん
06/11/23 23:38:52
>>178
朝鮮人は祖国に帰れ!
180:デフォルトの名無しさん
06/11/23 23:42:26
こっちにも来たのかww 20世紀梨キャラメル吹いた
181:デフォルトの名無しさん
06/11/24 00:06:41
>>178
STLport
URLリンク(stlport.sourceforge.net)
182:デフォルトの名無しさん
06/11/24 00:34:36
>>178
現在の標準C++に準拠した処理系にはもれなく付いてくる。
付いてこないようであれば、そんな処理系窓から投げて捨ててしまえ。
勿論、質が問題になることはあるが。
183:デフォルトの名無しさん
06/11/24 19:42:41
>>178
(´・ω・`) n
⌒`γ´⌒`ヽ( E)
( .人 .人 γ ノ
ミ(こノこノ `ー´
)にノこ(
184:デフォルトの名無しさん
06/11/24 21:57:15
>>178
また○u○ak○b○か
185:デフォルトの名無しさん
06/11/25 00:32:14
いいえ、K○s○○a○eではありません。
186:デフォルトの名無しさん
06/11/25 02:09:48
そういうことにしておきたいんですね :-)
187:デフォルトの名無しさん
06/11/25 03:24:25
と言うことにしておいたうえでこの狸うるさい上に粘着なんてイラネ
188:デフォルトの名無しさん
06/11/25 03:44:01
>>187
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。
189:デフォルトの名無しさん
06/11/25 04:03:49
うざいんであぼーんした
190:デフォルトの名無しさん
06/11/26 03:02:39
任意の構造体を格納できるリングバッファを作ろうと考えています。
2つのスレッドがあって、一方が任意の構造体データを追加し、他方が取得します。
取得が遅いためにバッファが一杯になった場合、追加側はブロックさせたいと思います。
スレッドの排他やブロックおよびブロックの解除を実装する必要はあると思いますが
リングバッファくらいならSTLにあるような気がしていて、あるならそれを使って実装しようと考えてます。
STLで任意の構造体をリングバッファに納めるコンテナはありますか?
また速度は(自作するよりは)高速でしょうか?(主観でOKです。)
191:デフォルトの名無しさん
06/11/26 03:06:49
>>190
deque または queue で済むんじゃないかな?
192:デフォルトの名無しさん
06/11/26 03:13:21
>>191
ありがとうございます。早速調べてみます。
193:デフォルトの名無しさん
06/11/26 16:05:30
STLの入門用サイトって需要あると思いますか?
194:デフォルトの名無しさん
06/11/26 16:09:31
>>193
もうたくさんあるから、要らないと思う。不正確な内容のものも多いけど、
正確さを求めるならリファレンスっぽいやつや、規格を見るし。
195:デフォルトの名無しさん
06/11/26 16:44:43
>>194
そっか、勉強がてらに書いてみようと思ったんだけど
196:デフォルトの名無しさん
06/11/26 17:38:36
>>195
そういう目的があるんなら、書いたらいい。
突っ込みとそれに対する改良を重ねる前提で公開するというのは
新しいかもしれない。
197:デフォルトの名無しさん
06/11/26 20:39:59
stl wiki japanese
198:デフォルトの名無しさん
06/11/26 21:37:47
STLはできて結構時間たってるが
まったく枯れてないのでやる価値はある
書籍もSGI STL前提なのでどれも古くなっている
199:デフォルトの名無しさん
06/11/26 22:24:58
後々の発展的な内容としてboost::bindくらいはあってもいいと思う。TR1にも入っているし。
197案のwikiをやるならSTLに限らず標準ライブラリ全てを対象にしてほしい。
200:デフォルトの名無しさん
06/11/27 11:10:03
>標準ライブラリ全てを対象にしてほしい。
禿同。
201:デフォルトの名無しさん
06/11/27 16:36:21
localeとか系統立てた解説ないしな…
202:デフォルトの名無しさん
06/11/27 16:46:39
localeの解説は欲しいな
203:デフォルトの名無しさん
06/11/27 20:03:37
Rogue Wave のユーザーズガイドにあるじゃん
204:デフォルトの名無しさん
06/11/27 22:46:51
std::strstream みたいなストリームクラスで、std::string みたいに可変長のバッファを取り扱えるものはないですか?
内部でバッファを持っていて、データを書き込むたびに、バッファが足りなくなったら確保してくれる・・・みたいなやつです。
205:デフォルトの名無しさん
06/11/27 23:00:19
std::stringstream
206:デフォルトの名無しさん
06/11/28 00:28:34
>>205
調べてみます、ありがとうございました!
207:デフォルトの名無しさん
06/11/28 01:08:38
みんなでwikiらない?
208:デフォルトの名無しさん
06/11/28 01:15:19
Wiki(゚⊿゚)イラネ
STLの本を2冊も買えば十分じゃないか
209:デフォルトの名無しさん
06/11/28 02:05:28
仕様書嫁。それ以外の多くの文献は、あてにならん。
もちろんあてになるものを作ろうという動きは面白いと思うが、
Wiki は情報の信頼性が低下する傾向にあるので、俺は好かん。
210:デフォルトの名無しさん
06/11/28 03:37:07
俺はあっていいと思う。
既刊の書籍があれば誰にとっても十分とは思わないし、
単なるまとめサイトとしてだけでも価値を持ち得る。
211:デフォルトの名無しさん
06/11/28 08:08:05
>>210
じゃあお前が作れ
212:デフォルトの名無しさん
06/11/28 08:24:27
何かやる気があるなら、先に cppreference の日本語訳を最新にしてくれ。
213:デフォルトの名無しさん
06/11/28 09:24:43
URLリンク(www.cc.nao.ac.jp)
でいいだろ。google でグぐるとトップにくるくらいだ。
214:デフォルトの名無しさん
06/11/28 12:53:46
>>204
ostringstream は?
215:デフォルトの名無しさん
06/11/28 12:55:42
>>214
>>205
216:デフォルトの名無しさん
06/11/28 15:36:02
いつからストリームI/OがSTLになったんだ。
217:デフォルトの名無しさん
06/11/28 16:26:56
最近 STL がなんだかがっくりしているように見えてきた
218:デフォルトの名無しさん
06/11/28 16:45:08
長い髪が、こう、顔の前にブァサっと来てる感じか。貞子風に。
219:デフォルトの名無しさん
06/11/28 17:20:06
>>217-218
てめぇらゆるさねぇ。
そう見えるようになっちまった。
220:デフォルトの名無しさん
06/11/28 19:06:05
xstringについて質問なんですが、
Vc7\includeの下とVc7\crt\srcの両方にあるんですが、
現在、私のプログラムでこの二つを勝手気ままに呼び出しててえらいことになってます。
どちらか一方だけを呼ぶことってできるのでしょうか?
221:デフォルトの名無しさん
06/11/28 23:28:08
vc7\crt\srcをincludeに含めてるってこと?
アホか
222:デフォルトの名無しさん
06/11/28 23:37:37
あるソースでは #include <Vc7\include\xstring>
になってて、別のでは #include <Vc7\crt\src\xstring> ってなってるとか?
223:デフォルトの名無しさん
06/11/28 23:50:15
ワロスw
まさかとは思うがそれなら自分で変更しろよww
224:初心者
06/11/29 01:40:11
質問です。Standaado Tenplate Libraryを使って作りたいのですがどうすればよいのでしょうか?
注:現在、私は公私ともに多忙を極め、スレを見ることが困難な状況です。
しかしその中でも何とか時間を作り、このスレに出向いて質問をしています。
そのような貴重な質問者に対し、1行レス、煽り、罵倒で返す愚か者がいるようですが
私のような質問者がいなければそもそもあなたたちの知識をひけらかす場が
存在しないことをよく認識し、身の程をわきまえるべきであります。
よって、私のような貴重な質問者に対し、見下した回答、儀礼を欠いた回答
(例:質問してくれてありがとうございました等のお礼がない、である調で答える、
様をつけない、w等の意味不明な言葉を発する)を禁止いたします。
ましてや自分の立場もわきまえず逆にお礼を強要したり、各人の目に触れやすくなるよう
多数のレスに同様の質問をしているのを「マルチポスト」呼ばわりするような輩は
当然加害対象として私のリストに載ることになります(賢い方は意味がおわかりでしょう)
この規則は2chの精神にものっとっており、強制的に施行されます。もし違反した場合には
2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には
2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから
FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置
を取らせていただきます。また、形式的にはちゃんとした回答であっても、知識不足のため
不正確な知識を回答することも禁止いたします。よく考え、よく調べ、正確な回答を
するように心がけましょう。なお、当方が質問に対し多少は役に立つと判断した場合は
それなりに評価するのでご安心下さい。なお、確認はこの啓蒙文を読んでいることを
前提としており、読んでいない、理解できない等のいいわけは一切通用しません。
また、有識ある諸君は今後自分の発言に対しこの啓蒙文をコピペすることが義務になります。
225:デフォルトの名無しさん
06/11/29 01:43:01
あぼーんした
226:デフォルトの名無しさん
06/11/29 01:46:40
>>225
でましたね。啓蒙文にしっかり書いておいたのにこういう輩が。
おそらく私に対抗しうる人物は国家権力を使えるということでしょうが
こちらは世界権力を行使できる立場にいます。
国連をご存じでしょうか?そう、あのアメリカさえも畏れる恐怖の世界組織です。
私はそこと内通しており、今回のような自体には世界権力の行使も辞さない構えです。
227:デフォルトの名無しさん
06/11/29 01:50:36
おいおい、深夜にわらかすなよw
228:デフォルトの名無しさん
06/11/29 01:57:29
>>226
あぼーんした
229:デフォルトの名無しさん
06/11/29 02:06:29
マジレスすると、Standaado Tenplate Libraryというものは未だこの世に存在しないはず。
少なくとも俺は聞いたことが無い。知っている奴は是非とも名乗りを上げてくれ。
さて、存在しないということはこれから作られるということだ。
つまり、224が自分の思い通りに描けば、それがStandaado Tenplate Libraryになる。
それが芸術というものではないだろうか。
230:デフォルトの名無しさん
06/11/29 02:13:42
正直面白いwwww
231:デフォルトの名無しさん
06/11/29 08:17:10
>>224
>2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には
>2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから
>FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置
>を取らせていただきます
通報しました。
232:デフォルトの名無しさん
06/11/29 12:31:08
229のマジレスに惚れた
233:デフォルトの名無しさん
06/12/01 07:55:16
STL語ろよ
234:デフォルトの名無しさん
06/12/02 06:01:13
STLゴロよ
最近はそんな商売もあるのか。
235:デフォルトの名無しさん
06/12/03 11:48:02
テンプレートのインスタンス化結果を
ソースレベルで表示できるコンパイラってありますか?
template<typename T>
void foo(T arg){
cout << T;
}
foo<int>(50);
を
void foo(int arg){
cout << arg;
}
に展開してくれる様な
この機能があればテンプレート絡みの意味不明なコンパイルエラー
の修正が、かなり楽になりそうなんですが・・・
236:デフォルトの名無しさん
06/12/03 12:15:29
VC8のエラー表示は十分分かりやすいと思うけど
普段使ってるコンパイラはどんなエラー表示を出すの?
237:デフォルトの名無しさん
06/12/03 13:12:32
>>235の質問にはそんなコンパイラ知らないだけど、テンプレートのエラーで悩むくらいならいっそ使うのやめたほうがいいと思う。
238:236
06/12/03 13:18:24
>>237 いやーでもVC6の呪文のようなエラーだったら挫折しても仕方なくない?
effective STLでもエラー表示を理解しようみたいな項目があったくらいだし
239:235
06/12/03 13:52:47
いやー自分で作ったテンプレートライブラリならわかるんですけど
boostとか使用していて特殊化やオーバーロードが絡んでくると
エラー解析に時間がかかって・・・
さんざん悩んでタイプミスでした。とかたまにあるんで
ちなみにVC6使ってるのでVC8に変えてみます
240:デフォルトの名無しさん
06/12/03 15:06:09
STLのエラー解析ならSTLFilt使ってみろよ。
URLリンク(www.bdsoft.com)
241:デフォルトの名無しさん
06/12/03 19:46:56
まあ、俺も初めて std::string を知ったばかりのころは、
basic_string ってなーに? traits?? allocator??? ヽ(`Д´)ノ だったな
242:237
06/12/03 19:58:04
たしかにSTL関連のエラーはわけ分からんな。
ただ、大量にエラー出るわりに、ミスってるのは一箇所とかだったりするんで見慣れてると何とかなるかも。
まあ、経験論なので参考にはならんな。
243:デフォルトの名無しさん
06/12/03 19:59:55
まあアロケータだのコンテナだの細部まで理解しなくても簡単かつ安全に使えるようなライブラリがかける
ってのがオブジェクト指向の目指してることだと思うんだけどね。
244:デフォルトの名無しさん
06/12/03 20:49:00
STLとオブジェクト指向は関係ないと思うが
245:デフォルトの名無しさん
06/12/03 20:58:45
>>244
ですよねー^^
246:デフォルトの名無しさん
06/12/03 21:06:53
>>245
お前>>243か?お前みたいなオブジェクト指向を勘違いしてる奴が多いから
巷に間違ったオブジェクト指向の知識があふれてるんだよ。STLってのはジェネリックプログラミング
のC++での実装方法であってオブジェクト指向とは何の関係もない。
247:デフォルトの名無しさん
06/12/03 21:08:48
>>246が正論だな。激しく同意する。
248:デフォルトの名無しさん
06/12/03 21:10:08
>>246俺も日頃そう思っていたところだ・・・。正直オブジェクト指向も分かってない素人はプログラミングをやるべきじゃないと思う。
249:デフォルトの名無しさん
06/12/03 21:12:36
何この流れ('A`)
250:デフォルトの名無しさん
06/12/03 21:14:27
ジェネリック指向とオブジェクト指向の関係を的確に言い当てると…↓↓↓
251:デフォルトの名無しさん
06/12/03 21:16:19
アルゴリズムとデータ構造をパッケージングしたクラス、それがSTL。
252:デフォルトの名無しさん
06/12/03 21:18:09
こういう言葉の定義とかになるとやたらハッスルする人ってよくいるよね
253:デフォルトの名無しさん
06/12/03 21:21:02
>>252みたいなやつっていっこうに消えないよね
254:デフォルトの名無しさん
06/12/03 21:25:14
オブジェクト指向的ジェネリック指向まだー?
255:デフォルトの名無しさん
06/12/03 21:26:20
>>250,254 関係ない。
256:デフォルトの名無しさん
06/12/03 21:28:22
ジェネリックはオブジェクト指向とは関係ないと思うがSTLはオブジェクト指向で作られてるやん。
257:デフォルトの名無しさん
06/12/03 21:29:38
>>255
物ベースでジェネリック!
258:デフォルトの名無しさん
06/12/03 23:24:15
>>256
違う。STLはジェネリックプログラミングを用いているがオブジェクト指向は
用いていない。端的なポイントを挙げるなら、仮想関数に基づいていない。
継承と動的多態がないものをオブジェクト指向と呼ぶのは、
>>246の言う巷に溢れる間違い。
(言語によっては多少異なった形で実現されることもあるのがややこしいところだけど)
259:デフォルトの名無しさん
06/12/04 00:06:26
正直オブジェクト指向とか出てくるとこういう定義厨がでてくるからうざい
260:デフォルトの名無しさん
06/12/04 00:13:38
>>258
何を根拠にそんな不可解な定義を信じてるの?
261:デフォルトの名無しさん
06/12/04 00:35:58
RUBY最強杉!!!
262:デフォルトの名無しさん
06/12/04 00:58:43
>>260
258ではないけど、お前は何だったらオブジェクト指向と言うと思うのか?
>>256
258によれば(と言っておく)、クラスを使っているからといってオブジェクト指向プログラミングではないぞ。
263:デフォルトの名無しさん
06/12/04 01:01:26
スレ違いだからほどほどを願いたいが
「便利なクラス」を作ることがOOだと主張する困ったちゃんはちょくちょく見る
264:デフォルトの名無しさん
06/12/04 01:08:03
スレ違いだからほどほどを願いたいが
OOというといきなりその定義を延々と語り説教を始める困ったちゃんはちょくちょく見る
265:デフォルトの名無しさん
06/12/04 01:09:10
>>264
おまえのことだな
266:デフォルトの名無しさん
06/12/04 01:14:36
スレ違い。OOがどうとか話してる低レベル野郎はどっかいけ
267:デフォルトの名無しさん
06/12/04 01:42:46
オブジェクト指向云々以前にさ
>>243
>まあアロケータだのコンテナだの細部まで理解しなくても簡単かつ安全に使えるようなライブラリがかける
これはSTLのことを指して言ってるの?
どうでもいい使い捨てのコードを書く場合は確かに細部を気にせず使うけど、
仕事で使う場合は結局STLの細部まで知っている必要がある気がする。
268:258
06/12/04 01:42:54
>>260
不可解かな。根拠は、例えばこのへん:
URLリンク(en.wikipedia.org)
→ "1 Fundamental concepts"
オブジェクト指向プログラミングを特徴づけるものは7つ。クラス、オブジェクト、
メソッド、メッセージ送信、継承、カプセル化、抽象、多態(ポリモーフィズム)。
これらを備えるものをオブジェクト指向言語と呼ぶが、場合によってはいくつかを
欠く。
ダメ情報源でなければ、およそ似たことが書いてあると思う。
STLはtemplateによる静的多態性に立脚しているわけで、
STLそれ自体は動的多態性を旨とするオブジェクト指向とは異なる作りをしている。
ユーザがオブジェクト指向とSTLを同一プログラム内で使い分けるのは自由だけどね。
269:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/04 02:22:30
なんでおまえらは荒れるとわかっててその話題をスルーしませんか
271:デフォルトの名無しさん
06/12/04 02:28:16
このスレは要らないと思ってるから。
272:デフォルトの名無しさん
06/12/04 02:28:39
コードの多態っぷりはまさにオブジェクト指向っぽいんだが
ランタイムに動的ディスパッチしないと一部の人は納得しないんだろうなあ
273:258
06/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 に記載がある:
URLリンク(www.research.att.com)
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:デフォルトの名無しさん
06/12/04 07:24:07
>>270
能力の無さを、必死さとか粘着質とかでカバーして
それなりに「論陣張ってるっぽく振る舞える」話題だからだよ。
普通の「出来る奴だけが輝ける」話題で一切まともなこと言えない馬鹿が
ここぞとばかりに頑張ってる。
「自分の居場所を見つけた!」ってね。
275:デフォルトの名無しさん
06/12/04 11:05:15
real worldってまだそんな妄想を語る奴がいるのかよ
信じられん
276:デフォルトの名無しさん
06/12/04 13:45:28
流れ自体がどうでもいいから、ここでもどうでもいいこと言うぜ
知ってるやつも多いだろうが
今年の基本情報の問題に "自動車のサブクラス" を問う問題が出たんだ…
さすがに内心笑ったやつは多いと思うよ…
277:デフォルトの名無しさん
06/12/04 15:54:45
全然ダメだな
やっぱオブジェクト指向は”動物クラス”から”犬クラス”と”猫クラス”を派生させないとね!
そして多態で鳴く
278:デフォルトの名無しさん
06/12/04 16:13:41
実務に関係ない喩えで出題してんのか・・
まあ基本情報はそんなものだろうけど
279:デフォルトの名無しさん
06/12/04 16:19:11
大切なのは概念…って馬鹿かって感じだわな。
280:デフォルトの名無しさん
06/12/04 17:41:10
オブジェクト指向:関連するデータ構造とアルゴリズムを乖離させないのが目的。クラスその他は実現のための手段
じゃだめなの?
多態性の本質を的確に教えてくれ(´・ω・`)
281:デフォルトの名無しさん
06/12/04 18:02:05
>多態性の本質を的確に教えてくれ(´・ω・`)
インタフェイスと実装の論理的な分割じゃねーの。
実装が変わっても、インタフェイスが同一であれば接続可能。
282:デフォルトの名無しさん
06/12/04 18:13:34
クラス使えればオブジェクト指向かとおもってたよorz
具体的にコード書くのは仕事やってればいやでも身につくけど
こういうのは自分で勉強しないとだめだからねぇ・・・
今からでもまじめに勉強しようかな
283:デフォルトの名無しさん
06/12/04 19:03:36
>>282
英語版のwikipediaお薦め
284:デフォルトの名無しさん
06/12/04 20:24:10
これぞ窮極のオブジェクト指向
スレリンク(tech板)
話をSTLに戻そうぜ。
285:デフォルトの名無しさん
06/12/04 20:36:16
>>284
もっとましなスレを出せよ。やはり嵐か?
286:デフォルトの名無しさん
06/12/04 20:45:11
話をSTLに戻そうっていってるだけなのに荒らし扱いなんかよ・・・
OO厨は怖いな・・・
287:デフォルトの名無しさん
06/12/04 21:12:07
そりゃお前、「俺はこんなにもわかってる奴なんだ」ってのを
必死でアピールする場を奪われちゃたまらないだろう。
288:デフォルトの名無しさん
06/12/04 21:30:17
>>284がもっとマシなスレを出していればねぇ('A`)
289:デフォルトの名無しさん
06/12/04 22:23:41
至高スレなくなっちゃったしなぁ。
290:デフォルトの名無しさん
06/12/04 22:49:55
RUBYYYYYYYYYYYYYYYYYYYYYYY!!!!!!!!!!!!!!!!!!!!!!!
291:デフォルトの名無しさん
06/12/04 23:15:02
しーしゃああああああああぷうううううううううううううううううううううううううううううううううううううう!!!!!!!!!!!!!!!!!!!!!!!!!!!
292:デフォルトの名無しさん
06/12/04 23:30:27
しいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
293:デフォルトの名無しさん
06/12/05 00:13:47
RubyがC++よりはるかに優れているのは自明であって
今さらそんなことで荒らしに来るRuby信者なんか居ないから
騙っても無駄だよ。
294:デフォルトの名無しさん
06/12/05 00:15:49
>>293
騙りも何も君みたいなのがいるじゃない^^
295:デフォルトの名無しさん
06/12/05 05:55:02
293みたいなまともな人間がいる、から、なに?
296:デフォルトの名無しさん
06/12/05 10:05:45
RUBYを知らない者はオブジェクト指向を知らず、という格言もあることだし。
297:デフォルトの名無しさん
06/12/05 12:52:05
言語が優れてるだの劣ってるだのいってる人間がまともなのか・・・
言語のある特定の部分、という点ならわかるけど。
298:デフォルトの名無しさん
06/12/05 13:06:21
ようするにD言語マンセーと。
299:デフォルトの名無しさん
06/12/05 13:13:41
なにいってんだE言語だろ
300:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/06 00:24:28
>>296
RUBY信者のキモさを見事なまでに表現した格言だな。
302:デフォルトの名無しさん
06/12/06 00:24:36
RVOとは違うんだっけ?
303:デフォルトの名無しさん
06/12/06 01:48:05
Rubyは完全オブジェクト指向でRuby使えると大体下位互換のC++とかPythonとかJavaは
簡単に使えるようになるから東大の教養学部でもRuby教えるようになったんだよね。
304:デフォルトの名無しさん
06/12/06 01:51:38
C++はオブジェクト指向「も」使えるだからね。正直C++で書いてるという人の9割はオブジェクト指向
というものを分かってないと思う。Ruby自体はオブジェクト指向に関してはC++より圧倒的に優れてるけど
いかんせんスクリプト言語だから遅いんだよね・・・
まあ最初に勉強する教育目的の言語ではRubyの方がいいと思うが。
305:デフォルトの名無しさん
06/12/06 01:51:55
Ruby みたいな低級言語ですら Ruby では書けない。
その程度の記述力、実行効率。
306:デフォルトの名無しさん
06/12/06 01:55:34
低級っていうのは言語としてよりネイティブであるということですが・・・(笑)
まあ揚げ足取りはさておき、少なくともネイティブアプリをかけること自体は
今はそんなにマイナスポイントではないね。そういうのは一部のハッカーが書けばいい。
RubyとかJavaがCとかC++に比べて今世界でもっとも広く使われるようになってきたのは
そういうネイティブコードよりも可読性、オブジェクト指向との親和性が高いからだしね。
307:デフォルトの名無しさん
06/12/06 01:56:39
rubyがC++より圧倒的に優れてるのは当たり前だがそれはスレ違いだろ・・・
308:デフォルトの名無しさん
06/12/06 01:58:33
いやまぁそれは同意するけど、可読性の高い良い言語でもやりたいことが
妥当な性能で出来なきゃ使えないってことも事実なわけで。
309:デフォルトの名無しさん
06/12/06 02:06:09
でも性能が必要な現場なんてそうそうないような・・・
それに数値計算以外はrubyはCに匹敵する速度が出るし
特にネットワークアプリとかをわざわざ他の言語で書く理由がみあたらない。
スレ違いスマソ
310:デフォルトの名無しさん
06/12/06 02:13:12
>>309
>でも性能が必要な現場なんてそうそうないような・・・
ここ C++ のスレだから、基本的に性能が必要な現場の人が語らうとこだと思う・・
311:デフォルトの名無しさん
06/12/06 02:14:49
なんだこの流れ・・・
312:デフォルトの名無しさん
06/12/06 02:20:37
Rubyへの嫉妬心が、
普通ならあっという間に流れて終わるだけの限りなく独り言に近い書き込みを
ここまでのホットトピックに育ててしまったのです。
313:デフォルトの名無しさん
06/12/06 03:07:36
ルビ厨復活か?
Del厨は結局復活しなかったな
314:デフォルトの名無しさん
06/12/06 03:42:26
ネタが無いから一人で煽ってるものとばかり
315:デフォルトの名無しさん
06/12/06 06:30:51
>>300
デフォルトコピーコンストラクタが呼ばれてるんじゃないの?
316:デフォルトの名無しさん
06/12/06 07:34:27
>>303
シラバス検索してみてもヒット0件だったが。
317:デフォルトの名無しさん
06/12/06 11:17:37
>>316
ニュースで出たぞ
318:デフォルトの名無しさん
06/12/06 17:27:23
11/3の日経一面に出てたね。来年からだって。
319:デフォルトの名無しさん
06/12/06 17:31:34
下位互換・・・・・
320:デフォルトの名無しさん
06/12/06 17:35:30
>>303
rubyってdefine や templateとかもあんの?
オブジェクト指向型の言語やってりゃJavaとかの習得が楽ってのはわかるけど、
それだけじゃC++を使いこなすには足りないと思うし。
321:デフォルトの名無しさん
06/12/06 18:02:35
STLとはあんま関係ないけど自分でTemplateクラス書くときってFriend関数使う?
それともFriend関数はなるべくないようなクラス設計を目指す?
322:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/06 19:10:59
>>322
あーまさに後者の場合が問題だったんだよね。こういうときも無理矢理でもfriend使わないような
設計にしちゃった方がいいのか気になってた。
レスありがとう!
324:デフォルトの名無しさん
06/12/07 12:02:35
C言語で構造体のコピーってmemcpyでやってましたが、
C++で構造体にstd::stringメンバが入ってる場合の構造体コピーってどうやるんでしょうか?
325:デフォルトの名無しさん
06/12/07 12:17:48
C でも C++ でも、構造体のコピーには代入を使っておけばいい。
326:デフォルトの名無しさん
06/12/07 20:01:50
STLport 5.1.0 release.
URLリンク(sourceforge.net)
327:デフォルトの名無しさん
06/12/07 20:50:01
またインストールせねば・・・
328:デフォルトの名無しさん
06/12/07 23:31:58
もうSTLportの役目は終わっただろ
329:デフォルトの名無しさん
06/12/08 00:12:32
>>328
_STLP_NO_EXCEPTIONS をと同等の設定をわざわざサポートしてくれるコンパイラベンダは無さそう。
330:デフォルトの名無しさん
06/12/08 00:25:47
>>328
状態を持つアロケータをサポートしてくれたのは大きいだろう。
331:デフォルトの名無しさん
06/12/08 00:44:17
>>330
状態って?
332:デフォルトの名無しさん
06/12/08 00:48:50
>>331 非 static データメンバ
333:デフォルトの名無しさん
06/12/08 01:14:37
フツーのSTLのアロケータの実装は、なんちゃってシングルトンってこと?
334:デフォルトの名無しさん
06/12/08 01:57:08
>>333
そんなところ。
インスタンスをコンテナごとに持つところまでは決まってるんだけど、
同じ型のインスタンスを区別して扱うことを標準が強制しておらず、
現行の実装はそのことに依存してしまっているものがほとんど。
list a, b があって、これらが異なるアロケータインスタンスを使っているとき、
splice() を使って a <-> b 間で部分的な要素を受け渡すと面倒なことが起こるはず。
標準が強制しなかったのも理解できるし、 STLport の実装も(まだ見てないけど)興味深い。
335:デフォルトの名無しさん
06/12/09 22:41:28
てすてす
336:デフォルトの名無しさん
06/12/13 19:26:04
質問です。
multimap利用して同一キーに複数の値をinsertしたとき
iterator itr = lower_bound(key) のあと
itr++の順番で値を表示していく場合
insertされた順番に表示される、でいいのですか?
なんかうまく表現できないけど察していただけるとうれしいです。
337:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/13 20:41:49
>>337
setは中の値を使ってデータを並べてるんだから書き換え不可。
新たなsetを作り直すしかないと思う。
339:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/13 22:19:02
>>336
multiset/multimapでは同値なオブジェクト同士の順番に関する保証はない
341:デフォルトの名無しさん
06/12/13 22:35:59
>>336
それらしい記述が見つからないから未定義かもしれん。
342:341
06/12/13 22:37:00
やべ
343:337
06/12/14 08:53:30
>>338,339
なるほど、ちょっと理解が深まりました
一度データを追加&削除で対応することにします
ありがとうございました
344:336
06/12/14 13:17:44
並び順に関する保証はないですか・・・
ファイルの内容を読み込んで、いくつかの種類に順番に分類するとしたら
順序コンテナを分類する数だけ用意するほか無いのでしょうか?
345:デフォルトの名無しさん
06/12/14 13:49:41
std::map<Key, std::list<T> > でええやん
346:デフォルトの名無しさん
06/12/14 16:50:02
vector & stable_sort & equal_rangeもあるな
347:デフォルトの名無しさん
06/12/15 06:42:32
intやdoubleをstring型にしたいんだけど
一度sprintfなどでchar*にコピーしてからコンストラクタに渡すしか方法はないかな
348:デフォルトの名無しさん
06/12/15 06:50:20
boostを入れてたのを思い出したのでlexical_castで解決しますた
けど、boostない環境では普通にsprintfやstringstream経由でないと不可能?
349:デフォルトの名無しさん
06/12/15 06:51:55
>>348
Exceptional C++ Style の最初の項を立ち読みしてきなさい
350:デフォルトの名無しさん
06/12/15 13:32:41
>>348
boostのソースを読んでみればいいじゃないか。
普通にstringstream使ってるだけだぜ?
351:デフォルトの名無しさん
06/12/15 22:31:32
つうかstringstreamの何が不満なのか
352:デフォルトの名無しさん
06/12/15 23:08:59
標準をそのまま使うのが急にダサいと感じ、ズレたものを好むようになる・・・中二病?
353:デフォルトの名無しさん
06/12/15 23:16:42
強いて言うなら速度とかメモリ消費量?
354:デフォルトの名無しさん
06/12/15 23:22:14
速度とかメモリ消費量を無意味に気にして、保守性を低下させる・・・中二病?
355:デフォルトの名無しさん
06/12/16 03:00:41
速度を重視すべきな場合STLは使うべきではないのでしょうか。
std::vectorくらいなら大丈夫だと思ってたんですけど。
でも実装によるとか言われそうだ。
356:デフォルトの名無しさん
06/12/16 06:27:10
>>355
使ってみて(≒測定して)から文句言え。
357:デフォルトの名無しさん
06/12/16 06:29:23
いよいよmove semanticsが欲しくなるな
358:デフォルトの名無しさん
06/12/16 12:09:57
iostream系は書式指定が面倒
というか俺が覚えてないから調べるのが面倒
359:デフォルトの名無しさん
06/12/16 12:12:52
>>358
覚えていても面倒だよ。
そこでboost::ほにゃららですよ、と言うといろいろ召還しそうなのでやめとく。
360:デフォルトの名無しさん
06/12/16 12:13:38
sage忘れごめんorz
361:デフォルトの名無しさん
06/12/16 13:29:52
boostっていつc++にはいるんだろうね?
362:デフォルトの名無しさん
06/12/16 14:10:09
boostのサイトでTR云々かいてあるのは入る予定なんじゃないの
363:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
06/12/16 15:39:43
それは時期正式リリース候補だ
364:デフォルトの名無しさん
06/12/16 16:54:14
俺printf使ったこと無いからiostreamの方が駱駝
365:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/16 17:50:59
>>365
これじゃダメなのか?
transform(a.begin(),a.end(), inserter(b, b.begin()), f);
367:デフォルトの名無しさん
06/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
06/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:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/16 19:23:17
失礼
-int get_twice (int n) {return n;}
+int get_twice (int n) {return n * 2;}
371:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/16 19:39:38
>>367
set の set がただの set に変換できるの?
4 の2乗の 16 と 8 の2倍の 16 が区別できないんじゃないか?
あ、その前に set だと {4,4} からして無理だな。
373:デフォルトの名無しさん
06/12/16 19:49:05
>>372
それがもし問題ならmultisetにすれば解決するね
374:365,367
06/12/16 19:51:43
>>369,370
レスありがとうございます
確かにそれでうまくいきそうですね
ちょっと後出しになってしまって申し訳ないですが
今回2倍と2乗を返すという設定にしたのは、
質問内容の簡略化のため要素数が変わるような関数の例として作ったものです
実は、あるパズルを解くために
数字をn個使って作れる数の集合を求める関数というのが必要になり
この場合、2倍と2乗のように入力と出力の数が同じになるように
うまく分割することが出来なさそうなんです
(出来るかもしれないけど、自分にはわからないので・・
一応、さっきのプログラムの要領で解決はできそうなんですが
他に良い方法ってあるでしょうか
375:デフォルトの名無しさん
06/12/16 19:57:04
> 数字をn個使って作れる数の集合
こういう感じ?
n = 1のとき{1, 2, 3, ..., 9}
n = 2のとき{10, 11, 12, ..., 99}
376:365,367
06/12/16 20:00:34
>>371
申し訳ないです
レス書いてる間にプログラムまで、感謝です
>>372
今回は区別の必要がないので、
同じ値があったら追加しないということにしたら変換できるかなと
必要なら>>373さんのようにすればよいと思います
377:365,367
06/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:デフォルトの名無しさん
06/12/16 23:08:17
質問があります。
typedef struct stdata{
int nNum;
string sText;
}LISTDATA_T;
vector<LISTDATA_T> vlist;
というデータがあるとして、vectorのデータ内を
nNumの値でソートしたいのですが可能でしょうか?
379:デフォルトの名無しさん
06/12/16 23:11:26
そういう関数オブジェクトを作れば可能。
或いは全体的にnNumで比較するのが適切であれば、
operator <の定義を考えたほうが良いかもしれない。
380:デフォルトの名無しさん
06/12/16 23:18:47
template <class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
お使いのでこれが対応知れてば余裕。
381:378
06/12/16 23:27:23
>>379,380
レスありがとうございます。
試してみます。
382:355
06/12/17 03:34:55
容量1000の配列全要素に対してforで回して0を代入するという動作を10000回繰り返した。
配列は配列([])とstd::vectorで[]を使ったのとiteratorを使ったの3通り。
std::vectorで[]を使うと配列の時の約2.5倍、
iteratorを使うと配列の時の約1.5倍時間がかかった。
383:デフォルトの名無しさん
06/12/17 05:03:01
処理時間が一時間とか一日とかかかるプログラムでは致命的だな。
どうしようもない。
384:デフォルトの名無しさん
06/12/17 05:10:57
最適化で全くかわるね
Linux GCC
-O3 だと
vector[] = array[] > vector::iterator > vector.at()
-O1 だと
array[] > vector[] > vector.at() > vector::iterator
ただ、最速、最遅で4倍も違わないからどれでもいいと思う。
こんなのカスみたいなコストだ。
385:デフォルトの名無しさん
06/12/17 08:26:07
そりゃまぁ、ほぼ無意味なループで速度比較してもそんなもんだよな。
実際にはループ一回辺りの処理時間が増えるからますますその差の意義が薄れる。
386:デフォルトの名無しさん
06/12/17 11:44:53
>>382
0で埋めた後でその総和を取ったりとかしてないと、そもそもループ丸ごと最適化で消されたりするんだが。
ちゃんとやってるよな?
んでうちの結果はイテレータのみ倍遅い。あとは全部誤差の範囲。
つーか、10000回程度だと負荷が軽すぎだろ。
387:デフォルトの名無しさん
06/12/17 12:27:17
vectorの提供する機能と必要なコストを天秤にかけて
妥当だと思うときにvectorを使うのよね
array[]で済むならarray[]使えばいいのです
388:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
06/12/17 20:48:16
内側でvolatileな変数宣言したりしてればきちんと阻害される
389:デフォルトの名無しさん
06/12/18 21:51:49
iteratorのforでの書き方にもよりそうだが
390:デフォルトの名無しさん
06/12/18 23:41:25
>>382,>>387
vector<int> v;
v.resize(1000);
int *p=&v[0];
としてv[i]のかわりに *(p+i)を使えば速度は同じになる。
391:デフォルトの名無しさん
06/12/18 23:45:00
ループのマイクロベンチが何だというんだ。
マイクロベンチで1:2.5みたいな差が出ても
アプリに落ちれば30:31.5くらいだろw
392:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
06/12/18 23:59:29
そこでvector<Is32vec4>とか
393:デフォルトの名無しさん
06/12/19 00:05:01
>>382
配列は代入のみでvectorはallocateと代入で、比較してる操作が
違うから当然の結果だろうね。resizeしての比較をするべきだろう。
394:デフォルトの名無しさん
06/12/19 01:41:46
>>393
allocateは関係なく、単純な代入だけでも差がでる。
関数をコールしている分vectorは遅いのではないか?
395:デフォルトの名無しさん
06/12/19 01:55:41
>>394
最適化はかけたか?デバッグオプションは付いてないか?
396:デフォルトの名無しさん
06/12/19 03:10:31
>>394
具体的なベンチコードとコンパイラの名前とバージョンさらせ。
397:デフォルトの名無しさん
06/12/19 06:54:48
>>394
inline関数が遅いなんてことはない。operator[]が
*(begin() + _Pos)なので遅い。
398:デフォルトの名無しさん
06/12/19 07:57:08
>>397
> *(begin() + _Pos)なので遅い。
なんでだよ
399:デフォルトの名無しさん
06/12/19 09:20:35
beginはinspectorだろ。
400:デフォルトの名無しさん
06/12/19 09:26:13
>>399
それが遅い理由なの?
ごめん。意味わかんない。 inspector って、何の用語?
401:394
06/12/19 14:23:35
>>395-397
VC++7.1,stlportをマルチスレッドオプションを付けてコンパイルしている
(cl /GX /O2 /MT ...)
やはりvectorの方が普通の配列より2割ぐらい遅いね。
402:デフォルトの名無しさん
06/12/19 14:24:54
マルチスレッドだとアロケートがコスト(比較的)大だからなぁ・・・
403:394
06/12/19 14:33:26
resizeしてから計測しているのでallocateは関係ないはず
404:デフォルトの名無しさん
06/12/19 14:57:45
forなんかでまわさずTSCで計ったら?
405:デフォルトの名無しさん
06/12/19 15:31:20
javaでいうLinkedHashMapみたいなのは自作しないと無理?
挿入順序覚えてくれてる連想配列なんだけどvectorとmap併用かしら?
406:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/19 16:55:23
Boostにmulti_index_containerという複数の順序付けを指定できるコンテナがあるんだが、だめか?
408:デフォルトの名無しさん
06/12/19 18:42:47
>>407
だめ だけど勉強になりました。
ありがとう。
409:デフォルトの名無しさん
06/12/19 18:57:04
vectorはヒープから割り当てるから、
スタック上の配列と比べてメモリのキャッシュに乗りにくいのかな。
410:デフォルトの名無しさん
06/12/19 18:59:14
アロケー(ry
411:デフォルトの名無しさん
06/12/19 19:35:04
すみません、質問させてください
基本型あるいはユーザ定義型の配列の要素数を返す関数を作ろうとしてるんですが
arrayがユーザ定義型の配列であった場合でも
/* ① */の処理がコンパイルされるためエラーになってしまいます
template <typename T> void count(T array[]){
if(boost::is_pod<T>::value){/* ① */}
else{/* ② */}}
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
06/12/19 19:49:26
あ、boostスレと間違えた^^;
向こうで質問しなおしますね
413:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/20 11:25:44
>>413
aがconstなんだろ。
const_castすればいけるだろうが、それは何か間違ってる。
415:デフォルトの名無しさん
06/12/20 11:42:13
>>413
vector< shared_ptr<A> > b = a;
for( vector< shared_ptr<A> >::iterator itr = b.begin(); ...
416:デフォルトの名無しさん
06/12/20 11:46:55
おっしゃるとおり、aがconstでした。ありがとうございました。
417:デフォルトの名無しさん
06/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:デフォルトの名無しさん
06/12/20 18:34:15
まず何処で落ちてるのか、STLの中まで追っかける。
419:デフォルトの名無しさん
06/12/20 18:41:02
>>417
原因はsetというより十中八九
Xだろうね
420:デフォルトの名無しさん
06/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です。