【C++】STL(Standard Template Library)相談室 6
at TECH
1:デフォルトの名無しさん
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)
・解説
Wikipedia項目リンク
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 の日本語訳を最新にしてくれ。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5129日前に更新/162 KB
担当:undef