【C++】STL(Standard Template Library)相談室 6
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
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/
でよろしくお願いします
0002デフォルトの名無しさん
2006/10/14(土) 19:23:15http://pc8.2ch.net/test/read.cgi/tech/1104898734/562
562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。
このスレが不要である事に疑いの余地は無い。
0003デフォルトの名無しさん
2006/10/14(土) 19:28:17http://pc8.2ch.net/test/read.cgi/tech/1104092624/
0004デフォルトの名無しさん
2006/10/14(土) 19:29:47STL標準講座―標準テンプレートライブラリを利用した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
0005デフォルトの名無しさん
2006/10/14(土) 22:27:05乙
0006デフォルトの名無しさん
2006/10/15(日) 17:04:15http://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/ ;
0007デフォルトの名無しさん
2006/10/16(月) 02:27:40連想コンテナへのinsert(i, j) (iとjは入力反復子)って、
例外安全性は強い保証?それとも基本?
規格を眺めたが言及が見つからず…
0008デフォルトの名無しさん
2006/10/16(月) 05:12:29C++はメモリのアロケートが貧弱な気がする。
0009デフォルトの名無しさん
2006/10/16(月) 06:34:32どんなテストをしたの?
0010デフォルトの名無しさん
2006/10/16(月) 06:49:26規格とDR読み通したけれどこれは単に抜けてるだけのような
0011デフォルトの名無しさん
2006/10/16(月) 09:49:53無いと困るような気はするんだが、ちょっと見当たらない。
0012デフォルトの名無しさん
2006/10/16(月) 16:59:09あちこちに散りばめられている。(個々の関数の解説にあったり、先頭で一斉に指定されていたり)
>>8
本当にありケーとが駄目というのが原因なら、アロケータを差し替えてみるとどうだろう?
00138
2006/10/16(月) 18:48:40普通にforループでpushしていくだけのもの。
>>12
STLportに変えてみたら同じぐらいの速さが出た。
VC8標準のやつが遅かっただけみたい。
00148
2006/10/16(月) 18:57:270015デフォルトの名無しさん
2006/10/16(月) 19:05:33特に指定しないと、stackはdequeを使って実装される。
ttp://www.wakhok.ac.jp/~sumi/stl/header/stack.html
0016デフォルトの名無しさん
2006/10/16(月) 19:05:380017デフォルトの名無しさん
2006/10/16(月) 19:42:42テストしたコード晒してよ。
0018デフォルトの名無しさん
2006/10/16(月) 20:03:37何粘着してんだ?
0019デフォルトの名無しさん
2006/10/16(月) 20:13:370020デフォルトの名無しさん
2006/10/16(月) 20:16:270021デフォルトの名無しさん
2006/10/16(月) 20:20:58>STLportに変えてみたら同じぐらいの速さが出た。
>VC8標準のやつが遅かっただけみたい。
って、8にとっての結論は出てるみたいだからそれでいいじゃん
お前がどう評価するかは、それぐらい自分でベンチとれよ
002217
2006/10/16(月) 20:49:07比較したのかが知りたかったんだ。自分で新しく比較コード書く気は無いな。
本人が拒否するならわかるんだが、なんで他人が文句言ってくるんだ?
0023デフォルトの名無しさん
2006/10/17(火) 00:02:590024デフォルトの名無しさん
2006/10/17(火) 00:26:050025デフォルトの名無しさん
2006/10/17(火) 05:09:110026デフォルトの名無しさん
2006/10/17(火) 11:07:37お馬鹿さんの不思議ルールを理解しようとしても無駄。
0027デフォルトの名無しさん
2006/10/17(火) 11:17:39{
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) ;
}
想定外のメモリーを参照しました
で落ちる。何が悪いのだろう。
0028デフォルトの名無しさん
2006/10/17(火) 12:56:57ここにいること自体時間の無駄。
0029デフォルトの名無しさん
2006/10/17(火) 17:34:25誘導。
http://pc8.2ch.net/test/read.cgi/tech/1158991211/
0030デフォルトの名無しさん
2006/10/18(水) 01:46:19erase()で、イテレータで指定した位置の要素を消せますが、
消した後このイテレータは有効なのでしょうか?無効なのでしょうか?
0031デフォルトの名無しさん
2006/10/18(水) 01:50:230032デフォルトの名無しさん
2006/10/18(水) 02:06:49>>31 エスパー乙
0033デフォルトの名無しさん
2006/10/18(水) 02:38:200034デフォルトの名無しさん
2006/10/18(水) 02:40:01うん。ダメ。だから erase(it++) という話で >>31 に行く。
0035デフォルトの名無しさん
2006/10/18(水) 02:56:030036デフォルトの名無しさん
2006/10/18(水) 07:45:42vector<mydata*> * vec;
vec = new vector<mydata*>();
delete vec;
0037デフォルトの名無しさん
2006/10/18(水) 07:49:320038デフォルトの名無しさん
2006/10/18(水) 09:28:17vectorの場合を考えて普通eraseの戻り値使わない?
0039デフォルトの名無しさん
2006/10/18(水) 10:57:06>>30はlistと言っているがシーケンスコンテナとは言っていない。
0040デフォルトの名無しさん
2006/10/18(水) 13:12:21std::vectorのeraseしたときの要素削除で
実際にヒープ開放しないように指定することは不可能?
頻繁に数が変動する場合、自分で制御した方がいいんでしょうか
0041デフォルトの名無しさん
2006/10/18(水) 13:39:39resize()でサイズを小さくしても領域は開放されないとか書かれていたけど。
0042デフォルトの名無しさん
2006/10/18(水) 14:15:19std::remove
0043デフォルトの名無しさん
2006/10/18(水) 21:21:04std::deque
0044デフォルトの名無しさん
2006/10/19(木) 00:38:06std::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なのかあいまいだと言われてます。
解決方法を教えてください。
0045デフォルトの名無しさん
2006/10/19(木) 00:44:38struct 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()を渡せばいい。
004644
2006/10/19(木) 01:51:22コンパイルを通すには、 Data<int, int<Dataだけでなく、Data<Dataも必要でした。
ありがとうございました。
operator()を3つ定義するならoperator<を3つ定義して
lower_bound(start,end, 値);でも結局、手間は同じなのかも?
0047デフォルトの名無しさん
2006/10/20(金) 20:56:10コメントにすればメモリリーク
コメントにしなければ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;
}
0048デフォルトの名無しさん
2006/10/20(金) 21:24:39myのデストラクタでdatの要素全てdeleteするか、boost::ptr_vectorを使う。
0049デフォルトの名無しさん
2006/10/20(金) 21:25:390050デフォルトの名無しさん
2006/10/20(金) 21:30:05005147
2006/10/20(金) 21:33:05回答ありがとうございます
>myのデストラクタでdatの要素全てdelete
あ!つい、自動的にやってくれるもんだと思ってた
vectorはポインタの中身の削除には感知しないんでしたね
要素をdataにするほうは派生クラスのポインタも入れたりするので
今回は>>48のほうで頑張ってみます
行き詰ってましたがこれで何とか先に進めそうです
助かりました!
005247
2006/10/20(金) 21:36:36補足どうもです
小さいデータでは直接intのほうがよさそうですね
47のコードは状況を再現する最小コードで
実際はもうちょっと複雑なデータ構造になっています
0053デフォルトの名無しさん
2006/10/20(金) 23:10:470054デフォルトの名無しさん
2006/10/20(金) 23:31:43つまりこうか?
template <typename T> struct data{ typedef T value_type; T i; };
と定義して、
typedef int HogeType;
とtypedefして、
my<HogeType> m;
と使う、と。
0055デフォルトの名無しさん
2006/10/20(金) 23:56:45typedef struct
{ int i; }data;
dataに別の変数を付け足したくなった時に便利。ってことじゃないか
0056デフォルトの名無しさん
2006/10/21(土) 07:39:050057デフォルトの名無しさん
2006/10/21(土) 21:05:460058デフォルトの名無しさん
2006/10/21(土) 21:12:56ここかな
0059デフォルトの名無しさん
2006/10/22(日) 18:31:51remove(v.begin(),v.end(),1)みたいなのだと要素数は減らず
eraseと組み合わせたら要素数も減る
v.clear()だと要素数は0になるんですよね
それでは要素数はそのままで、
vectorの中身を全部削除(適切な言葉がわからない)
するにはどうしたらいいのでしょうか
remove(v.begin(),v.end(),?)
0060デフォルトの名無しさん
2006/10/22(日) 18:40:39いったい何がしたいんだ?
006159
2006/10/22(日) 18:49:20vectorをキャッシュみたいに利用できないかと考えたんです
v.begin()〜v.end()の内容をあるときに全部他に書き出して
v.begin()〜v.end()を初期化して再利用
この時、clear()を呼んで初期化すると
確保したメモリも削除されるので勿体ないかなと
0062デフォルトの名無しさん
2006/10/22(日) 18:52:25何が勿体ないのかわからんが、 vector には reserve() があるんで、
clear() でメモリを解放する実装は考えられない。
0064デフォルトの名無しさん
2006/10/22(日) 21:20:17明示的破棄は不可能なんでしょうか?
0065デフォルトの名無しさん
2006/10/22(日) 21:23:51std::vector< int >().swap(v);
0066デフォルトの名無しさん
2006/10/22(日) 21:32:35見た感じヤバイ印象を受けるのですが
スタンダードなやり方なんですか?
0067デフォルトの名無しさん
2006/10/22(日) 21:41:54>見た感じヤバイ印象を受けるのですが
あなたは仕様やドキュメントではなくて見た感じの印象でコードの可否を決めるの?
>スタンダードなやり方なんですか?
何をもってスタンダードとするかは分からないけれど
swapイディオムというよく使われる方法の延長
0068デフォルトの名無しさん
2006/10/22(日) 21:47:08vector* でも持って new/delete すれば確実だろう。
0069デフォルトの名無しさん
2006/10/22(日) 23:21:01初めて見るコードでイディオムっていうのを知らなくて。
無知ですみません。勉強になりました。
0070デフォルトの名無しさん
2006/10/23(月) 00:01:070071デフォルトの名無しさん
2006/10/23(月) 00:11:17C との互換性のためには必要。文字列リテラルも配列型だしね。
動的確保を必要としないという点も見逃せない。
0072デフォルトの名無しさん
2006/10/23(月) 00:12:540073デフォルトの名無しさん
2006/10/23(月) 00:15:30やっぱり不要ってことにはならないだろうねぇ。
0074デフォルトの名無しさん
2006/10/23(月) 00:32:44それらの実装に固定長配列が要るだろ。
まあそれを言ったらstd::vectorの実装にnew []が必要とかそういう次元の話になってしまうが。
0075デフォルトの名無しさん
2006/10/23(月) 01:05:040076デフォルトの名無しさん
2006/10/23(月) 02:56:250077デフォルトの名無しさん
2006/10/23(月) 05:24:390078デフォルトの名無しさん
2006/10/23(月) 21:43:06VisualC++だとあるのですが、gccにはありませんでした。
これは標準の関数ではないのでしょうか?
この表で、c++のjoinが無しになってるけど、vector<string>とかlist<string>に、
ほかのアルゴリズムを組み合わせればできるよね?
0080デフォルトの名無しさん
2006/10/23(月) 21:53:420081デフォルトの名無しさん
2006/10/23(月) 22:12:52#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());
これでいいのかしら?
0082デフォルトの名無しさん
2006/10/23(月) 22:19:07transformもつけると意味が変わりそうな気もするし
0084デフォルトの名無しさん
2006/10/23(月) 22:32:54イテレータで[]演算子を使ってアクセスすることはできますか?
at()だと、下記の書き方でうまくいくのですが…範囲チェックの分のコストが惜しいので
できるだけ[]演算子でアクセスしたいのです。
vector<vector<int> > v;
for( vector<vector<int> >::iterator i=v.begin(); i != v.end(); i++ ) {
i->at( 0 ) = 1;
}
0085デフォルトの名無しさん
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
);
0086デフォルトの名無しさん
2006/10/23(月) 23:04:26(*i)[0] = 1;
0087デフォルトの名無しさん
2006/10/23(月) 23:29:500088デフォルトの名無しさん
2006/10/23(月) 23:31:370089デフォルトの名無しさん
2006/10/23(月) 23:33:01ガイシュツ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/12
0090デフォルトの名無しさん
2006/10/23(月) 23:35:32標準。
GCCにないわけがない。なにか古い版か?
0091デフォルトの名無しさん
2006/10/24(火) 00:12:09ありがとうございます。
0092デフォルトの名無しさん
2006/10/24(火) 01:46:08STLportでも入れろハゲ。
0093デフォルトの名無しさん
2006/10/24(火) 15:35:520094デフォルトの名無しさん
2006/10/24(火) 18:21:15STLをjavadoc形式で表すってどういうことか説明してみそ
0095デフォルトの名無しさん
2006/10/24(火) 19:01:070096デフォルトの名無しさん
2006/10/24(火) 19:13:02とりあえずSTLのどれからでもいいんでドキュメント化したかったんですけど
STLのソースに書き込むの難しそうだったんで
そういうの補足してくれてるサイトとかあったら教えてほしかったんですけど…
0097デフォルトの名無しさん
2006/10/24(火) 19:23:48gcc付属のSTLだったらlibstdc++をdoxygenに掛けたのが
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/index.html
とかにある
0098デフォルトの名無しさん
2006/10/25(水) 03:14:21マニュアルのほうが完成度が高い
0099デフォルトの名無しさん
2006/10/25(水) 07:49:08> for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
> std::iter_swap(__i, __first + (std::rand() % ((__i - __first) + 1)));
なんかビミョー?
0100デフォルトの名無しさん
2006/10/25(水) 10:17:44class MyContainer
{
MANY_FLOAT &data_;
MyContainer(TWO_FLOAT &_data_ ):(data_(_data_))
};
float _data_[100];
MyContainer myContainer(_data_);
MANY_FLOAT に float*nの大きさを指定してn個飛ばしでdataにアクセスしたい。
MANY_FLOATにはどんなクラスを指定すればいいのでしょうか
0101デフォルトの名無しさん
2006/10/25(水) 10:23:03typename 引数で「大きさを指定」するのか?
「n個飛ばし」って何だ?
TWO_FLOAT って何?
MyContainer のコンストラクタ、コンパイルできないだろ。
MyContainer はテンプレートなのに、 myContainer の
宣言ではテンプレート引数が指定されていない。
質問を整理して、コンパイルできるコード貼ってくれ。
0102デフォルトの名無しさん
2006/10/25(水) 12:57:11上手いコードとはいえないな。
0103デフォルトの名無しさん
2006/10/25(水) 14:03:140104デフォルトの名無しさん
2006/10/25(水) 14:08:18コンテナが空の場合のチェックは引用してないとこでやってるの?
ロジックはいいんじゃないの?ちゃんと確かめてないけど
http://ray.sakura.ne.jp/tips/shaffle.html
0105デフォルトの名無しさん
2006/10/25(水) 15:00:520106100
2006/10/25(水) 16:45:39tinyvecorってこういうとき使うものなのね
0107デフォルトの名無しさん
2006/10/25(水) 19:29:40http://sourceforge.net/projects/adobe-source/
使ってる人いますか?
0108デフォルトの名無しさん
2006/10/26(木) 00:17:55どういう風に書けばいいでしょうか?
0109デフォルトの名無しさん
2006/10/26(木) 00:23:52> コンテナが空の場合のチェックは引用してないとこでやってるの?
たぶんそう。漏れの手元にあるのは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ついてるのね。
0110デフォルトの名無しさん
2006/10/26(木) 00:29:23どういう風に書いてうまくいかなかったのか?
0111108
2006/10/26(木) 00:51:11vector<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>() );
}
の記述で通りました
0112デフォルトの名無しさん
2006/10/31(火) 23:12:04た為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
でコンパイルして実行したところ、何故かアボート。
何か間違ってますか?
0113デフォルトの名無しさん
2006/10/31(火) 23:39:39単にstd::locale::global(std::locale(""));だとどう?
0114デフォルトの名無しさん
2006/11/01(水) 01:11:12でダメっつーのは、いかんのでは?
0115デフォルトの名無しさん
2006/11/01(水) 01:38:22locale のコンストラクタが例外を投げることになってるんで、こうしてみると
#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
0116デフォルトの名無しさん
2006/11/01(水) 01:53:14locale文字列は"C"と""以外処理系定義のはず。
0117デフォルトの名無しさん
2006/11/01(水) 08:13:54Working 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) 使えって感じか。
だな
0118デフォルトの名無しさん
2006/11/01(水) 08:31:02ISO/IEC14882 みて語ろうぜ。
0119デフォルトの名無しさん
2006/11/01(水) 09:05:28>別にgccのせいじゃないだろ。
単に出典を示しただけだろ。着眼点がずれてるよ。
俺が使ってるSTLportも似たようなもんだった。
0120デフォルトの名無しさん
2006/11/01(水) 14:18:04rand()%X より rand()*X/RAND_MAXのほうがいいとかはあるかも知らんが.
0121120
2006/11/01(水) 14:19:280122デフォルトの名無しさん
2006/11/01(水) 16:04:12「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になるかもよ。(実装定義だけど)
0123デフォルトの名無しさん
2006/11/01(水) 16:43:250124123
2006/11/01(水) 16:45:170125デフォルトの名無しさん
2006/11/01(水) 16:57:49PairList 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);
};
ではコンパイルが通りません。
0126デフォルトの名無しさん
2006/11/01(水) 18:17:35string -> string const&
PairList::value_type -> PairList::value_type const&
0127デフォルトの名無しさん
2006/11/02(木) 01:05:40IS と WD はそんなに違わない。むしろ WD のほうが修正が進んでいる面もある。
そして IS は買わないといけないが WD はダウンロードできる。
0128デフォルトの名無しさん
2006/11/02(木) 01:06:49エラーメッセージは?
0130デフォルトの名無しさん
2006/11/02(木) 10:47:48ISO の営業担当の方ですか?
0131デフォルトの名無しさん
2006/11/02(木) 12:07:480132デフォルトの名無しさん
2006/11/02(木) 12:19:22コンテナvectorのソースコードってどうやったら見れますか?
0133デフォルトの名無しさん
2006/11/02(木) 12:52:510134デフォルトの名無しさん
2006/11/02(木) 13:00:08同じファイルが3つくらい引っかかって、しかもテキストで開いたら文字化け気味だったので…
0135デフォルトの名無しさん
2006/11/02(木) 13:03:130136デフォルトの名無しさん
2006/11/02(木) 13:05:12すみません、わざわざありがとうございます
すごく助かりました!
0137デフォルトの名無しさん
2006/11/03(金) 18:34:46}
ってどういう時に使うの?
0138デフォルトの名無しさん
2006/11/03(金) 18:49:07詳細を別の名前空間に分けておきたいとき。
0139デフォルトの名無しさん
2006/11/04(土) 11:50:23スレ違いに気付かない程度の人には関係ありません。
0140デフォルトの名無しさん
2006/11/04(土) 13:37:59std::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;
}
0141デフォルトの名無しさん
2006/11/04(土) 14:31:29最後の要素の次を参照する end() で reverse_iterator を初期化したとき、
最後の要素を参照しなければならない。
0142140
2006/11/04(土) 15:40:21ありがとうございました
0143デフォルトの名無しさん
2006/11/04(土) 18:10:11> rtmp != rit_t()
この条件何?
0144デフォルトの名無しさん
2006/11/04(土) 18:31:140145デフォルトの名無しさん
2006/11/04(土) 18:58:530146デフォルトの名無しさん
2006/11/04(土) 19:07:09reverse_iteratorから呼び出されるであろう140によるIt::operator==とかの実装によるとしかいいようがない
0147デフォルトの名無しさん
2006/11/12(日) 12:09:230148デフォルトの名無しさん
2006/11/12(日) 12:24:440149デフォルトの名無しさん
2006/11/13(月) 15:14:330150デフォルトの名無しさん
2006/11/13(月) 15:19:34vector< vector<Type> > v(n, vector<Type>(m))
0151デフォルトの名無しさん
2006/11/13(月) 15:42:082次元はうまくいったのですが、3次元に拡張しようとしたところうまくいきません。
vector< vector < vector<Type> > > v(n, vector<Type>(m, vector<Type>(n)))
と書いたのですが、どこが間違えているのでしょうか?
0152デフォルトの名無しさん
2006/11/13(月) 16:16:37↑ここがまずいのでは
vector< vector < vector<Type> > > v(n, vector<vector<Type> >(m, vector<Type>(n)))
0153デフォルトの名無しさん
2006/11/15(水) 04:50:460154デフォルトの名無しさん
2006/11/15(水) 07:59:020155デフォルトの名無しさん
2006/11/15(水) 16:00:32という質問もおかしいし
>いいえ
という回答もおかしい
0156デフォルトの名無しさん
2006/11/15(水) 16:07:15何がおかしいのか言わない君の方が芥。
0157デフォルトの名無しさん
2006/11/16(木) 10:42:44・実装による
・使うコンテナによる
0158デフォルトの名無しさん
2006/11/16(木) 11:08:29・イテレータの前進・比較・間接参照・コピーコンストラクタ・デストラクタが例外を発生させない
・要素の代入・デストラクタが例外を発生させない
ってとこかね。
コピーを巻き戻しできないので処理中に例外が発生したらあぼんぬ。
0159デフォルトの名無しさん
2006/11/17(金) 01:13:25規格ってのがあるだろ。
実装によるなら一般的にはスレッドセーフでないことになる。
使うコンテナによるならやっぱりスレッドセーフでないことになるだろ。
=====>スレッドセーフでない。
GCCの実装を見る限りではスレッドセーフでなないな。
ただコンテナの代入演算子を使ってるだけ。
コピー作ってスワップってのはしてない。
0160デフォルトの名無しさん
2006/11/17(金) 01:26:530161デフォルトの名無しさん
2006/11/17(金) 08:38:12それは「例外安全ではない」ではなくて、「基本的な例外安全」が保証されている状況
0162デフォルトの名無しさん
2006/11/17(金) 12:13:17アルゴリズムの例外安全性に関しては何も規定していない……
んですが,あくまで一般的な実装の話として
std::copy は, iterator の value_type のコピー代入が
strong guarantee を保持していることを (唯一の) 型に対する要件とした上で,
basic guarantee を達成する,という説明になるんじゃないでしょうか?
iterator の各操作が例外を投入しうる場合でも
basic guarantee は達成すると思います.
0163デフォルトの名無しさん
2006/11/17(金) 21:31:53struct kobunrui{
public:
std::string itemname;
int kosuu;
}
struct daibunrui{
public:
std::string bunruimei;
kobunrui itemsyousai;
};
大分類についてはpush_backで追加できるのですが
大分類1個の中の小分類を追加するのは、どのようにすればいいのでしょうか?
また大分類1個の中の小分類の数の取得はどのようにすればいいのでしょうか?
0164デフォルトの名無しさん
2006/11/17(金) 22:10:18例えば要素0個目なら
v[0].itemsyousai = kobunrui_hensuu;
0165デフォルトの名無しさん
2006/11/17(金) 22:11:04daibunruiはkobunruiのインスタンスを一個だけ持つっていう仕様
なのにそれを追加なんてできる訳ねーだろ。
struct daibunrui {
public
std::string bunruimei;
std::vector<kobunrui> itemsyousai;
};
に直せ。
daibunrui instance;
size_t index(3);
int kosuu = instance.itemsyousai[index].kosuu;
で小分類の数の取得ができる。
取り敢えずオブジェクト指向がまるで理解できてないみたいだから
もっと勉強しろ。
0167デフォルトの名無しさん
2006/11/18(土) 03:02:51ただのコンテナの問題だ
0168デフォルトの名無しさん
2006/11/18(土) 03:36:01クラス設計や質問内容見りゃあオブジェクト指向がまるで理解できてない
ことぐらい直ぐ判かんだろカス。
0169デフォルトの名無しさん
2006/11/18(土) 03:39:40何か癪に触る事でもいいましたっけ
0170デフォルトの名無しさん
2006/11/18(土) 22:22:590171デフォルトの名無しさん
2006/11/21(火) 09:15:51#define containtype list
//#define containtype deque
class test
{
containtype m_buffer;
};
こんな感じで互換性のあるクラスを切り替えて使えるコードを
書きたいのですが、どうやってそれを実現するのが良いのでしょうか?
ご教示くださいませ
よろしくお願いします。
0172デフォルトの名無しさん
2006/11/21(火) 10:24:58class test
{
typedef list<T> buffer_type;
//typedef deque<T> buffer_type;
buffer_type m_buffer;
};
0173デフォルトの名無しさん
2006/11/22(水) 06:51:19ありがとうございます!
0174デフォルトの名無しさん
2006/11/23(木) 20:26:55it != last
と比較するのはなぜなんでしょうか
it < last にしない理由がよくわかりません
「同じモノを指しているかどうか比較できる」が
「イテレータの大小比較はできない」パターンがあるという事でしょうか
0175デフォルトの名無しさん
2006/11/23(木) 20:28:210176デフォルトの名無しさん
2006/11/23(木) 20:33:07あくまでメモリ上の位置だけでリストの順番とは無関係
0177174
2006/11/23(木) 20:36:53>>176
そういわれればそうですね
配列やvectorしか頭になかった・・・
リンクリストのイテレータ比較しても意味ないですね
0178初心者
2006/11/23(木) 23:37:51なるべく粗相のないよう簡潔にお答え願います。
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。
0179デフォルトの名無しさん
2006/11/23(木) 23:38:52朝鮮人は祖国に帰れ!
0180デフォルトの名無しさん
2006/11/23(木) 23:42:260181デフォルトの名無しさん
2006/11/24(金) 00:06:41STLport
http://stlport.sourceforge.net/
0182デフォルトの名無しさん
2006/11/24(金) 00:34:36現在の標準C++に準拠した処理系にはもれなく付いてくる。
付いてこないようであれば、そんな処理系窓から投げて捨ててしまえ。
勿論、質が問題になることはあるが。
0183デフォルトの名無しさん
2006/11/24(金) 19:42:41(´・ω・`) n
⌒`γ´⌒`ヽ( E)
( .人 .人 γ ノ
ミ(こノこノ `ー´
)にノこ(
0184デフォルトの名無しさん
2006/11/24(金) 21:57:15また○u○ak○b○か
0185デフォルトの名無しさん
2006/11/25(土) 00:32:140186デフォルトの名無しさん
2006/11/25(土) 02:09:480187デフォルトの名無しさん
2006/11/25(土) 03:24:250188デフォルトの名無しさん
2006/11/25(土) 03:44:01注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。
0189デフォルトの名無しさん
2006/11/25(土) 04:03:490190デフォルトの名無しさん
2006/11/26(日) 03:02:392つのスレッドがあって、一方が任意の構造体データを追加し、他方が取得します。
取得が遅いためにバッファが一杯になった場合、追加側はブロックさせたいと思います。
スレッドの排他やブロックおよびブロックの解除を実装する必要はあると思いますが
リングバッファくらいならSTLにあるような気がしていて、あるならそれを使って実装しようと考えてます。
STLで任意の構造体をリングバッファに納めるコンテナはありますか?
また速度は(自作するよりは)高速でしょうか?(主観でOKです。)
0191デフォルトの名無しさん
2006/11/26(日) 03:06:49deque または queue で済むんじゃないかな?
0192デフォルトの名無しさん
2006/11/26(日) 03:13:21ありがとうございます。早速調べてみます。
0193デフォルトの名無しさん
2006/11/26(日) 16:05:300194デフォルトの名無しさん
2006/11/26(日) 16:09:31もうたくさんあるから、要らないと思う。不正確な内容のものも多いけど、
正確さを求めるならリファレンスっぽいやつや、規格を見るし。
0195デフォルトの名無しさん
2006/11/26(日) 16:44:43そっか、勉強がてらに書いてみようと思ったんだけど
0196デフォルトの名無しさん
2006/11/26(日) 17:38:36そういう目的があるんなら、書いたらいい。
突っ込みとそれに対する改良を重ねる前提で公開するというのは
新しいかもしれない。
0197デフォルトの名無しさん
2006/11/26(日) 20:39:590198デフォルトの名無しさん
2006/11/26(日) 21:37:47まったく枯れてないのでやる価値はある
書籍もSGI STL前提なのでどれも古くなっている
0199デフォルトの名無しさん
2006/11/26(日) 22:24:58197案のwikiをやるならSTLに限らず標準ライブラリ全てを対象にしてほしい。
0200デフォルトの名無しさん
2006/11/27(月) 11:10:03禿同。
0201デフォルトの名無しさん
2006/11/27(月) 16:36:210202デフォルトの名無しさん
2006/11/27(月) 16:46:390203デフォルトの名無しさん
2006/11/27(月) 20:03:370204デフォルトの名無しさん
2006/11/27(月) 22:46:51内部でバッファを持っていて、データを書き込むたびに、バッファが足りなくなったら確保してくれる・・・みたいなやつです。
0205デフォルトの名無しさん
2006/11/27(月) 23:00:190206デフォルトの名無しさん
2006/11/28(火) 00:28:34調べてみます、ありがとうございました!
0207デフォルトの名無しさん
2006/11/28(火) 01:08:380208デフォルトの名無しさん
2006/11/28(火) 01:15:19STLの本を2冊も買えば十分じゃないか
0209デフォルトの名無しさん
2006/11/28(火) 02:05:28もちろんあてになるものを作ろうという動きは面白いと思うが、
Wiki は情報の信頼性が低下する傾向にあるので、俺は好かん。
0210デフォルトの名無しさん
2006/11/28(火) 03:37:07既刊の書籍があれば誰にとっても十分とは思わないし、
単なるまとめサイトとしてだけでも価値を持ち得る。
0211デフォルトの名無しさん
2006/11/28(火) 08:08:05じゃあお前が作れ
0212デフォルトの名無しさん
2006/11/28(火) 08:24:270213デフォルトの名無しさん
2006/11/28(火) 09:24:43でいいだろ。google でグぐるとトップにくるくらいだ。
0214デフォルトの名無しさん
2006/11/28(火) 12:53:46ostringstream は?
0215デフォルトの名無しさん
2006/11/28(火) 12:55:42>>205
0216デフォルトの名無しさん
2006/11/28(火) 15:36:020217デフォルトの名無しさん
2006/11/28(火) 16:26:560218デフォルトの名無しさん
2006/11/28(火) 16:45:080219デフォルトの名無しさん
2006/11/28(火) 17:20:06てめぇらゆるさねぇ。
そう見えるようになっちまった。
0220デフォルトの名無しさん
2006/11/28(火) 19:06:05Vc7\includeの下とVc7\crt\srcの両方にあるんですが、
現在、私のプログラムでこの二つを勝手気ままに呼び出しててえらいことになってます。
どちらか一方だけを呼ぶことってできるのでしょうか?
0221デフォルトの名無しさん
2006/11/28(火) 23:28:08アホか
0222デフォルトの名無しさん
2006/11/28(火) 23:37:37になってて、別のでは #include <Vc7\crt\src\xstring> ってなってるとか?
0223デフォルトの名無しさん
2006/11/28(火) 23:50:15まさかとは思うがそれなら自分で変更しろよww
0224初心者
2006/11/29(水) 01:40:11注:現在、私は公私ともに多忙を極め、スレを見ることが困難な状況です。
しかしその中でも何とか時間を作り、このスレに出向いて質問をしています。
そのような貴重な質問者に対し、1行レス、煽り、罵倒で返す愚か者がいるようですが
私のような質問者がいなければそもそもあなたたちの知識をひけらかす場が
存在しないことをよく認識し、身の程をわきまえるべきであります。
よって、私のような貴重な質問者に対し、見下した回答、儀礼を欠いた回答
(例:質問してくれてありがとうございました等のお礼がない、である調で答える、
様をつけない、w等の意味不明な言葉を発する)を禁止いたします。
ましてや自分の立場もわきまえず逆にお礼を強要したり、各人の目に触れやすくなるよう
多数のレスに同様の質問をしているのを「マルチポスト」呼ばわりするような輩は
当然加害対象として私のリストに載ることになります(賢い方は意味がおわかりでしょう)
この規則は2chの精神にものっとっており、強制的に施行されます。もし違反した場合には
2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には
2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから
FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置
を取らせていただきます。また、形式的にはちゃんとした回答であっても、知識不足のため
不正確な知識を回答することも禁止いたします。よく考え、よく調べ、正確な回答を
するように心がけましょう。なお、当方が質問に対し多少は役に立つと判断した場合は
それなりに評価するのでご安心下さい。なお、確認はこの啓蒙文を読んでいることを
前提としており、読んでいない、理解できない等のいいわけは一切通用しません。
また、有識ある諸君は今後自分の発言に対しこの啓蒙文をコピペすることが義務になります。
0225デフォルトの名無しさん
2006/11/29(水) 01:43:010226デフォルトの名無しさん
2006/11/29(水) 01:46:40でましたね。啓蒙文にしっかり書いておいたのにこういう輩が。
おそらく私に対抗しうる人物は国家権力を使えるということでしょうが
こちらは世界権力を行使できる立場にいます。
国連をご存じでしょうか?そう、あのアメリカさえも畏れる恐怖の世界組織です。
私はそこと内通しており、今回のような自体には世界権力の行使も辞さない構えです。
0227デフォルトの名無しさん
2006/11/29(水) 01:50:360228デフォルトの名無しさん
2006/11/29(水) 01:57:29あぼーんした
0229デフォルトの名無しさん
2006/11/29(水) 02:06:29少なくとも俺は聞いたことが無い。知っている奴は是非とも名乗りを上げてくれ。
さて、存在しないということはこれから作られるということだ。
つまり、224が自分の思い通りに描けば、それがStandaado Tenplate Libraryになる。
それが芸術というものではないだろうか。
0230デフォルトの名無しさん
2006/11/29(水) 02:13:420231デフォルトの名無しさん
2006/11/29(水) 08:17:10>2ch管理人への通報、加害届けの提出、プログラムのハッキング(私には
>2ch専門のハッキング部隊と契約を結んでおり、銀行の口座のハッキングから
>FBIのコンピュータのハッキングまでこなす例のあれと親密な関係です)等断固たる処置
>を取らせていただきます
通報しました。
0232デフォルトの名無しさん
2006/11/29(水) 12:31:080233デフォルトの名無しさん
2006/12/01(金) 07:55:160234デフォルトの名無しさん
2006/12/02(土) 06:01:13最近はそんな商売もあるのか。
0235デフォルトの名無しさん
2006/12/03(日) 11:48:02ソースレベルで表示できるコンパイラってありますか?
template<typename T>
void foo(T arg){
cout << T;
}
foo<int>(50);
を
void foo(int arg){
cout << arg;
}
に展開してくれる様な
この機能があればテンプレート絡みの意味不明なコンパイルエラー
の修正が、かなり楽になりそうなんですが・・・
0236デフォルトの名無しさん
2006/12/03(日) 12:15:29普段使ってるコンパイラはどんなエラー表示を出すの?
0237デフォルトの名無しさん
2006/12/03(日) 13:12:320238236
2006/12/03(日) 13:18:24effective STLでもエラー表示を理解しようみたいな項目があったくらいだし
0239235
2006/12/03(日) 13:52:47boostとか使用していて特殊化やオーバーロードが絡んでくると
エラー解析に時間がかかって・・・
さんざん悩んでタイプミスでした。とかたまにあるんで
ちなみにVC6使ってるのでVC8に変えてみます
0240デフォルトの名無しさん
2006/12/03(日) 15:06:09http://www.bdsoft.com/tools/stlfilt.html
0241デフォルトの名無しさん
2006/12/03(日) 19:46:56basic_string ってなーに? traits?? allocator??? ヽ(`Д´)ノ だったな
0242237
2006/12/03(日) 19:58:04ただ、大量にエラー出るわりに、ミスってるのは一箇所とかだったりするんで見慣れてると何とかなるかも。
まあ、経験論なので参考にはならんな。
0243デフォルトの名無しさん
2006/12/03(日) 19:59:55ってのがオブジェクト指向の目指してることだと思うんだけどね。
0244デフォルトの名無しさん
2006/12/03(日) 20:49:000245デフォルトの名無しさん
2006/12/03(日) 20:58:45ですよねー^^
0246デフォルトの名無しさん
2006/12/03(日) 21:06:53お前>>243か?お前みたいなオブジェクト指向を勘違いしてる奴が多いから
巷に間違ったオブジェクト指向の知識があふれてるんだよ。STLってのはジェネリックプログラミング
のC++での実装方法であってオブジェクト指向とは何の関係もない。
0247デフォルトの名無しさん
2006/12/03(日) 21:08:480248デフォルトの名無しさん
2006/12/03(日) 21:10:080249デフォルトの名無しさん
2006/12/03(日) 21:12:360250デフォルトの名無しさん
2006/12/03(日) 21:14:270251デフォルトの名無しさん
2006/12/03(日) 21:16:190252デフォルトの名無しさん
2006/12/03(日) 21:18:090253デフォルトの名無しさん
2006/12/03(日) 21:21:020254デフォルトの名無しさん
2006/12/03(日) 21:25:140255デフォルトの名無しさん
2006/12/03(日) 21:26:200256デフォルトの名無しさん
2006/12/03(日) 21:28:220257デフォルトの名無しさん
2006/12/03(日) 21:29:38物ベースでジェネリック!
0258デフォルトの名無しさん
2006/12/03(日) 23:24:15違う。STLはジェネリックプログラミングを用いているがオブジェクト指向は
用いていない。端的なポイントを挙げるなら、仮想関数に基づいていない。
継承と動的多態がないものをオブジェクト指向と呼ぶのは、
>>246の言う巷に溢れる間違い。
(言語によっては多少異なった形で実現されることもあるのがややこしいところだけど)
0259デフォルトの名無しさん
2006/12/04(月) 00:06:260260デフォルトの名無しさん
2006/12/04(月) 00:13:38何を根拠にそんな不可解な定義を信じてるの?
0261デフォルトの名無しさん
2006/12/04(月) 00:35:580262デフォルトの名無しさん
2006/12/04(月) 00:58:43258ではないけど、お前は何だったらオブジェクト指向と言うと思うのか?
>>256
258によれば(と言っておく)、クラスを使っているからといってオブジェクト指向プログラミングではないぞ。
0263デフォルトの名無しさん
2006/12/04(月) 01:01:26「便利なクラス」を作ることがOOだと主張する困ったちゃんはちょくちょく見る
0264デフォルトの名無しさん
2006/12/04(月) 01:08:03OOというといきなりその定義を延々と語り説教を始める困ったちゃんはちょくちょく見る
0265デフォルトの名無しさん
2006/12/04(月) 01:09:10おまえのことだな
0266デフォルトの名無しさん
2006/12/04(月) 01:14:360267デフォルトの名無しさん
2006/12/04(月) 01:42:46>>243
>まあアロケータだのコンテナだの細部まで理解しなくても簡単かつ安全に使えるようなライブラリがかける
これはSTLのことを指して言ってるの?
どうでもいい使い捨てのコードを書く場合は確かに細部を気にせず使うけど、
仕事で使う場合は結局STLの細部まで知っている必要がある気がする。
0268258
2006/12/04(月) 01:42:54不可解かな。根拠は、例えばこのへん:
ttp://en.wikipedia.org/wiki/Object-oriented_programming
→ "1 Fundamental concepts"
オブジェクト指向プログラミングを特徴づけるものは7つ。クラス、オブジェクト、
メソッド、メッセージ送信、継承、カプセル化、抽象、多態(ポリモーフィズム)。
これらを備えるものをオブジェクト指向言語と呼ぶが、場合によってはいくつかを
欠く。
ダメ情報源でなければ、およそ似たことが書いてあると思う。
STLはtemplateによる静的多態性に立脚しているわけで、
STLそれ自体は動的多態性を旨とするオブジェクト指向とは異なる作りをしている。
ユーザがオブジェクト指向とSTLを同一プログラム内で使い分けるのは自由だけどね。
0269デフォルトの名無しさん
2006/12/04(月) 01:56:28リンク先にだいぶマシな定義が書いてあるじゃねーか。
"Object-oriented programming (OOP) is a programming paradigm that uses abstraction to create models based on the real world."
引用した箇所にあるのは「オブジェクト指向言語」についての説明で、
しかもいくつかを欠いたものも「オブジェクト指向言語」に含むことになっている。
何を以って「オブジェクト指向(プログラミング)」と呼ぶかの定義にはならない。
多態だって動的か静的かの区別なんてしてないだろ。
0270デフォルトの名無しさん
2006/12/04(月) 02:22:300271デフォルトの名無しさん
2006/12/04(月) 02:28:160272デフォルトの名無しさん
2006/12/04(月) 02:28:39ランタイムに動的ディスパッチしないと一部の人は納得しないんだろうなあ
0273258
2006/12/04(月) 02:46:50> リンク先にだいぶマシな定義が書いてあるじゃねーか。
> "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++での定義では」という注釈をつけないと
いまいち正しくないかもね。
0274デフォルトの名無しさん
2006/12/04(月) 07:24:07能力の無さを、必死さとか粘着質とかでカバーして
それなりに「論陣張ってるっぽく振る舞える」話題だからだよ。
普通の「出来る奴だけが輝ける」話題で一切まともなこと言えない馬鹿が
ここぞとばかりに頑張ってる。
「自分の居場所を見つけた!」ってね。
0275デフォルトの名無しさん
2006/12/04(月) 11:05:15信じられん
0276デフォルトの名無しさん
2006/12/04(月) 13:45:28知ってるやつも多いだろうが
今年の基本情報の問題に "自動車のサブクラス" を問う問題が出たんだ…
さすがに内心笑ったやつは多いと思うよ…
0277デフォルトの名無しさん
2006/12/04(月) 15:54:45やっぱオブジェクト指向は”動物クラス”から”犬クラス”と”猫クラス”を派生させないとね!
そして多態で鳴く
0278デフォルトの名無しさん
2006/12/04(月) 16:13:41まあ基本情報はそんなものだろうけど
0279デフォルトの名無しさん
2006/12/04(月) 16:19:110280デフォルトの名無しさん
2006/12/04(月) 17:41:10じゃだめなの?
多態性の本質を的確に教えてくれ(´・ω・`)
0281デフォルトの名無しさん
2006/12/04(月) 18:02:05インタフェイスと実装の論理的な分割じゃねーの。
実装が変わっても、インタフェイスが同一であれば接続可能。
0282デフォルトの名無しさん
2006/12/04(月) 18:13:34具体的にコード書くのは仕事やってればいやでも身につくけど
こういうのは自分で勉強しないとだめだからねぇ・・・
今からでもまじめに勉強しようかな
0283デフォルトの名無しさん
2006/12/04(月) 19:03:36英語版のwikipediaお薦め
0284デフォルトの名無しさん
2006/12/04(月) 20:24:10http://pc8.2ch.net/test/read.cgi/tech/1164736142/
話をSTLに戻そうぜ。
0285デフォルトの名無しさん
2006/12/04(月) 20:36:16もっとましなスレを出せよ。やはり嵐か?
0286デフォルトの名無しさん
2006/12/04(月) 20:45:11OO厨は怖いな・・・
0287デフォルトの名無しさん
2006/12/04(月) 21:12:07必死でアピールする場を奪われちゃたまらないだろう。
0288デフォルトの名無しさん
2006/12/04(月) 21:30:170289デフォルトの名無しさん
2006/12/04(月) 22:23:410290デフォルトの名無しさん
2006/12/04(月) 22:49:550291デフォルトの名無しさん
2006/12/04(月) 23:15:020292デフォルトの名無しさん
2006/12/04(月) 23:30:270293デフォルトの名無しさん
2006/12/05(火) 00:13:47今さらそんなことで荒らしに来るRuby信者なんか居ないから
騙っても無駄だよ。
0294デフォルトの名無しさん
2006/12/05(火) 00:15:49騙りも何も君みたいなのがいるじゃない^^
0295デフォルトの名無しさん
2006/12/05(火) 05:55:020296デフォルトの名無しさん
2006/12/05(火) 10:05:450297デフォルトの名無しさん
2006/12/05(火) 12:52:05言語のある特定の部分、という点ならわかるけど。
0298デフォルトの名無しさん
2006/12/05(火) 13:06:210299デフォルトの名無しさん
2006/12/05(火) 13:13:410300デフォルトの名無しさん
2006/12/06(水) 00:09:34slink_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;
}
0301デフォルトの名無しさん
2006/12/06(水) 00:24:28RUBY信者のキモさを見事なまでに表現した格言だな。
0302デフォルトの名無しさん
2006/12/06(水) 00:24:360303デフォルトの名無しさん
2006/12/06(水) 01:48:05簡単に使えるようになるから東大の教養学部でもRuby教えるようになったんだよね。
0304デフォルトの名無しさん
2006/12/06(水) 01:51:38というものを分かってないと思う。Ruby自体はオブジェクト指向に関してはC++より圧倒的に優れてるけど
いかんせんスクリプト言語だから遅いんだよね・・・
まあ最初に勉強する教育目的の言語ではRubyの方がいいと思うが。
0305デフォルトの名無しさん
2006/12/06(水) 01:51:55その程度の記述力、実行効率。
0306デフォルトの名無しさん
2006/12/06(水) 01:55:34まあ揚げ足取りはさておき、少なくともネイティブアプリをかけること自体は
今はそんなにマイナスポイントではないね。そういうのは一部のハッカーが書けばいい。
RubyとかJavaがCとかC++に比べて今世界でもっとも広く使われるようになってきたのは
そういうネイティブコードよりも可読性、オブジェクト指向との親和性が高いからだしね。
0307デフォルトの名無しさん
2006/12/06(水) 01:56:390308デフォルトの名無しさん
2006/12/06(水) 01:58:33妥当な性能で出来なきゃ使えないってことも事実なわけで。
0309デフォルトの名無しさん
2006/12/06(水) 02:06:09それに数値計算以外はrubyはCに匹敵する速度が出るし
特にネットワークアプリとかをわざわざ他の言語で書く理由がみあたらない。
スレ違いスマソ
0310デフォルトの名無しさん
2006/12/06(水) 02:13:12>でも性能が必要な現場なんてそうそうないような・・・
ここ C++ のスレだから、基本的に性能が必要な現場の人が語らうとこだと思う・・
0311デフォルトの名無しさん
2006/12/06(水) 02:14:490312デフォルトの名無しさん
2006/12/06(水) 02:20:37普通ならあっという間に流れて終わるだけの限りなく独り言に近い書き込みを
ここまでのホットトピックに育ててしまったのです。
0313デフォルトの名無しさん
2006/12/06(水) 03:07:36Del厨は結局復活しなかったな
0314デフォルトの名無しさん
2006/12/06(水) 03:42:260315デフォルトの名無しさん
2006/12/06(水) 06:30:51デフォルトコピーコンストラクタが呼ばれてるんじゃないの?
0316デフォルトの名無しさん
2006/12/06(水) 07:34:27シラバス検索してみてもヒット0件だったが。
0317デフォルトの名無しさん
2006/12/06(水) 11:17:37ニュースで出たぞ
0318デフォルトの名無しさん
2006/12/06(水) 17:27:230319デフォルトの名無しさん
2006/12/06(水) 17:31:340320デフォルトの名無しさん
2006/12/06(水) 17:35:30rubyってdefine や templateとかもあんの?
オブジェクト指向型の言語やってりゃJavaとかの習得が楽ってのはわかるけど、
それだけじゃC++を使いこなすには足りないと思うし。
0321デフォルトの名無しさん
2006/12/06(水) 18:02:35それともFriend関数はなるべくないようなクラス設計を目指す?
0322デフォルトの名無しさん
2006/12/06(水) 18:55:50使う。A.Alex が述べてたように、SmartPtr みたいなものだとメンバ関数より、
フレンド関数の方が都合がいい。
さらには、↓の理由からフレンドを使うこともある。
template< typename A > void indirect_call( A & a ) {
...
do_something( a ); // a.do_something() だと、A が限定される。
...
}
0323デフォルトの名無しさん
2006/12/06(水) 19:10:59あーまさに後者の場合が問題だったんだよね。こういうときも無理矢理でもfriend使わないような
設計にしちゃった方がいいのか気になってた。
レスありがとう!
0324デフォルトの名無しさん
2006/12/07(木) 12:02:35C++で構造体にstd::stringメンバが入ってる場合の構造体コピーってどうやるんでしょうか?
0325デフォルトの名無しさん
2006/12/07(木) 12:17:480326デフォルトの名無しさん
2006/12/07(木) 20:01:50http://sourceforge.net/project/showfiles.php?group_id=146814&package_id=162032&release_id=352516
0327デフォルトの名無しさん
2006/12/07(木) 20:50:010328デフォルトの名無しさん
2006/12/07(木) 23:31:580329デフォルトの名無しさん
2006/12/08(金) 00:12:32_STLP_NO_EXCEPTIONS をと同等の設定をわざわざサポートしてくれるコンパイラベンダは無さそう。
0330デフォルトの名無しさん
2006/12/08(金) 00:25:47状態を持つアロケータをサポートしてくれたのは大きいだろう。
0331デフォルトの名無しさん
2006/12/08(金) 00:44:17状態って?
0332デフォルトの名無しさん
2006/12/08(金) 00:48:500333デフォルトの名無しさん
2006/12/08(金) 01:14:370334デフォルトの名無しさん
2006/12/08(金) 01:57:08そんなところ。
インスタンスをコンテナごとに持つところまでは決まってるんだけど、
同じ型のインスタンスを区別して扱うことを標準が強制しておらず、
現行の実装はそのことに依存してしまっているものがほとんど。
list a, b があって、これらが異なるアロケータインスタンスを使っているとき、
splice() を使って a <-> b 間で部分的な要素を受け渡すと面倒なことが起こるはず。
標準が強制しなかったのも理解できるし、 STLport の実装も(まだ見てないけど)興味深い。
0335デフォルトの名無しさん
2006/12/09(土) 22:41:280336デフォルトの名無しさん
2006/12/13(水) 19:26:04multimap利用して同一キーに複数の値をinsertしたとき
iterator itr = lower_bound(key) のあと
itr++の順番で値を表示していく場合
insertされた順番に表示される、でいいのですか?
なんかうまく表現できないけど察していただけるとうれしいです。
0337デフォルトの名無しさん
2006/12/13(水) 20:33:52a.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"));
0338デフォルトの名無しさん
2006/12/13(水) 20:41:49setは中の値を使ってデータを並べてるんだから書き換え不可。
新たなsetを作り直すしかないと思う。
0339デフォルトの名無しさん
2006/12/13(水) 21:46:17set<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"));
0340デフォルトの名無しさん
2006/12/13(水) 22:19:02multiset/multimapでは同値なオブジェクト同士の順番に関する保証はない
0341デフォルトの名無しさん
2006/12/13(水) 22:35:59それらしい記述が見つからないから未定義かもしれん。
0342341
2006/12/13(水) 22:37:000344336
2006/12/14(木) 13:17:44ファイルの内容を読み込んで、いくつかの種類に順番に分類するとしたら
順序コンテナを分類する数だけ用意するほか無いのでしょうか?
0345デフォルトの名無しさん
2006/12/14(木) 13:49:410346デフォルトの名無しさん
2006/12/14(木) 16:50:020347デフォルトの名無しさん
2006/12/15(金) 06:42:32一度sprintfなどでchar*にコピーしてからコンストラクタに渡すしか方法はないかな
0348デフォルトの名無しさん
2006/12/15(金) 06:50:20けど、boostない環境では普通にsprintfやstringstream経由でないと不可能?
0349デフォルトの名無しさん
2006/12/15(金) 06:51:55Exceptional C++ Style の最初の項を立ち読みしてきなさい
0350デフォルトの名無しさん
2006/12/15(金) 13:32:41boostのソースを読んでみればいいじゃないか。
普通にstringstream使ってるだけだぜ?
0351デフォルトの名無しさん
2006/12/15(金) 22:31:320352デフォルトの名無しさん
2006/12/15(金) 23:08:590353デフォルトの名無しさん
2006/12/15(金) 23:16:420354デフォルトの名無しさん
2006/12/15(金) 23:22:140355デフォルトの名無しさん
2006/12/16(土) 03:00:41std::vectorくらいなら大丈夫だと思ってたんですけど。
でも実装によるとか言われそうだ。
0356デフォルトの名無しさん
2006/12/16(土) 06:27:10使ってみて(≒測定して)から文句言え。
0357デフォルトの名無しさん
2006/12/16(土) 06:29:230358デフォルトの名無しさん
2006/12/16(土) 12:09:57というか俺が覚えてないから調べるのが面倒
0359デフォルトの名無しさん
2006/12/16(土) 12:12:52覚えていても面倒だよ。
そこでboost::ほにゃららですよ、と言うといろいろ召還しそうなのでやめとく。
0360デフォルトの名無しさん
2006/12/16(土) 12:13:380361デフォルトの名無しさん
2006/12/16(土) 13:29:520362デフォルトの名無しさん
2006/12/16(土) 14:10:090363・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/12/16(土) 15:39:430364デフォルトの名無しさん
2006/12/16(土) 16:54:140365デフォルトの名無しさん
2006/12/16(土) 17:44:55次のような状況で、ファンクタが書きたいんですが
こういうことって可能でしょうか
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()),作りたいファンクタ);
のようなファンクタを書くことはできますか
もっと適しているデータ構造とかあるんでしょうか
0366デフォルトの名無しさん
2006/12/16(土) 17:50:59これじゃダメなのか?
transform(a.begin(),a.end(), inserter(b, b.begin()), f);
0367デフォルトの名無しさん
2006/12/16(土) 19:02:21レスありがとうございます
要領を得ない質問の仕方でした、すみません
set<int> a;
set<set<int> > b;としたら一応動くのですが
このbのデータ型もset<int>のままで動かすことは出来ないのでしょうか
(要素のほうのsetも全部親に繰り入れた感じで)
このデータ型にはとくにこだわりはなくて
ファンクタを連鎖的に適用できるような形にはできるでしょうか
一度setのsetでデータを得て、その後そのデータをsetに変更して
bにデータを代入することで目的の動作は達成できるんですが
こういう方法しかないのでしょうか
fの入力と戻り値の型が違うからこういうことになるのかと思い
set<int> g(set<int>)というのを考えたら
結局gの内部で同様の問題が起こってしまいました
0368365,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"));
}
0369デフォルトの名無しさん
2006/12/16(土) 19:22:31これを分けて
int get_twice (int n) {return n;}
int get_square (int n) {return n * n;}
2回transformするとか?
0370デフォルトの名無しさん
2006/12/16(土) 19:23:17-int get_twice (int n) {return n;}
+int get_twice (int n) {return n * 2;}
0371デフォルトの名無しさん
2006/12/16(土) 19:37:22こう
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"));
}
0372デフォルトの名無しさん
2006/12/16(土) 19:39:38set の set がただの set に変換できるの?
4 の2乗の 16 と 8 の2倍の 16 が区別できないんじゃないか?
あ、その前に set だと {4,4} からして無理だな。
0373デフォルトの名無しさん
2006/12/16(土) 19:49:05それがもし問題ならmultisetにすれば解決するね
0374365,367
2006/12/16(土) 19:51:43レスありがとうございます
確かにそれでうまくいきそうですね
ちょっと後出しになってしまって申し訳ないですが
今回2倍と2乗を返すという設定にしたのは、
質問内容の簡略化のため要素数が変わるような関数の例として作ったものです
実は、あるパズルを解くために
数字をn個使って作れる数の集合を求める関数というのが必要になり
この場合、2倍と2乗のように入力と出力の数が同じになるように
うまく分割することが出来なさそうなんです
(出来るかもしれないけど、自分にはわからないので・・
一応、さっきのプログラムの要領で解決はできそうなんですが
他に良い方法ってあるでしょうか
0375デフォルトの名無しさん
2006/12/16(土) 19:57:04こういう感じ?
n = 1のとき{1, 2, 3, ..., 9}
n = 2のとき{10, 11, 12, ..., 99}
0376365,367
2006/12/16(土) 20:00:34申し訳ないです
レス書いてる間にプログラムまで、感謝です
>>372
今回は区別の必要がないので、
同じ値があったら追加しないということにしたら変換できるかなと
必要なら>>373さんのようにすればよいと思います
0377365,367
2006/12/16(土) 20:04:51はい、イメージとしてはそんな感じです
自分が今やっているのは、
例えば加算の演算子+と、同じ数値を並べる演算子があったとして
1をn個並べる関数をfとしたら
f(1)={1}
f(2)={1+1,11}={2,11}
f(3)={1+1+1,11+1,111}={3,12,111}
というような関数です
0378デフォルトの名無しさん
2006/12/16(土) 23:08:17typedef struct stdata{
int nNum;
string sText;
}LISTDATA_T;
vector<LISTDATA_T> vlist;
というデータがあるとして、vectorのデータ内を
nNumの値でソートしたいのですが可能でしょうか?
0379デフォルトの名無しさん
2006/12/16(土) 23:11:26或いは全体的にnNumで比較するのが適切であれば、
operator <の定義を考えたほうが良いかもしれない。
0380デフォルトの名無しさん
2006/12/16(土) 23:18:47void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
お使いのでこれが対応知れてば余裕。
0382355
2006/12/17(日) 03:34:55配列は配列([])とstd::vectorで[]を使ったのとiteratorを使ったの3通り。
std::vectorで[]を使うと配列の時の約2.5倍、
iteratorを使うと配列の時の約1.5倍時間がかかった。
0383デフォルトの名無しさん
2006/12/17(日) 05:03:01どうしようもない。
0384デフォルトの名無しさん
2006/12/17(日) 05:10:57Linux GCC
-O3 だと
vector[] = array[] > vector::iterator > vector.at()
-O1 だと
array[] > vector[] > vector.at() > vector::iterator
ただ、最速、最遅で4倍も違わないからどれでもいいと思う。
こんなのカスみたいなコストだ。
0385デフォルトの名無しさん
2006/12/17(日) 08:26:07実際にはループ一回辺りの処理時間が増えるからますますその差の意義が薄れる。
0386デフォルトの名無しさん
2006/12/17(日) 11:44:530で埋めた後でその総和を取ったりとかしてないと、そもそもループ丸ごと最適化で消されたりするんだが。
ちゃんとやってるよな?
んでうちの結果はイテレータのみ倍遅い。あとは全部誤差の範囲。
つーか、10000回程度だと負荷が軽すぎだろ。
0387デフォルトの名無しさん
2006/12/17(日) 12:27:17妥当だと思うときにvectorを使うのよね
array[]で済むならarray[]使えばいいのです
0388・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/12/17(日) 20:48:160389デフォルトの名無しさん
2006/12/18(月) 21:51:490390デフォルトの名無しさん
2006/12/18(月) 23:41:25vector<int> v;
v.resize(1000);
int *p=&v[0];
としてv[i]のかわりに *(p+i)を使えば速度は同じになる。
0391デフォルトの名無しさん
2006/12/18(月) 23:45:00マイクロベンチで1:2.5みたいな差が出ても
アプリに落ちれば30:31.5くらいだろw
0392・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/12/18(月) 23:59:290393デフォルトの名無しさん
2006/12/19(火) 00:05:01配列は代入のみでvectorはallocateと代入で、比較してる操作が
違うから当然の結果だろうね。resizeしての比較をするべきだろう。
0394デフォルトの名無しさん
2006/12/19(火) 01:41:46allocateは関係なく、単純な代入だけでも差がでる。
関数をコールしている分vectorは遅いのではないか?
0395デフォルトの名無しさん
2006/12/19(火) 01:55:41最適化はかけたか?デバッグオプションは付いてないか?
0396デフォルトの名無しさん
2006/12/19(火) 03:10:31具体的なベンチコードとコンパイラの名前とバージョンさらせ。
0397デフォルトの名無しさん
2006/12/19(火) 06:54:48inline関数が遅いなんてことはない。operator[]が
*(begin() + _Pos)なので遅い。
0398デフォルトの名無しさん
2006/12/19(火) 07:57:08> *(begin() + _Pos)なので遅い。
なんでだよ
0399デフォルトの名無しさん
2006/12/19(火) 09:20:350400デフォルトの名無しさん
2006/12/19(火) 09:26:13それが遅い理由なの?
ごめん。意味わかんない。 inspector って、何の用語?
0401394
2006/12/19(火) 14:23:35VC++7.1,stlportをマルチスレッドオプションを付けてコンパイルしている
(cl /GX /O2 /MT ...)
やはりvectorの方が普通の配列より2割ぐらい遅いね。
0402デフォルトの名無しさん
2006/12/19(火) 14:24:540403394
2006/12/19(火) 14:33:260404デフォルトの名無しさん
2006/12/19(火) 14:57:450405デフォルトの名無しさん
2006/12/19(火) 15:31:20挿入順序覚えてくれてる連想配列なんだけどvectorとmap併用かしら?
0406デフォルトの名無しさん
2006/12/19(火) 15:41:56for (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はシラネ
0407デフォルトの名無しさん
2006/12/19(火) 16:55:230408デフォルトの名無しさん
2006/12/19(火) 18:42:47だめ だけど勉強になりました。
ありがとう。
0409デフォルトの名無しさん
2006/12/19(火) 18:57:04スタック上の配列と比べてメモリのキャッシュに乗りにくいのかな。
0410デフォルトの名無しさん
2006/12/19(火) 18:59:140411デフォルトの名無しさん
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 ){/* 省略 */}
0412411
2006/12/19(火) 19:49:26向こうで質問しなおしますね
0413デフォルトの名無しさん
2006/12/20(水) 11:18:30for(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に変換できれば
それでもよいですが・・・。
0414デフォルトの名無しさん
2006/12/20(水) 11:25:44aがconstなんだろ。
const_castすればいけるだろうが、それは何か間違ってる。
0415デフォルトの名無しさん
2006/12/20(水) 11:42:13vector< shared_ptr<A> > b = a;
for( vector< shared_ptr<A> >::iterator itr = b.begin(); ...
0416デフォルトの名無しさん
2006/12/20(水) 11:46:550417デフォルトの名無しさん
2006/12/20(水) 18:27:26set<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を吐くというのは、
あまりないような気がするのですが、どういうことを
念頭におきながらデバッグすればよいでしょうか?
0418デフォルトの名無しさん
2006/12/20(水) 18:34:150419デフォルトの名無しさん
2006/12/20(水) 18:41:02原因はsetというより十中八九
Xだろうね
0420デフォルトの名無しさん
2006/12/20(水) 19:08:30-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です。
0421デフォルトの名無しさん
2006/12/21(木) 03:32:290422デフォルトの名無しさん
2006/12/21(木) 06:27:28で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
0423デフォルトの名無しさん
2006/12/21(木) 07:44:03問題の再現するソースと再現しないソースの違いを洗っていけばいいんだよ。
0424デフォルトの名無しさん
2006/12/21(木) 12:08:270425デフォルトの名無しさん
2006/12/21(木) 15:52:54VC6付属のSTLではenumで定義されてるけど、
VC8付属のSTLではclass _Iosbのメンバで
static const _Openmodeで実体があるのはなぜ?
VC6の時はstatic const に初期値を設定できないから
enumハックを使用していると思うんだけど
static const にして実体を持つようにした理由がわからない。
なにか利点あるの?
0426デフォルトの名無しさん
2006/12/21(木) 21:22:37元々列挙値じゃないのに enum を使ってたのが不自然なんだから、
普通に改めたんだろ。逆に、何か不満な点でもあるの?
0427425
2006/12/22(金) 15:36:23利用する箇所でもコンパイル時に値が確定するから、
高速化しそうな気がするんですが。
(static constも最適化されて同じかもしれませんが、
それを期待するのはどうかと思って。)
0428デフォルトの名無しさん
2006/12/22(金) 16:03:40サイズのデメリットは型の正しさの前では無視できる範囲だと思うよ。
サイズと引き換えにアドレス(参照)を取ることができるようになるから、
相殺と考えることもできるだろう。
static const でも、整数型(および列挙型)でクラス定義内で初期化子を
つけたものはコンパイル時定数として使うことができる。
これは規格で定められた動作なので、最適化に期待するというものではない。
0429425
2006/12/22(金) 17:29:48参照ってのは思いつきませんでした。なるほど。
型の正しさはenumでも同じですよね。
>static const でも、整数型(および列挙型)でクラス定義内で初期化子を
>つけたものはコンパイル時定数として使うことができる。
規格で定義されてるんですね。
知りませんでした、ありがとうございます。
0430デフォルトの名無しさん
2006/12/22(金) 23:04:23> 型の正しさはenumでも同じですよね。
typesafe enum知らない人?
enumはあまりtypesafeじゃないよ。初級なんでググってみて。
0431425
2006/12/23(土) 04:28:27typesafe enum知らなかったからぐぐって見た。
javaばっかりヒットするのね。
Cはtypesafeではないけど、C++のenum は 型チェックしてくれるから、
typesafeなんじゃないのと思ったり。
それはそれとして、enumはtypesafeではないかも知れないけど、
static const _Openmodeで実体を持つ場合も同じではないの?
0432デフォルトの名無しさん
2006/12/23(土) 11:53:17???
0433デフォルトの名無しさん
2006/12/23(土) 14:49:18> 型の正しさはenumでも同じですよね。
組み込み整数型で特殊化した template に
enum で定義された定数を渡して特殊化版が
呼び出されないとか、困るかもしれない。
0434デフォルトの名無しさん
2006/12/23(土) 20:21:18listのメンバ関数のsortで、
↓みたいな使い方が出来るそうですが、使い方を詳しく紹介している
サイトがあったら教えてください。
c.sort()
c.sort(op)
※ cはリスト
sort()だと昇順にソートすることは、分かったつもりですが、
listの型がcharだった場合とかsort(op)の使い方がわかりません。
↓私は今ここを参考にしています。
http://wing.zero.ad.jp/~zbe11018/cycode/tips/cbuilder/stl-master.html
0435・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/12/23(土) 21:02:38struct 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++ライブラリクリックリファレンス。
0436デフォルトの名無しさん
2006/12/23(土) 21:23: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++ライブラリクリックリファレンス。
私も参考にしたいと思います。
0437デフォルトの名無しさん
2006/12/23(土) 22:56:38不要な引用は見づらいだけなので気をつけたほうがいいよ。
0438デフォルトの名無しさん
2006/12/24(日) 04:19:112冊欲しいと思っています。
1.
STLの基本概念や、各機能の説明が分かりやすく
説明されている物(vector, mapとはどういう物かとか)。
2.
STLの内部実装の事や、効率面を考えた時に、知っておいた方が良い事が纏められている様な物。
要するに、かなり深く突っ込んだ内容のものがいいです。
0439デフォルトの名無しさん
2006/12/24(日) 04:22:381.C++標準ライブラリ
ISBN4-7561-3715-6
2,Effective STL
ISBN4-89471-410-8
0441439
2006/12/24(日) 04:24:02でもISBNは合ってると思うのでとりあえずamazonで見てみて
0442デフォルトの名無しさん
2006/12/24(日) 04:26:29おお、即レスありがとうございます。
早速色々と見てみたいと思います。
0443デフォルトの名無しさん
2006/12/24(日) 06:38:490444デフォルトの名無しさん
2006/12/24(日) 11:20:56同一関数のスコープ内で同名で違うイテレータを定義した場合、前に定義したイテレータは消えるようですが、
宣言としては、グローバル変数や引数と名前がかぶらないように注意するだけでよい、ということでしょうか?
0445デフォルトの名無しさん
2006/12/24(日) 11:28:25typedefのこと?
それとも実体をつくること?
0446444
2006/12/24(日) 12:27:51vector<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は勉強し始めたばかりなので、何かへんなことを聞いていたら申し訳ないです。
0447デフォルトの名無しさん
2006/12/24(日) 12:35:52STL関係ない。
「イテレータ」を「変数」に置き換えて >>444 を復唱してみろ。
0448・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/12/24(日) 12:38:16通らないものを作っても無駄な作業でしかないです。
0449444
2006/12/24(日) 12:43:16もちろん、通ることは確認済みなのですが、理屈がわからずに使うのは気持ち悪い、と思いまして確認させていただきました。
イテレータのスコープはローカル変数と同じと考えてよい、ということですね。
ありがとうございました。
0450デフォルトの名無しさん
2006/12/24(日) 12:49:28同じスコープで同名の変数は定義できないよ。
どんなクズコンパイラ使ってんだ?
それに、結論も違う。「イテレータの値をローカル変数に入れている」と考えろ。
そうなればスコープについてローカル変数のルールに従うのは自明なはず。
0451デフォルトの名無しさん
2006/12/24(日) 13:08:36スコープを持つのは、宣言や定義。
オブジェクトはエクステント(extent)。普通生存期間と訳されている。
この区別は、言葉だけの問題ではなく、基礎概念の理解につながっている。
0452デフォルトの名無しさん
2006/12/24(日) 14:25:550453デフォルトの名無しさん
2006/12/24(日) 14:33:06通ったってのはウソだよ
0454デフォルトの名無しさん
2006/12/24(日) 14:42:570455444
2006/12/24(日) 14:54:32vector<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,マッサー他 を読んでいるのですが、敷居が高いっす。
ネットのハウツー参考にしながら感覚的には理解し始めているのですが・・
0456デフォルトの名無しさん
2006/12/24(日) 14:56:16一般的な変数のスコープとオブジェクトの生存期間について理解してからSTLに取り組むことをお勧めします。
0457デフォルトの名無しさん
2006/12/24(日) 15:45:18君のそのコードは
int hoge = 10;
hoge = 5;
と何が違うんだい?
0458・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/12/24(日) 16:16:370459デフォルトの名無しさん
2006/12/24(日) 16:19:560460デフォルトの名無しさん
2006/12/24(日) 19:17:040461デフォルトの名無しさん
2006/12/24(日) 21:07:130462・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/12/24(日) 21:07:580463デフォルトの名無しさん
2006/12/24(日) 21:12:110464デフォルトの名無しさん
2006/12/25(月) 22:02:58そのファイルはユニコードで書かれている。
なのでiostreamをbasic_iostream<wchar_t>あたりに変換したいんだが
なんか便利な方法ある?
std::wstring str;
std::getline(stream,str);
みたいに使いたいわけなんだが。
0465デフォルトの名無しさん
2006/12/25(月) 22:54:430466デフォルトの名無しさん
2006/12/25(月) 22:58:05間違いだったか。
ならスマソ
0467デフォルトの名無しさん
2006/12/25(月) 23:18:27たまにいるんだよ。
ちなみに、そういう人に「なんでageちゃいけないのか」を訊くと、
なぜか回答らしい回答が無いかわりに人格攻撃とか始めるから注意な。
0468デフォルトの名無しさん
2006/12/25(月) 23:36:340469デフォルトの名無しさん
2006/12/26(火) 01:01:35ない
0470デフォルトの名無しさん
2006/12/26(火) 13:28:120471デフォルトの名無しさん
2006/12/26(火) 15:05:06codecvtで頑張ってくれ
0472デフォルトの名無しさん
2006/12/26(火) 16:18:38read でバイト列読んで、memcpy でもすれば?
0473デフォルトの名無しさん
2006/12/27(水) 13:41:47あんまり分かってないんで、とりあえず「最悪、これなら行ける」方法。
iostreamをstringで受けて、それをここにあるような関数で変換する。
http://hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html
(↑の一番下のリンク)
iostreamそのものを変換ができるのかは知らない。すみません。
0474デフォルトの名無しさん
2006/12/27(水) 14:31:590475デフォルトの名無しさん
2006/12/27(水) 17:24:59便利だけど簡単かどうかはわからない。
Boost.Iostreamsでなんとかするというのはどうだ?
0476デフォルトの名無しさん
2006/12/27(水) 17:52:06ファイルの中身が 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;
}
}
0477デフォルトの名無しさん
2006/12/27(水) 19:27:470478デフォルトの名無しさん
2006/12/28(木) 20:40:590479デフォルトの名無しさん
2007/01/03(水) 23:15:54remove_ifよりpartitionの方が効率がよかったりするの?
0480デフォルトの名無しさん
2007/01/04(木) 02:17:07remove_if() は operator = () によるコピー、
partition() は swap() による移動を使う。
あとは中身によってどっちが効率いいか決まるだろう。
0481デフォルトの名無しさん
2007/01/04(木) 10:02:540482デフォルトの名無しさん
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のテンプレート化はできないようです。
0483482
2007/01/09(火) 21:49:00//------------↓は実際は動かない----------
template <typename S>
typedef boost::range_value< S >::type T;
T join5(S b, // 開始イテレータ
S e, // 終了イテレータ
T s // 区切り文字列
)
まあ、動かない擬似コードではありますが。
0484デフォルトの名無しさん
2007/01/09(火) 23:10:500485デフォルトの名無しさん
2007/01/09(火) 23:30:590486デフォルトの名無しさん
2007/01/09(火) 23:50:50ということなのでしょうか?Boostあたりで何か便利なものが生まれていない
かと思ったのですが。
>>484
C++なので、できたらマクロは使いたくないです。482の記事にもありますが、
予測を裏切る作用が多いので。
0487デフォルトの名無しさん
2007/01/10(水) 00:44:49struct Hoge { typedef typename boost::range_value< S >::type T; };
template <typename S>
Hoge<S>::T join5(S b, // 開始イテレータ
S e, // 終了イテレータ
Hoge<S>::T s // 区切り文字列
)
0488482
2007/01/10(水) 01:15:48ありがとうございます。さっそく試してみました。
GCCなどでは、Hoge<S>::T の前の typename は省略できません。すると、
typename boost::range_value< S >::type
↓
typename Hoge<S>::T
かなり短くなりますが、T 一文字まで短くはならないようです。
また、構造体Hogeには他の応用がほとんどないのに、グローバルな名前空間に
登録されてしまうのも、ちょっと残念な気がします。
0489デフォルトの名無しさん
2007/01/10(水) 14:44:14むしろフルネームなのに相当短いぞ
boost::range_library::metafunctions::range_value_of<S>::type
とかじゃなくて良かっただろう
0490482
2007/01/10(水) 17:12:23おっしゃることはもっともですが、では実際にそういう型名の関数を宣言しな
ければならなかったら、どうしたら良いのでしょう?
関数じゃなくてクラスだったら、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;
0491デフォルトの名無しさん
2007/01/10(水) 17:30:21どうしてもイヤだったら>>487みたいなヘルパ書いて
適当なnamespaceに閉じ込めておけばよかろう。
0492デフォルトの名無しさん
2007/01/10(水) 19:19:04それにレイヤーを被せると
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(), ..);
一般的に解決するのは難しい。が、
タイプを減らすように部分的にデザインすることはできる
0493482
2007/01/10(水) 20:49:27>>491
たしかに、それが現実的な気もします。
>>492
template<template<class> class Join>
恥ずかしながら、この記述が分かりませんでした。
テンプレートを引数に取るテンプレートなのでしょうか?
何か参考になるリンクを教えていただけませんか?
0494482
2007/01/10(水) 21:06:10http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep08032000.asp
の一番下のほうに、
> rebind<T>::other の方法で十分であると判断した
と書いてありますが、
この方法は、自分自身が持つ型変数を変更した型を返せるクラスと、それを
保持するコンテナの定義の仕方でしかないと思うのです。
これがどうしてtypedefのテンプレートとして使えるのか、理解できないのです。
0495デフォルトの名無しさん
2007/01/10(水) 21:06:56{
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 です。
0496デフォルトの名無しさん
2007/01/10(水) 22:25:300497デフォルトの名無しさん
2007/01/10(水) 22:45:41bind2nd の第一引数が const で Test::hoge が constメンバでないから
0498デフォルトの名無しさん
2007/01/10(水) 22:57:440499デフォルトの名無しさん
2007/01/10(水) 23:13:07しかし std::bind1st(std::mem_fun_ref(&Test::hoge),t)(100)
ではコンパイルエラーになります。
Test::hoge を const メンバにすればエラーになりません。
0500482
2007/01/10(水) 23:34:45このようにコンテナとその要素を設計すると、
要素のクラス<型変数> を
X::rebind<型変数>::allocator_type
という決まった形式で呼べる、ということです。
だから呼び出し側の形式を固定化、汎用化できる、ということです。
しかし、固定化はできますが、その固定の形式は全然自由でありません。
この実装だと、
呼び出される側は 要素のクラス<型変数>
呼び出す側はX::rebind<型変数>::allocator_type
この形式でしか扱えないのです。typedef の自由さとはかけ離れています。
しかもたいていの場合、呼び出し側は元の型名より長くなってしまいます。
まあそれ以前に「コンテナとその要素の組み合わせでしか使えない」
ので、今回の「関数に与える型名を短くしたい」という目的には全く適わない
のですが。
0502デフォルトの名無しさん
2007/01/11(木) 00:11:43bind1stの第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
0503デフォルトの名無しさん
2007/01/11(木) 00:13:35bind1st(), 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);
0504デフォルトの名無しさん
2007/01/11(木) 00:15:080505デフォルトの名無しさん
2007/01/13(土) 21:35:18sprintf書式でバッファサイズ気にしなくてよくてある程度高速なformat()を実装してる例ってないですか?
0506デフォルトの名無しさん
2007/01/13(土) 21:40:430507デフォルトの名無しさん
2007/01/13(土) 22:08:21その条件に完全にマッチするわけではないが
http://tricklib.com/cxx/dagger/xstring.h
こんなのならある。
0508デフォルトの名無しさん
2007/01/13(土) 22:25:540509デフォルトの名無しさん
2007/01/14(日) 00:25:560510デフォルトの名無しさん
2007/01/15(月) 19:58:53VC8ではエラーになるんですが、これは書式としてはあっているんでしょうか
//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;
}
0511デフォルトの名無しさん
2007/01/15(月) 21:45:470512デフォルトの名無しさん
2007/01/16(火) 00:12:10ありがとうございます
あ、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;
}
もしエラーが文法の問題だったとするとちょっと悔しいなぁ
0513デフォルトの名無しさん
2007/01/17(水) 11:29:48> template <template <typename T> class STLC
みたいな書き方初めて見たんだけど、どういう意味なの?
0514デフォルトの名無しさん
2007/01/17(水) 12:25:160515デフォルトの名無しさん
2007/01/17(水) 13:23:15テンプレート・テンプレート・パラメータ
§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:
簡単に言うとクラステンプレートをテンプレートの引数に持てるという意味だな。
そしてそれにデフォルトの型を指定する事もできる、と。
0516デフォルトの名無しさん
2007/01/17(水) 13:27:21template <typename T, typename U> と書くのと
template <typename T>
template <typename U>
と書くのでは、どういう風に意味が違ってくるのですか?
0517デフォルトの名無しさん
2007/01/17(水) 13:28:39テンプレート・テンプレート・パラメータと言うのか。
勉強になった。
0518デフォルトの名無しさん
2007/01/17(水) 14:37:05それコンパイル通る?
0519デフォルトの名無しさん
2007/01/17(水) 15:04:56下は通常あり得ない書き方だろう。
あるとすれば、クラステンプレートのメンバ関数テンプレート、の実装部分くらい。
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) { }
みたいな。
0520デフォルトの名無しさん
2007/01/17(水) 15:26:00あ、なるほど、確かに説明の所にメンバテンプレートと
書いてありました。
わかりやすい説明ありがとうございます。
0521デフォルトの名無しさん
2007/01/18(木) 02:26:39それともB木や2色木みたいなバランス調整される構造なんでしょうか?
0522デフォルトの名無しさん
2007/01/18(木) 04:04:430523デフォルトの名無しさん
2007/01/18(木) 06:11:510524デフォルトの名無しさん
2007/01/18(木) 08:02:420525デフォルトの名無しさん
2007/01/18(木) 09:01:360526デフォルトの名無しさん
2007/01/18(木) 11:45:22STLならヘッダでいいし
そうでなくともVC++にはC/C++ランタイムのソースついてるだろ
0527デフォルトの名無しさん
2007/01/18(木) 13:10:48ヘッダに赤黒木の実装が使われているようだ。
0528デフォルトの名無しさん
2007/01/18(木) 15:31:20複雑性保証として最悪で O(log N) を要求しているので,
必然的に何らかの balanced tree による実装が必然になります.
さらに iterator を指定しての (木構造中のノードを指定しての) 削除に
最悪で O(1) の複雑性を要求するので, AVL tree もダメでしょうね.
あまりデータ構造に詳しくないのであれですが,
B-tree も要素削除後の再平衡化が O(1) では無理だったように記憶しています.
もちろん,どちらのデータ構造も欠点に代わる利点を持っていますけれど.
したがって,実装としてはおおよそにおいて赤黒木に落ち着くのではないかと思います.
>527
VC7.1, VC8.0 の set, multiset, map, multimap の実装は赤黒木です.
0529デフォルトの名無しさん
2007/01/18(木) 17:47:040530デフォルトの名無しさん
2007/01/19(金) 09:22:18上のほうの主張はほとんどすべて間違っている。
データ構造について再履修しよう。
まず
>最悪で 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) が構成できる。
0531デフォルトの名無しさん
2007/01/19(金) 20:16:30こういうのは「検証」というんだろうか?
0532デフォルトの名無しさん
2007/01/19(金) 21:21:53どうもありがとうございます」とでも書けばいいのに。
0533デフォルトの名無しさん
2007/01/19(金) 21:32:57>>最悪で O(log N) を要求しているので,
>>必然的に何らかの balanced tree による実装が必然になります.
>は嘘。balanced tree 以外にもこの条件を達成できる
>データ構造は存在する。もちろん bst が最も普通ではあるが。
は521へ対するレスとして「ただの2分木か,それとも branced tree か」という
暗黙の仮定をおいてレスを書いてしまってました.すいません.
それ以降指摘されたことに関しては完全に自分の非で,特に赤黒木に対しては
自分でもなんでこんなトンチンカンなこと書いたのか,恥ずかしい限りです.
528の内容については,完全に無視してやってください.本当にすいません.
猛省して,データ構造について勉強しなおしてきます.
0534デフォルトの名無しさん
2007/01/22(月) 15:14:59関数の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); // できない?
}
};
0535デフォルトの名無しさん
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を自動設定できないかと思いました
0536デフォルトの名無しさん
2007/01/22(月) 16:06:17template< typename T>
vector<Data> operator()(T &t)ではないのか。
>>535
objもクラステンプレートにしてはだめなのか。
0537デフォルトの名無しさん
2007/01/23(火) 01:07:29> 関数のreturnにvectorをもってくるとおかしくなるから
何がおかしくなるのか言ってみな。
0538デフォルトの名無しさん
2007/01/23(火) 06:30:14決まっているじゃないか、>534の頭だよ。
0539デフォルトの名無しさん
2007/01/23(火) 07:12:200540デフォルトの名無しさん
2007/01/23(火) 07:17:38そして最後は釣りだったことに
0541534
2007/01/23(火) 13:43:28{
vector<int> ar(20);
return ar;
}
にすると、スコープを抜けるとarのメモリーが解放されてしまうらしく
エラーになっておちる
0542デフォルトの名無しさん
2007/01/23(火) 13:59:430543デフォルトの名無しさん
2007/01/23(火) 13:59:510544デフォルトの名無しさん
2007/01/23(火) 14:06:430545534
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];
}
0546デフォルトの名無しさん
2007/01/23(火) 14:41:07それは落ちるだろ
こうするとか
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;
}
0547デフォルトの名無しさん
2007/01/23(火) 14:48:270548デフォルトの名無しさん
2007/01/23(火) 14:49:360549デフォルトの名無しさん
2007/01/23(火) 15:16:180550デフォルトの名無しさん
2007/01/23(火) 17:47:580551デフォルトの名無しさん
2007/01/23(火) 18:06:030552デフォルトの名無しさん
2007/01/23(火) 19:10:29ポインタじゃなく参照になるとこういうところで気が抜けちゃうんだろうか?
0553534
2007/01/23(火) 19:15:52ローカル変数をコピー(大きい配列の場合、したくない)
なしに返すには、関数を関数オブジェクトにして、
計算結果を関数オブジェクトのメンバー変数においておく
という方針は、いいのかどうか?
他にもっといい方法があるのか知りたい
0554デフォルトの名無しさん
2007/01/23(火) 19:30:55>>546
0555デフォルトの名無しさん
2007/01/23(火) 22:18:220556デフォルトの名無しさん
2007/01/24(水) 21:58:31template <template <typename T> class U>
は
template <template <typename T> typename U>
だとコンパイル通らないですね。
templateの中のclassとtypenameって同じことだと思っていましたが
多少異なるんでしょうか?
0557デフォルトの名無しさん
2007/01/24(水) 22:15:13Uは実在の型でないといけないから、テンプレートパラメータではなく
クラス名を書かなければならない。だからtypenameではだめ。
0558デフォルトの名無しさん
2007/01/25(木) 09:10:16それ、ほんと?
0559デフォルトの名無しさん
2007/01/25(木) 09:58:22通常、U は、クラスか構造体にしかならないから…らしい。
0560デフォルトの名無しさん
2007/01/25(木) 10:23:170561デフォルトの名無しさん
2007/01/27(土) 09:04:22for_each transform
がない。
自分で作るのもいいけどbindとかと組み合わせると不安
どこかに安定したのがないだろうか
0562デフォルトの名無しさん
2007/01/27(土) 09:35:480563デフォルトの名無しさん
2007/01/27(土) 11:24:180564デフォルトの名無しさん
2007/01/27(土) 14:35:100565デフォルトの名無しさん
2007/01/27(土) 21:10:39あ、それでいけそう
ありがとう。
0566デフォルトの名無しさん
2007/01/28(日) 15:05:06エスパー登場!?
0567デフォルトの名無しさん
2007/01/28(日) 16:25:180568デフォルトの名無しさん
2007/02/01(木) 19:31:32eraseってこんなに遅いもん?
//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);}
0569デフォルトの名無しさん
2007/02/01(木) 23:12:27std::stringはstd::vectorに似てerase()は遅いぞ。
0570デフォルトの名無しさん
2007/02/02(金) 23:38:27そっか、さんくす
0571デフォルトの名無しさん
2007/02/03(土) 15:16:13public:
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
}
0572デフォルトの名無しさん
2007/02/03(土) 15:17:24リファレンスを引数に取るメンバ関数から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&)'
と言われてしまいます。
0573デフォルトの名無しさん
2007/02/03(土) 15:23:14リファレンスリファリンス問題だな。標準ライブラリの欠陥だよ。
boost::bindでも使いなせえ。
0574デフォルトの名無しさん
2007/02/03(土) 19:07:58STLport 5.0.3
0575デフォルトの名無しさん
2007/02/03(土) 20:27:21隣で笑ってたかった。
boostは次々変わるのに
STLは立ち止まったまま。
0576デフォルトの名無しさん
2007/02/03(土) 20:46:240578デフォルトの名無しさん
2007/02/03(土) 22:17:52それなんてプリンセスプリンセス?
0579デフォルトの名無しさん
2007/02/03(土) 22:22:140580デフォルトの名無しさん
2007/02/04(日) 22:31:50あぁ、前に悩んであきらめたなぁ・・
boost::bindだと平気なの?
0581デフォルトの名無しさん
2007/02/05(月) 00:50:31http://0xcc.net/blog/archives/000090.html
0582デフォルトの名無しさん
2007/02/05(月) 01:04:06heboい俺にはVCから移行できる気がしない
0583580
2007/02/05(月) 03:01:53binder2ndとbind2ndの第2引数を
const _Ty& _Right → _Ty _Right
強引にこうしちゃうと動くようになったりするんだが、他のとこが動かなく
なりそうだしなあ・・
0584デフォルトの名無しさん
2007/02/05(月) 08:33:000585デフォルトの名無しさん
2007/02/05(月) 16:32:22キーの一覧を取得したいんです。
イテレータ使ってループ回すしかないですか?
0586デフォルトの名無しさん
2007/02/05(月) 16:38:110587デフォルトの名無しさん
2007/02/05(月) 17:15:430588デフォルトの名無しさん
2007/02/05(月) 17:28:380589585
2007/02/05(月) 17:33:38素直にイテレータ使ってmapを巡回させることにします。スレ汚しすみません。
0590デフォルトの名無しさん
2007/02/05(月) 23:18:270591585
2007/02/06(火) 10:16:30だがしかし、VC++に標準で付いてるSTLで開発してるんで使えません。
0592デフォルトの名無しさん
2007/02/06(火) 10:27:14transform なら VC++6.0 にもあるよ。
0593デフォルトの名無しさん
2007/02/06(火) 11:05:53ただし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;
}
0594デフォルトの名無しさん
2007/02/06(火) 11:18:21VCしか使ったことないからかselect1stしらなかったけど
当然2ndもあるんね すげー便利そう
0595デフォルトの名無しさん
2007/02/06(火) 11:21:040596デフォルトの名無しさん
2007/02/06(火) 11:23:49struct 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; }
};
たったこれだけ
0597594
2007/02/06(火) 11:29:51これは横槍ながら感謝です
0598デフォルトの名無しさん
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; }
};
0599585
2007/02/06(火) 13:57:26select1st, select2ndのコードまで教えていただけるとは思いも寄りませんでした。
ありがとうございます。
0600デフォルトの名無しさん
2007/02/06(火) 15:24:10だからboostでtupleなんかが活躍しているんだろうけど。
0601デフォルトの名無しさん
2007/02/07(水) 02:42:28STLPortっていうのはどこで確認できるんでしょうか。
boost1_33_1を入れて普通にIncludeフォルダlibフォルダを
VC++2005に設定したらboostは使えてるんですが
STLPortっていうのが気になります。
確認方法が、あるんでしょうか。
板違いかもしれませんが、どなたか分かる方が居れば
教えていただきたいです。
0602デフォルトの名無しさん
2007/02/07(水) 09:33:210603デフォルトの名無しさん
2007/02/07(水) 20:42:500604デフォルトの名無しさん
2007/02/07(水) 21:19:09vectorは参照出来ましたが、listはさっぱり構造がわからずうまく行きません。と言うのも、GDBから演算子関数が呼び出せないんです。
使い易く別でシーケンスを出力する関数を用意するにもテンプレの実行時特化で弾かれます。
何か解決策は無いでしょうか?
0605デフォルトの名無しさん
2007/02/16(金) 19:30:23STLport 5.1.1 Notes (2007-02-16 01:46)
0606デフォルトの名無しさん
2007/02/18(日) 04:01:16size_type find(const charT* s, size_type pos) const;
のposにstring::nposを指定した時の戻り値って規格で決まっていないんですかね?
g++とVC6では結果が違ったので
0607デフォルトの名無しさん
2007/02/18(日) 04:06:39普通に考えると npos 以外返しようがないと思うんだが、
npos じゃない値が出てきたの?
0608デフォルトの名無しさん
2007/02/18(日) 04:18:19string s = "abcdefbc";
printf("%d\n", s.find("bc", string::npos));
を試してg++3.4.4(cygwin)で1が返り、VC6では-1(npos)が返りました。
0609デフォルトの名無しさん
2007/02/18(日) 04:19:390610デフォルトの名無しさん
2007/02/18(日) 04:20:220611デフォルトの名無しさん
2007/02/18(日) 04:38:42npos はその逆で文字列の末尾(==*.end())を指すインデックスとして使われていることを考えると
VC6の挙動のほうが規格的には正しい。が、nposが指定された場合の挙動が明記はされとらんねぇ。
0612デフォルトの名無しさん
2007/02/18(日) 08:27:150613デフォルトの名無しさん
2007/02/18(日) 08:53:38直接明記はされてないけど、仕様としては最大値扱いのnposが渡されただけの
話なんで、普通に行間を読めばVC6の挙動が規格通りだと思うんだけど、
はっきりと明記されてない限りは未定義扱いになるんだっけ?
0614デフォルトの名無しさん
2007/02/18(日) 09:24:12明記されてないまま、nposが最大値扱いな説明がされているところを見ると、VC6の挙動が
規格通りの挙動ってことでいいんじゃないか? はっきり明記されていない限り未定義って
ことだと、rfind で検索開始位置を指定しなかった場合の挙動も未定義ってことになるぞ。
0615デフォルトの名無しさん
2007/02/18(日) 10:26:150616615
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が返るようになってた。
0617デフォルトの名無しさん
2007/02/18(日) 11:26:49今回のは gcc のバグ。
いくらか調べてみると、やっぱり npos がどっかで signed に
突っ込まれてるみたい。 npos を小さくしながら試していくと、
npos / 2 を渡したところから npos が返るようになった。
0618デフォルトの名無しさん
2007/02/18(日) 12:14:160619606
2007/02/18(日) 12:32:21findにnposを渡した時、
・規格で特に明記されているわけではない。
・明記されていないがnposは-1で最大値扱いされているので、nposを返すと考えるのが自然。
・現実にはSTLの実装によって動作が変わるのでこういうコードは書かないほうが良い。
しかし今度はnposの規格が疑問になってきた。
nposの規格って
1.検索失敗時に返す値
2.符号なし整数の最大値
1は規格にあると思うけど2は規格にあるんですか?
2がもしないならrfindにnposを指定した場合も未定義なのかな
規格ってISOで買うしかないんですかね。。。
0620デフォルトの名無しさん
2007/02/18(日) 12:47:10static const size_type npos = 1;
0621デフォルトの名無しさん
2007/02/18(日) 13:10:581?
-1じゃなくて?
0622デフォルトの名無しさん
2007/02/18(日) 13:21:43size_type は符号無し整数で、符号無し整数に変換された -1 が
その型の最大値を取ることは規格から導くことができる。
0623デフォルトの名無しさん
2007/02/18(日) 13:31:14rfindにnposを渡すと最後尾から検索開始することが保証されますね。
となるとやっぱりg++3.4.4のfindにnposを渡した時の動作は変だ。
0624デフォルトの名無しさん
2007/02/18(日) 15:56:17C++標準ライブラリ(規格の17章から27章)の部分だけでいいなら
国際規格(ISO) C++ライブラリハンドブックを買う手もある。
0625デフォルトの名無しさん
2007/02/18(日) 16:07:040626デフォルトの名無しさん
2007/02/18(日) 16:41:24英語のドラフトでよければダウンロードできるよ。
0627デフォルトの名無しさん
2007/02/18(日) 16:45:290628デフォルトの名無しさん
2007/02/18(日) 17:09:29を検索開始位置にした場合は、未定義なんじゃないの?
rfindについては、検索開始位置が未指定の場合は末尾からの検索を
行うというのが仕様で、大半の処理系はその仕様をdefault値をnposにする
ことで実装しているだけだと思うが。
0629デフォルトの名無しさん
2007/02/18(日) 17:26:12rfindのデフォルト値は規格でnposと決まっている。
0630デフォルトの名無しさん
2007/02/18(日) 17:50:42条件が満たされない場合はnposを返すとある。
0631デフォルトの名無しさん
2007/02/18(日) 21:07:46なんとかしてgcc3の挙動が規格上問題ないという証拠を見つけたい
0632デフォルトの名無しさん
2007/02/18(日) 21:43:33もう結果が出てるんだから無理。
0633デフォルトの名無しさん
2007/02/18(日) 21:59:17patch投げるほうがたぶん建設的やで。
0634デフォルトの名無しさん
2007/02/18(日) 22:01:49size_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?
0635デフォルトの名無しさん
2007/02/18(日) 22:16:05Returns: find(basic_string<charT,traits,Allocator>(s,n),pos).
s.find( "", 2 );と同じ。空文字列は当然、先頭にマッチする
0636デフォルトの名無しさん
2007/02/19(月) 00:59:34gccのbasic_stringまわりは糞だからなぁ。
0637デフォルトの名無しさん
2007/02/19(月) 04:04:49VC6のじゃなくてDinkumwareのと言えばOK
0638デフォルトの名無しさん
2007/02/19(月) 19:07:230639デフォルトの名無しさん
2007/02/19(月) 19:38:47俺はgccのほうが大嫌いだけど、なんていうかさぁ、ほら、
のびたの癖に生意気だぞ〜、みたいな?
0640デフォルトの名無しさん
2007/02/19(月) 20:05:410641デフォルトの名無しさん
2007/02/20(火) 02:34:11VC6とgcc2.95は早く滅びてくれるとみんな幸せになれると思うんだ…。
0642デフォルトの名無しさん
2007/02/20(火) 02:54:21gcc2.95も似たようなものなのけ?
0643デフォルトの名無しさん
2007/02/21(水) 22:20:15そういやgcc2の終わりごろってegccとかforkしてた暗黒時代だった希ガス
0644デフォルトの名無しさん
2007/02/21(水) 22:40:03>途中からCygnus社(後Red Hatに吸収)が中心となってEGCSプロジェクトと称して
>新しいGCCの開発に着手し,現在ではEGCSプロジェクトが正式なGCC開発元となっています。
と出てきた。gcc2.95は今のgccの先祖じゃないみたい。
0645デフォルトの名無しさん
2007/02/22(木) 00:01:28なかなかしがらみが消えないのが問題なんだよな。
0646デフォルトの名無しさん
2007/02/22(木) 00:11:270647デフォルトの名無しさん
2007/02/22(木) 08:21:43GNU 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++は詐欺な気がする
0648デフォルトの名無しさん
2007/02/22(木) 11:02:040649デフォルトの名無しさん
2007/02/22(木) 12:46:430650デフォルトの名無しさん
2007/02/23(金) 00:22:420651デフォルトの名無しさん
2007/02/26(月) 19:10:540652デフォルトの名無しさん
2007/03/18(日) 20:31:49std::string::iterator を返す関数があるんですが、
例えばエラーが出たときに、ポインタで言う NULL を返したいのです。
イテレータに、NULL に変わる何かはないでしょうか?
位置を int を値で返す関数には、std::string::npos があるけど…
0653デフォルトの名無しさん
2007/03/18(日) 20:54:200654デフォルトの名無しさん
2007/03/18(日) 21:00:02ヌルを意味するダミーのstringを作ってそいつへのイテレータを返す
関数の返り値とダミーのstringを比較する。
0655デフォルトの名無しさん
2007/03/18(日) 21:01:44その辺りの方法も検討して見ます、ありがとうございます。
0656デフォルトの名無しさん
2007/03/18(日) 21:10:04std::find()みたいに、単にend()を返すのではまずいの?
0657デフォルトの名無しさん
2007/03/18(日) 21:14:100658デフォルトの名無しさん
2007/03/18(日) 21:14:12その関数は、end を知らないので…
あー、引数で being と end を渡しておく方が自然ですね…
ありがとうございます
0659デフォルトの名無しさん
2007/03/18(日) 21:33:540660654
2007/03/18(日) 21:58:48あるいはどの文字列のendを返してくるか判らない。
呼び出し元はイテレータ経由で文字列を操作するけど、
イテレータは動かさないのでendは知らなくていい。
という状況を想像した。
0661デフォルトの名無しさん
2007/03/18(日) 23:01:54std::string を戻り値とする関数って、当たり前だけど string の中身がまるまるコピーされるわけだから
そのぶん処理時間的にコストになるわけですよね?
何気なくstd::stringを返却する関数を作ってた自分に気がついてハッとした
0662デフォルトの名無しさん
2007/03/18(日) 23:10:01いや、大抵はstd::stringの中身には文字列そのものは含まれてないわけだが。
0663デフォルトの名無しさん
2007/03/18(日) 23:10:210664デフォルトの名無しさん
2007/03/18(日) 23:12:42リファレンスカウントを使っているタイプのstd::stringじゃなきゃ中身の文字列もコピーされるぞ。
んでもって、今はリファレンスカウントを使わないタイプのstd::stringが主流だぞ。
0665デフォルトの名無しさん
2007/03/18(日) 23:38:110666デフォルトの名無しさん
2007/03/19(月) 21:29:070667デフォルトの名無しさん
2007/03/20(火) 00:15:45手動で戻り値最適化ができる、べつにすごいわけでもない拡張があったけど、
ちょっと前のバージョンで削除されたような覚えがある。
0668デフォルトの名無しさん
2007/03/20(火) 00:40:59(内製Copy-On-Write)なんてことをしていたオカン。
0669デフォルトの名無しさん
2007/03/28(水) 15:55:25mapってmergeできないんですか?
0670デフォルトの名無しさん
2007/03/28(水) 17:35:470671デフォルトの名無しさん
2007/03/28(水) 19:51:17コンパイルエラーになってしまうのですが。
0672デフォルトの名無しさん
2007/03/28(水) 20:00:24「関数の内部」で定義したクラスをファンクタとして使うのは
駄目なのでしょうか?
コンパイルエラーになってしまうのですが。
0673デフォルトの名無しさん
2007/03/28(水) 20:03:09例外は式テンプレートだけといっても良かったはず。
0674デフォルトの名無しさん
2007/03/28(水) 20:27:38ローカル関数として使えるんじゃなかったっけ
まぁ良い方法とはいえないけど…
0675デフォルトの名無しさん
2007/03/28(水) 20:32:57{
struct FuncA {
int operator ()(const char* p) const
{ return p[0]; }
};
struct FuncB {
int operator ()() const
{ return 0; }
};
return (argc > 1) ? FuncA()(argv[1]) : FuncB()();
}
0676デフォルトの名無しさん
2007/03/28(水) 20:54:16すみません。
ユーザが勝手に使う分には問題ないのですけどfor_eachや
accumulate等の引数として与えた場合が駄目なのです。
STL板だったので伝わるかと思ったのですが言葉足らずでし
た。
for_eachなんかで使うときは近くでファンクタを定義した
方がわかり良いと思ったので関数内でファンクタを定義でき
ないかなあと思ったわけです。
0677デフォルトの名無しさん
2007/03/28(水) 20:59:32テンプレート引数として渡す行為は、これに反して
外に漏れることになるから、できない。
0678デフォルトの名無しさん
2007/03/28(水) 21:05:57std::vector<int> a;
a.push_back(5); a.push_back(6);
struct Opr{ static void op(int i){ printf("%d\n",i);} };
std::for_each( a.begin(), a.end(), &Opr::op );
}
あれ。通った。
0679デフォルトの名無しさん
2007/03/28(水) 21:06:51ありがとうございます。仕様のようですね。
ローカルクラスという言葉を知っていたらネットで見つかったのにと
思います。実際見つかりました。
>>674 さんありがとうございました。
面倒かけました皆様。
0680デフォルトの名無しさん
2007/03/29(木) 00:00:170681デフォルトの名無しさん
2007/03/29(木) 00:16:02Google、C++開発者のための4つのライブラリを公開
http://codezine.jp/a/article/aid/1172.aspx
0682デフォルトの名無しさん
2007/03/29(木) 01:09:530683デフォルトの名無しさん
2007/03/29(木) 19:33:54pthread_createでスレッドを生成して
そのスレッドの中で指定秒数SLEEPしてから
あるコールバック関数を呼ぶみたいな
タイマー処理するようなクラスを作って
コールバック関数で
std:string test = "";
test = test + "1";
stringを使用して文字編集を行った後
再度↑のクラスの処理を実行して
ぐるぐる処理するような事したんですけど
4096回目のコールバック関数の中でアボートするんですけど
原因なんでしょ?
↓しかも落ちる箇所ここ
test = test + "1";
0684デフォルトの名無しさん
2007/03/29(木) 20:40:26Thread->Timer->Callback->TImer->Callback...という呼び出し履歴になっていて、
単純にスタックが溢れた、という話ではないのか?
0685デフォルトの名無しさん
2007/03/30(金) 11:39:48全ソースが目の前にある君を差し置いて
たったそんだけの情報でデバッグできるほどのエスパーは
ここにはいませんよ。
つか、せめて test += "1" くらいにしとこうや。
0686デフォルトの名無しさん
2007/03/30(金) 11:47:23>std:string test = "";
>test = test + "1";
ホントにこんなシンプルなコード?
他のスレッドからもその変数をいじってるんじゃない?
0687デフォルトの名無しさん
2007/03/30(金) 13:24:49std::stringのtypoだよな?
つか、このコード、これだけだと
std::string test = "1";
と同じなのだが。
0688デフォルトの名無しさん
2007/03/30(金) 14:49:53std::string test = "";
// 他スレッドからバリバリ呼ばれるよ
void hoge()
{
test = test + "1";
}
というイヤな予感。
0689デフォルトの名無しさん
2007/03/30(金) 14:53:08実装依存?
0690デフォルトの名無しさん
2007/03/30(金) 15:03:490691デフォルトの名無しさん
2007/03/30(金) 15:25:34こんな低レベルの処理をいちいちスレッドセーフにしてたら
遅くて使い物にならない(使いたくない代物になる)と思うよ。
0692デフォルトの名無しさん
2007/03/30(金) 17:51:24そもそも標準C++の範囲にスレッドという概念がないから保証とかはまったくない
0693デフォルトの名無しさん
2007/03/30(金) 18:09:12java.utilのCollectionsだと、デフォは同期制御なしで、
同期制御つきのラッパーを別途提供という形だよな。
そういうのあると便利じゃないかと思うんだけど。
std::stringやSTLコンテナクラスは継承を前提にしていないから同じ手法は
使えないが、その辺はテンプレートパラメタによるポリシーの指定などで
どうにかできんものか。
0694デフォルトの名無しさん
2007/03/30(金) 18:17:53できる、けどやってない。そういうポリシーなんだと思うよ。よく知らないけど。
0695デフォルトの名無しさん
2007/03/30(金) 19:59:14http://pc11.2ch.net/test/read.cgi/tech/1158991211/933
こんなのがあるってさ
0696デフォルトの名無しさん
2007/04/03(火) 23:52:36そのスレ落ちそうなのでこっちで質問ですが、boost::spiritの練習で
URLをパースしようとしてます。
uri = scheme >> ': >> !("//" >> netloc) >> path >> !('?' >> qstring) >> !('#' >> fragment);
netloc = (
(username >> !(':' >> password) >> '@' >> host) |
(host)[bind(&uriparse::clear_auth, &me, _1, _2)]
) >> !(':' >> port);
scheme = (+(alnum_p|'-'|'_'))[assign(me.data.scheme)];
username = (+(alnum_p|'-'|'_'|'.'))[assign(me.data.username)];
password = (*(graph_p - '@'))[assign(me.data.password)];
(改行多いといわれたので以下の同様の行は省略)
こんなコードなんですが、動くものの気に入らない点があって、
http://hogehoge:9999
というURLを処理すると上の定義では
http://username:password@host:port/
http://host:port/
の区別が先に行くまでできないため、me.data.username/passwordまで
セットされてしまうのです。
やむなくバックトラックして戻ってきたところでクリア関数を呼んでるのですが、
もっとエレガントに後処理なしで一発で処理できるような定義にできないでしょうか?
0697デフォルトの名無しさん
2007/04/04(水) 00:17:51クロージャ使ってnetlocのセマンティックアクションでmeとやらに入れろ。
0698デフォルトの名無しさん
2007/04/04(水) 00:46:19すみません、移動します。(ただ、netlocでだとどっちにマッチしたか判らないのでは)
0699デフォルトの名無しさん
2007/04/15(日) 10:43:37OSはFC5、コンパイラはgcc4.0です。
0700デフォルトの名無しさん
2007/04/16(月) 11:39:09どうしてもvalarrayでsseを使いたいなら自分で実装するしかナインジャマイカ。
0701デフォルトの名無しさん
2007/04/28(土) 21:56:05順番に移動して調べるしか方法がないと思ってるけど、その通りか。
0702デフォルトの名無しさん
2007/04/28(土) 21:59:250703デフォルトの名無しさん
2007/04/28(土) 22:03:320704デフォルトの名無しさん
2007/04/28(土) 22:07:22その反復子がstd::vectorのあるインスタンスの反復子であると知っている場合、
std::vectorの反復子は、ランダムアクセスイテレータなので、減算演算子が使用可能。
std::vector<int> v(8);
std::vector<int>::iterator it = v.begin() + 5;
このときit - v.begin() == 5となる。
0705デフォルトの名無しさん
2007/04/28(土) 22:08:000706デフォルトの名無しさん
2007/04/28(土) 22:25:500707デフォルトの名無しさん
2007/04/28(土) 22:28:170708デフォルトの名無しさん
2007/04/28(土) 22:32:35そうだよ。
>>707
それは実装の話。
0709デフォルトの名無しさん
2007/05/20(日) 09:23:11配列からvectorに変えたらdata type mixedで並列化されなくなってしまいました。
valarrayでは大丈夫なのですが
0710デフォルトの名無しさん
2007/05/20(日) 17:34:010711デフォルトの名無しさん
2007/05/21(月) 00:07:270712デフォルトの名無しさん
2007/05/23(水) 02:04:380713デフォルトの名無しさん
2007/05/23(水) 10:46:410714デフォルトの名無しさん
2007/05/23(水) 11:58:110715デフォルトの名無しさん
2007/05/23(水) 19:40:47例えばどんな物がポリシーに出来ますん?
馬鹿だから応用の仕方がイマイチわからに。
0716デフォルトの名無しさん
2007/05/23(水) 20:03:130717デフォルトの名無しさん
2007/05/25(金) 04:47:16ああそっか。本にもスレッドのポリシー書いてありましたわ。
なるほど。
0718デフォルトの名無しさん
2007/05/26(土) 02:13:47のような2次元配列のコンテナにアルゴリズムを適用するとき、
forを使わずに書く方法はありますか?
forを使うと、可読性が落ちるような気がするので。
たとえば、
for_each( vec.begin(), vec.end(), ... );
で、vecのすべての要素に0を代入したりとか。
forで書くと、
for( int i=0; i < vec.size(); ++i ) {
for( int j=0; j < vec[i].size(); ++j ) {
vec[i][j] = 0;
}
}
のような感じのを書きたいんですが。
なければあきらめてforで書きます。
0719デフォルトの名無しさん
2007/05/26(土) 02:37:29#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/foreach.hpp>
int main()
{
std::vector<std::vector<int> > vec(10, std::vector<int>(10));
BOOST_FOREACH(std::vector<int>& row, vec)
BOOST_FOREACH(int& i, row)
i = 999;
BOOST_FOREACH(std::vector<int>& row, vec)
BOOST_FOREACH(int& i, row)
std::cout << i << ' ';
}
0720デフォルトの名無しさん
2007/05/26(土) 02:42:070721デフォルトの名無しさん
2007/05/26(土) 02:46:02レスありがとうございます。
それでやってみます。
0722デフォルトの名無しさん
2007/05/26(土) 04:06:36boostを使わなくても、std::fillする関数用意してstd::for_eachで回せばいいんでない?
0723デフォルトの名無しさん
2007/05/26(土) 04:15:37いいけどsize()で要素数を調べないといけないよ
0724722
2007/05/26(土) 04:42:200725デフォルトの名無しさん
2007/05/26(土) 04:51:18template <class T>
struct Fill {
void operator()(std::vector<T>& v) {
std::fill(v.begin(), v.end(), 0);
}
};
int main()
{
std::vector<std::vector<int> > vec(10, std::vector<int>(10));
std::for_each(vec.begin(), vec.end(), Fill<int>());
}
0726デフォルトの名無しさん
2007/05/26(土) 05:33:53#include <iostream>
#include <vector>
#include <algorithm>
template <class T>
struct Fill {
Fill(T i) : j(i) {}
void operator()(std::vector<T>& v) {
std::fill(v.begin(), v.end(), j);
}
private:
T j;
};
int main()
{
std::vector<std::vector<int> > vec(10000, std::vector<int>(18000));
std::for_each(vec.begin(), vec.end(), Fill<int>(0));
}
0727デフォルトの名無しさん
2007/05/26(土) 09:55:220728デフォルトの名無しさん
2007/05/26(土) 10:18:350729デフォルトの名無しさん
2007/05/26(土) 11:42:360730デフォルトの名無しさん
2007/05/26(土) 13:25:43この程度の処理にわざわざ関数オブジェクト定義したくねぇよ
というパターン
0731デフォルトの名無しさん
2007/05/26(土) 13:27:230732デフォルトの名無しさん
2007/05/26(土) 14:00:42using boost::begin;
using boost::end;
std::vector<std::vector<int> > vv;
std::for_each(vv.begin(), vv.end(),
bind(fill(), bind(begin, _1), bind(end, _1), constant(0)));
0733デフォルトの名無しさん
2007/05/26(土) 14:20:54うー意味がわからない
でもサンクス
0734デフォルトの名無しさん
2007/05/26(土) 15:50:200735デフォルトの名無しさん
2007/05/26(土) 16:01:32boost::range
0736デフォルトの名無しさん
2007/05/26(土) 16:16:36#include <vector>
#include <algorithm>
#include <boost\bind.hpp>
#include <boost\range.hpp>
#include <boost\lambda\lambda.hpp>
int main() {
using namespace boost::lambda;
using boost::bind;
using boost::begin; using boost::end;
std::vector<std::vector<int> > vv(10);
std::for_each(
vv.begin(), vv.end(),
boost::bind(
std::fill
,bind(boost::begin, _1)
,bind(boost::end, _1)
,constant(0)
)
);
return 0
}
0737デフォルトの名無しさん
2007/05/26(土) 16:42:52たぶんbindが<boost/bind.hpp>のboost::bindと
<boost/lambda/bind.hpp>のboost::lambda::bindの2つあるせい。
名前空間を指定してやらないといけない。
でもそれを直したところで、うちのVC++8ではコンパイルできなかったけどな。
0738デフォルトの名無しさん
2007/05/26(土) 16:48:450739デフォルトの名無しさん
2007/05/26(土) 17:05:40それではどれを選んでいいのかわからず曖昧だからというのがコンパイルできない理由のはず。
これはコンパイルできた。しかし、static_castを外すとコンパイルエラーになる。
#include <vector>
#include <boost/bind.hpp>
#include <boost/range.hpp>
#include <boost/ref.hpp>
#include <boost/range_ex/algorithm.hpp>
int main() {
std::vector<std::vector<int> > vv(10);
boost::for_each(
vv,
boost::bind(
static_cast<void (*)(std::vector<int>&, const int&)>(boost::fill),
_1,
boost::cref(0)));
return 0;
}
0740デフォルトの名無しさん
2007/05/26(土) 20:28:23でもわざわざ面倒な書式にしてあるstatic_castや、
非標準のboost使う羽目になるから、素直にublasやFOREACHマクロ使った方がいいって事なのかな
lambdaが有効に使えると思ってたが残念な結果だぜ
0741デフォルトの名無しさん
2007/05/26(土) 20:59:240742デフォルトの名無しさん
2007/05/27(日) 00:06:18意味不明のコンパイルエラーを
追っている時間が無駄
0743デフォルトの名無しさん
2007/05/27(日) 00:17:200744デフォルトの名無しさん
2007/05/27(日) 00:43:120745デフォルトの名無しさん
2007/05/27(日) 12:26:39無限ループにはできない
0746デフォルトの名無しさん
2007/05/27(日) 13:10:53事実上無限ループと変わらないとおもうけど
0747デフォルトの名無しさん
2007/05/27(日) 15:04:59無限にループする処理系がないということではない気がする
0748デフォルトの名無しさん
2007/05/27(日) 15:21:350749デフォルトの名無しさん
2007/05/27(日) 15:43:39この話か
試しにVC8でコンパイルしたらマジ終わらないw
0750デフォルトの名無しさん
2007/05/27(日) 16:00:550751デフォルトの名無しさん
2007/05/27(日) 17:05:230752デフォルトの名無しさん
2007/05/28(月) 00:34:460753デフォルトの名無しさん
2007/05/28(月) 00:45:09これは寧ろ、(コンパイラの)ランタイムと考えるべきだと思う。
0754デフォルトの名無しさん
2007/05/28(月) 02:45:05ちなみに、ublasだとどう書くんだ?
0755デフォルトの名無しさん
2007/05/29(火) 00:18:55matrix<T> mat(m,n);
std::fill(mat.data().begin(),mat.data().end(),T(0));
0756デフォルトの名無しさん
2007/05/29(火) 01:40:31今までの議論は何だったんだ
0757デフォルトの名無しさん
2007/05/29(火) 03:11:03#include <boost/numeric/ublas/matrix.hpp>
#include <algorithm>
#include <iostream>
static void out(int i) {
std::cout << i << ' ';
}
int main() {
using boost::numeric::ublas::matrix;
int m=2, n=2;
matrix<int> mat(m,n);
std::fill(mat.data().begin(), mat.data().begin(), int(0));
std::for_each(mat.data().begin(), mat.data().end(), out);
return 0;
}
0758デフォルトの名無しさん
2007/05/29(火) 11:03:080759デフォルトの名無しさん
2007/05/29(火) 12:38:180760デフォルトの名無しさん
2007/05/29(火) 18:54:160761デフォルトの名無しさん
2007/05/29(火) 19:37:420762デフォルトの名無しさん
2007/05/29(火) 19:40:15実際は同じだしな
0763デフォルトの名無しさん
2007/05/29(火) 19:49:110764デフォルトの名無しさん
2007/05/29(火) 22:24:54下部構造を忠実に反映してるだけだろう。
端末やパイプに対してもfseek()は呼べる。実際にはシークできなくとも。
そして、ディスクリプタ(や何か)がシーク可能かどうかを調べる
移植性の高い方法も存在しない。
要は、「飛べる。が、実際に飛ぼうとするとエラーになる」状態なわけで、
現状はそれを忠実に反映したデザイン。
クラスを分けるということは「飛べない」ようにすること。
0765デフォルトの名無しさん
2007/06/07(木) 10:58:150766デフォルトの名無しさん
2007/06/07(木) 11:18:52キューのサイズを固定した片方向キューを作る
0767デフォルトの名無しさん
2007/06/07(木) 11:30:00必要なインターフェースの為の窓口クラスを作って終了
0768デフォルトの名無しさん
2007/06/07(木) 11:41:090769デフォルトの名無しさん
2007/06/07(木) 11:51:52やっぱそういうことせずにそのまま使えってことですか?
0770デフォルトの名無しさん
2007/06/07(木) 12:39:030771デフォルトの名無しさん
2007/06/07(木) 21:33:24バカが出てきて再開
と、空目した。
0772デフォルトの名無しさん
2007/06/09(土) 04:22:320773デフォルトの名無しさん
2007/06/15(金) 20:51:18Ctrl + Zを入力するまで無限ループするにはどうしたらよいでしょうか?
while( cin.get() != EOF ) {
0774773
2007/06/15(金) 20:53:06while( cin.get() != EOF ) {
}
にすると、いちいち何か入力しなければ、ループが回らないのです。
ループを回しつつ、EOF待ちにするにはどのようにかけばよいでしょうか?
0775デフォルトの名無しさん
2007/06/15(金) 21:10:000776デフォルトの名無しさん
2007/06/15(金) 21:17:510777デフォルトの名無しさん
2007/06/15(金) 23:34:430778デフォルトの名無しさん
2007/06/16(土) 01:15:510779デフォルトの名無しさん
2007/06/16(土) 12:29:45v[i]とv.at(i)どっち使ってますか?
0780デフォルトの名無しさん
2007/06/16(土) 12:41:460781デフォルトの名無しさん
2007/06/16(土) 12:51:11iが正しい位置さしてるとわかってる場合は[]でいいですよね、、、
0782デフォルトの名無しさん
2007/06/16(土) 13:37:280783デフォルトの名無しさん
2007/06/16(土) 14:25:05何か裏の理由でもあるのかな、、、と思いまして。。。
すみません。at て[]よりも遅いような気がするんですが。。。
0784デフォルトの名無しさん
2007/06/16(土) 14:41:44ま、at()の方が速いってことはないのは間違いないな。
0785デフォルトの名無しさん
2007/06/16(土) 14:44:27例外キャッチしないで使ってるなら、上司が無知なだけ
0786デフォルトの名無しさん
2007/06/16(土) 14:55:460787デフォルトの名無しさん
2007/06/19(火) 21:05:42class Hoge{
int a;
}
というクラスがあって、そのリストstd::list<Hoge>を作って、
そのイテレータstd::list<Hoge>::iterator it
を用意しました。
このときメンバaにアクセスするとき、
it->a と (*it).a は同じですか?
(*it).aに代入してもaは変更されますか?
0788デフォルトの名無しさん
2007/06/19(火) 21:07:440789デフォルトの名無しさん
2007/06/20(水) 00:40:11そうか?
value_type operator [] ( const size_t idx )
{
return at( idx );
}
だったら、上司にあやまれ。
0790デフォルトの名無しさん
2007/06/20(水) 00:43:05std::vector::at(..) ってthrowするの?
java.util.Vectorと勘違いしてないか?
0791デフォルトの名無しさん
2007/06/20(水) 00:44:33...
0792デフォルトの名無しさん
2007/06/20(水) 00:47:080793デフォルトの名無しさん
2007/06/20(水) 00:47:400794デフォルトの名無しさん
2007/06/20(水) 01:01:080795デフォルトの名無しさん
2007/06/20(水) 01:06:32無能な上司乙
0796デフォルトの名無しさん
2007/06/20(水) 01:14:250797デフォルトの名無しさん
2007/06/20(水) 01:52:53ポインタを使う時に [ ] が少し使いにくいという点があるから、
範囲チェック無かったとしても使い道がないわけでもないかな。
0798デフォルトの名無しさん
2007/06/20(水) 02:35:020799デフォルトの名無しさん
2007/06/20(水) 02:58:55エスパー魔美
0800デフォルトの名無しさん
2007/06/20(水) 03:01:550801デフォルトの名無しさん
2007/06/20(水) 07:54:31そんな仕様と違う実装なわけねーだろ低脳が。
0802デフォルトの名無しさん
2007/06/20(水) 10:03:360803デフォルトの名無しさん
2007/06/20(水) 10:13:07わっふるわっふる
0804デフォルトの名無しさん
2007/06/21(木) 06:02:08家族に愛想尽かされたんだ、察してやれよ。
0805デフォルトの名無しさん
2007/06/21(木) 06:24:20802よ!俺で良かったらいつでも相談に乗るよ!
結婚したこと無いけど。
0806デフォルトの名無しさん
2007/06/21(木) 13:26:12それで例外投げられちゃうのか…
0807デフォルトの名無しさん
2007/06/21(木) 16:32:380808デフォルトの名無しさん
2007/06/21(木) 18:24:26ともったら、substrだった
0809デフォルトの名無しさん
2007/06/23(土) 15:02:15mapでは [] 演算子を使って値を変更できましたが
[] 演算子の使用が出来ない multimapで値の変更をする方法が分かりません。
ご存知の方いらっしゃいますか?
0810デフォルトの名無しさん
2007/06/23(土) 15:11:24find()→erase()→insert()の順で入れ直す。
というのはstd::multimapは同じキーで値が異なる要素が存在する
可能性があるので、当該のキーを削除してから改めて挿入しなおさ
ないと正しく処理できないから。
0811デフォルトの名無しさん
2007/06/23(土) 15:14:43なお、erase()した場合はその反復子が無効になるため、insert()した後
改めてfind_if()して、該当する要素が見つからなくなるまでループする
必要がある。
0812デフォルトの名無しさん
2007/06/23(土) 15:19:47なるほど。重複の可能性から1度きりの入れ直しだけでは不十分なんですね。
ありがとうございます。参考になりました。
0813デフォルトの名無しさん
2007/06/23(土) 15:48:01出し入れが必要なのは set, multiset じゃないの?
map, multimap なら fin(), find_if() して出てきたイテレータの
second をいじれば値の変更はできるはず。
0814デフォルトの名無しさん
2007/06/23(土) 16:12:19試してみたところ、イテレータの second に代入して変更できました。
0815デフォルトの名無しさん
2007/06/23(土) 16:18:20#pragma warning ( disable: 4786 )
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> gv_szFileName;
void sub( char *filename )
{
WIN32_FIND_DATA data;
HANDLE h;
h = FindFirstFile( filename, &data );
gv_szFileName.push_back( data.cFileName );
if( h != NULL )
{
while( FindNextFile(h, &data) ){
gv_szFileName.push_back( data.cFileName );
}
}
FindClose(h);
}
0816デフォルトの名無しさん
2007/06/23(土) 16:20:06{
int i;
for( i=0; i<gv_szFileName.size(); i++ )
cout << gv_szFileName.at(i) << endl; // ここでエラーが発生する
}
void main()
{
sub( "c:\\*" );
sub2();
}
俺のノートPCだとアクセス違反が発生する
なぜだろう・・・
0817デフォルトの名無しさん
2007/06/23(土) 16:28:36FindFirstFile() が失敗してんじゃね?
エラーチェックは INVALID_HANDLE_VALUE で。
失敗したときは FindClose() しない。
vector の問題だと思うんなら Windows API 使わずに
問題を再現させるんだな。
0818デフォルトの名無しさん
2007/06/23(土) 16:42:17for( i=0; gv_szFileName.size(); i++ )
のループで i == 15 の時ループに入っている
vector の問題かな 再インストールするしかないかのかな
0819デフォルトの名無しさん
2007/06/23(土) 17:06:59i < gv_szFileName.size();ではないのか
0820デフォルトの名無しさん
2007/06/23(土) 19:41:27連想コンテナであるstd::mapに
std::find_ifを使うのは
効率が悪いからナンセンスと思っていたが
別に何か俺の知らない理由があるのか?
0821デフォルトの名無しさん
2007/06/23(土) 20:26:19std::multimapの話でそ
0822デフォルトの名無しさん
2007/06/23(土) 20:38:150823デフォルトの名無しさん
2007/06/23(土) 21:02:11で確保した vector の中身の先頭へのポインタって、
C のサブルーチンに &v[0] で渡してもおk?
vector<int> の内部表現ってメモリ上でも連続している
ってことが保証されているんだっけ?
どうしても C で書かれたライブラリに渡さなければならないことがあって・・・
0824デフォルトの名無しさん
2007/06/23(土) 21:05:38保証されてる
0825デフォルトの名無しさん
2007/06/23(土) 21:15:06やっぱ普段から C++ つかってても、STL の仕様とかちゃんと
読まなきゃだめだね。STL に関しては特に
「ほかのソースでこれやってるからできるんだろうな」
って感じで使ってきたから、だめだめだわ、俺。
0826デフォルトの名無しさん
2007/06/24(日) 11:25:55そのままポインタだけ引っ張り出しても、何の事かワケわかめだろうな。
しかも¥0で終端なんてしてないし。
ちゃんとC用の文字列として取り出せる方法があったはず。
0827デフォルトの名無しさん
2007/06/24(日) 11:43:01std::stringの実装のハナシ?
c_str()?
0828デフォルトの名無しさん
2007/06/24(日) 18:37:240829デフォルトの名無しさん
2007/06/25(月) 00:45:06>そのままポインタだけ引っ張り出しても、何の事かワケわかめだろうな。
恐らく単なる勘違いか SGI STL の rope の話だと思われ。
次の規格では string も連続性が保証されるようになる予定だし。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530
>しかも¥0で終端なんてしてないし。
>ちゃんとC用の文字列として取り出せる方法があったはず。
こっちは c_str() の話で通用する。
0830デフォルトの名無しさん
2007/06/25(月) 02:39:28汎用のコンテナ用出力関数を作ろうと思い、コンテナを引数に受けるテンプレート関数を作りました。
ここまではOKなんですが、コンテナのイテレータを作ろうとするとエラーになってしまいます。
何か特別な方法とかがあるのでしょうか?
template <typename X>
void output(const X& rContainer){
X::iterator iter; // ここでコンパイルエラー
}
0831デフォルトの名無しさん
2007/06/25(月) 02:45:23typename X::iterator iter;
とか
0832デフォルトの名無しさん
2007/06/25(月) 02:45:490833デフォルトの名無しさん
2007/06/25(月) 02:49:02おおお…God。
無事にコンパイル通りました。ありがとうございました。
0834デフォルトの名無しさん
2007/06/25(月) 10:27:53std::以前の問題だ
0835デフォルトの名無しさん
2007/06/25(月) 11:50:59昔 VC++ でエラーになって
何じゃそりゃと思った記憶があるんだけど、
今でもそうなの?
0836デフォルトの名無しさん
2007/06/25(月) 11:57:59VC6.0は1998年以前に出ているから偽標準コンパイラ
2003→2005と進むにつれて準拠度は大幅に上がっている
特に2003ではほとんど標準に準拠した
0837デフォルトの名無しさん
2007/06/25(月) 12:05:36クラステンプレートのメンバ関数テンプレートの実装も
未だにクラステンプレート宣言内じゃないとできなかったり、
満を持して登場と思ったのにこりゃひどいと思った記憶が。
static const int メンバ定数の直接初期化には対応してたけど。
この typename は 2003 からは対応してるっつーことでいいの?
0838デフォルトの名無しさん
2007/06/25(月) 12:16:10それに2003は驚く事にtypenameが本来必要な場所で省略できたりした
まあコンパイラを賢くすればできない事もないらしいがエラー吐いてくれない
のには時々困った
C++0xでこの辺は煮詰められる模様
0839デフォルトの名無しさん
2007/06/25(月) 12:19:42環境によって有無を切り替えられるように。
0840デフォルトの名無しさん
2007/06/25(月) 13:54:21ただ、IDEが時々固まっちゃったりするのは Vista のせいか・・・
XP マンセー
0841デフォルトの名無しさん
2007/06/25(月) 14:09:562005で大分賢くなった気がする
0842デフォルトの名無しさん
2007/06/25(月) 15:09:520843デフォルトの名無しさん
2007/06/28(木) 13:39:11numerical_limits<double>::min()よりも小さい値をoperator >>で読めないものでしょうか?
数値解析した結果をcout << や printf等で出力すると、e-320等とIEEE754倍精度の範囲外の出力が出ることがあります。
実際、
cout << numeric_limits<double>::min()/100;
等とすると、なぜか正常な数値が出てきます。
ところが、このようなIEEE754倍精度を越えた数値を、operator >> で doubleの変数に読みこもうとするとエラーが出ます。
ストリームも先に進んでいないので、エラーが出たら0にする、みたいな手法も通じません。
マニピュレータか何かでこれを回避できないでしょうか?
今の所、scanf (これだとなぜか読める)で読み込んでますが。。。
0844843
2007/06/28(木) 13:42:10読めませんね。
怪しい数値を出力はするくせに読めないとは。。。とほほ.
0845デフォルトの名無しさん
2007/06/28(木) 16:46:04計算途中の値はメモリ上にあるというのはわかるよな?
現在のいくつかの処理系では浮動小数点数はメモリ上で拡張倍精度浮動小数として計算される。
拡張倍精度浮動小数は、当然double(倍精度)よりも精度は高い。
だからこの場合のようにdoubleの範囲外の出力がなされることもあるわけだ。
ただしこれはメモリ上限定の話で、変数に格納される場合は当然ながらdouble値として格納される。
ゆえに出力がdoubleの範囲外になることはあっても、その精度のまま変数に格納は出来ないわけだ。
そこらへんのことは、詳しくはここに書いてある。
http://hw001.gate01.com/eggplant/tcf/cpp/floatprecision.html
0846デフォルトの名無しさん
2007/06/28(木) 17:02:460847デフォルトの名無しさん
2007/06/28(木) 17:14:20http://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/general/21_3.htm#2132
そうだとすれば、843で結果が正しく出力されているように見えるのは、
非正規化数になっているだけということが考えられる。
0848843
2007/06/29(金) 01:59:00843の例はlong doubleとして出力されたみたい。
しかし謎なのは、最初につまづいたデータはdouble配列をsprintfで書き出した物なんだよね。
レジスタで拡張というわけでもないのに、それにe-320なんてのが混じってる。
8087系のコプロが80bitなのは知ってるが、指数部の桁は64bitと一緒だから、仮にそうであってもこういう値はでないはずなのだが…
0849デフォルトの名無しさん
2007/07/03(火) 22:33:51出力の進数は?
0850デフォルトの名無しさん
2007/07/04(水) 01:41:0410進数、というより実数。
%e
0851デフォルトの名無しさん
2007/07/04(水) 05:44:00処理系にもよるが long double と double の精度は同じだったと思うが。
0852デフォルトの名無しさん
2007/07/04(水) 08:41:24それを書くなら「処理系にもよるがlong doubleとdoubleの精度は違うと思うが。」
だろ。同じなのはMS系のC/C++だけじゃないの?Borlandもgccも違うぞ。
0853デフォルトの名無しさん
2007/07/04(水) 13:13:50処理系によって、long double と double の精度は
同じだったり違ったりする、だな。
0854843
2007/07/04(水) 13:23:30取扱可能範囲を越えた数値を入力した際に簡単にリカバリーしたい。
アンダーフローかオーバーフローかとかエラーの内容がわかって、
その後簡単にトークンを読み捨てられたらいいわけで。
0855デフォルトの名無しさん
2007/07/04(水) 14:01:05そこで cin.clear(); cin >> str; で文字列1つ読み捨てれば?
1.0e-350-1.0e+20 とかの時に全部読み捨てられるのが困るなら
もうちょっと凝る必要があるけど。
double の精度より小さい値が出るのは、
2進ダンプしてみたところ、
どうも Intel 系 CPU は指数部が 0 の場合も可能になってるからっぽいな。
0856デフォルトの名無しさん
2007/07/04(水) 14:03:02非正規化数ってやつみたいだ。
ちゃんとした IEEE の仕様みたい。
0857843
2007/07/04(水) 15:50:06なるほどね。
実際の演算、出力には非正規化数として小さい値を認めていると。
にも関らず、入力ではハネる…首尾一貫してねーなw。
入力でも非正規化数を扱えるようにしておくべきだろ、常識的に考えて...
0858デフォルトの名無しさん
2007/07/04(水) 15:55:21どこまで入力できるようにするかは、処理系依存っぽい。
0859843
2007/07/04(水) 15:57:060860デフォルトの名無しさん
2007/07/04(水) 15:59:190861デフォルトの名無しさん
2007/07/04(水) 17:09:52入力はできなくて例外が発生する。不便だなぁ、と思う。
0862デフォルトの名無しさん
2007/07/04(水) 19:02:49mingw だと Windows の libc を使うだろ
0864デフォルトの名無しさん
2007/07/06(金) 18:35:500865デフォルトの名無しさん
2007/07/08(日) 04:37:03iterator itat(size_type t)
{
return (iterator(_Myfirst + t, this));
}
とか一々書いているんですが、実はこんな事しなくても済む方法ってありますか?
0866デフォルトの名無しさん
2007/07/08(日) 04:54:32_Myfirstて…
そんなのどこに書いてるんだ?まさか<vector>の中の定義に直接?
0867デフォルトの名無しさん
2007/07/08(日) 04:57:10何か俺変な事書いた?
0868デフォルトの名無しさん
2007/07/08(日) 05:27:44内部向けのメンバなんて普通は使えない場所にあるはず。
0869デフォルトの名無しさん
2007/07/08(日) 05:39:310870デフォルトの名無しさん
2007/07/08(日) 06:24:17vector<int> v;
//...
vector<int>::iterator itr = v.begin() + t ;
じゃだめなの?
0871デフォルトの名無しさん
2007/07/08(日) 06:26:210872デフォルトの名無しさん
2007/07/08(日) 08:36:110873デフォルトの名無しさん
2007/07/08(日) 09:10:350874デフォルトの名無しさん
2007/07/08(日) 13:44:190875デフォルトの名無しさん
2007/07/08(日) 15:18:10まあメンバ関数1個増やしただけだが
0876デフォルトの名無しさん
2007/07/08(日) 15:22:17vectorってデストラクタがvirtualじゃないからis-a継承すべきじゃないし。
0877デフォルトの名無しさん
2007/07/08(日) 16:22:12一応大丈夫ではある。
0878デフォルトの名無しさん
2007/07/08(日) 16:45:54いやー vector にアップキャストして delete したら未定義動作になるみたいだぜ。
5.3.5p3
"if the static type of the operand is different from its dynamic type, the
static type shall be a base class of the operand’s dynamic type and the
static type shall have a virtual destructor or the behavior is undefined."
0879デフォルトの名無しさん
2007/07/08(日) 17:06:46でも元々の用件は870で事足りるがな。
0880デフォルトの名無しさん
2007/07/08(日) 17:08:270881デフォルトの名無しさん
2007/07/08(日) 17:30:220882デフォルトの名無しさん
2007/07/08(日) 17:32:460883デフォルトの名無しさん
2007/07/08(日) 17:35:31>>880
0884デフォルトの名無しさん
2007/07/08(日) 17:36:24だから問題ない。
0885デフォルトの名無しさん
2007/07/08(日) 17:38:43コンテナかイテレータを受け取るテンプレート関数つくればいいだろ。
一部ではメンバ関数でなく外部に分離するのが推奨されてるらしいし。
0886デフォルトの名無しさん
2007/07/08(日) 17:49:01それで vector が new されるとでも思ってるの?
そんなことは決まってないし、たぶんそんな実装は存在しない。
0887デフォルトの名無しさん
2007/07/08(日) 18:02:17マテ
0888デフォルトの名無しさん
2007/07/08(日) 18:07:090889デフォルトの名無しさん
2007/07/08(日) 18:08:110890デフォルトの名無しさん
2007/07/08(日) 18:09:43vector派生クラスのオブジェクトを追加しようとしたら、
スライシングが起こるだろうけど、それは別問題だな。
0891デフォルトの名無しさん
2007/07/08(日) 19:37:07じゃあ例えばさ、windows.h の RECT 構造体を継承した CRect クラスをつくるのもNG?
でも MFC ってそんなことしてなかったっけ
問題の起きうる使い方をしなければOKなのかな
0892デフォルトの名無しさん
2007/07/08(日) 19:46:400893デフォルトの名無しさん
2007/07/08(日) 19:51:26MFCはよく知らないが、これはpublic継承ならば明らかにNG。
基本的に仮想デストラクタを持たないクラスはpublic継承してはならない。
0894デフォルトの名無しさん
2007/07/08(日) 20:00:540895デフォルトの名無しさん
2007/07/08(日) 20:07:15CRect を new して RECT* で delete しなければ問題ない。
0896デフォルトの名無しさん
2007/07/08(日) 20:07:47typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
リソース開放なんてないから、public継承してもいいだろ
0897デフォルトの名無しさん
2007/07/08(日) 20:09:200898デフォルトの名無しさん
2007/07/08(日) 20:18:480899983
2007/07/08(日) 20:24:03さっき言ったようにMFCはよく知らないが、MFCでpublic継承を使っているとしたら明らかに多態のためだろ?
それなのに仮想デストラクタにしていないはずがない。
仮にそうなっていないとしたら確かに基本的どころか糞だな。
0900デフォルトの名無しさん
2007/07/08(日) 20:37:11RECT は C でも使えるようにしてある構造体だから、仮想デストラクタには「できない」。
RECT を C++ で便利に使いたいがために作られたラッパクラスが CRect だ。
0901デフォルトの名無しさん
2007/07/08(日) 20:43:53みたいなものないのー?
0902デフォルトの名無しさん
2007/07/08(日) 21:09:52>>895
アップキャストしてdeleteしなければ問題ないよ。
0903デフォルトの名無しさん
2007/07/08(日) 21:15:54その CRect を作る人と使う人が同じなら、それでいいんだけどな
0904デフォルトの名無しさん
2007/07/08(日) 21:19:36どうでもいいんだろ。
0906デフォルトの名無しさん
2007/07/08(日) 21:33:31public 継承してるぞ?
0907デフォルトの名無しさん
2007/07/08(日) 21:42:140908デフォルトの名無しさん
2007/07/08(日) 21:46:40> class CRect : public tagRECT
0909デフォルトの名無しさん
2007/07/08(日) 21:53:22CRect でも直接アクセスできるようにしてるんだな。
それでいて、RECT& を引数にとる関数に直接渡せる。
問題になる環境なんて実際存在しないっつーのに仕様に厳密にするよりは、
利便性を優先したっつーことだろう。
0911デフォルトの名無しさん
2007/07/08(日) 22:01:54CRect を作ったときには >>878 のような明文化されたルールがなかった可能性も高い。
0912デフォルトの名無しさん
2007/07/08(日) 22:03:03リソースの無駄か
0913デフォルトの名無しさん
2007/07/08(日) 22:05:27VC++で動けば問題ないってことだろ
0914デフォルトの名無しさん
2007/07/08(日) 22:20:070915デフォルトの名無しさん
2007/07/08(日) 22:28:04アップキャストして delete することはないが。
0916907
2007/07/08(日) 22:43:340917デフォルトの名無しさん
2007/07/08(日) 23:09:01http://www.koders.com/cpp/fid695B6E3A46910A62245A0FB2CAC93FEF0CAB9BA0.aspx#L171
0919デフォルトの名無しさん
2007/07/16(月) 18:14:54*iter.end() として何らかの操作を施しても合法なのかな?
番兵にしたいだけなんだけど。
0920デフォルトの名無しさん
2007/07/16(月) 18:22:20だめ。end()の逆参照を行った結果は未定義。
0921デフォルトの名無しさん
2007/07/16(月) 18:23:550922デフォルトの名無しさん
2007/07/16(月) 18:49:02たまたま問題ない場合も多いけど未定義は未定義だ。
0923デフォルトの名無しさん
2007/07/16(月) 19:11:31&arr[ elementof(arr) ]はたしか合法だったけど
0924デフォルトの名無しさん
2007/07/16(月) 20:55:45配列の場合添え字が一つ超えた時のアドレスを取るのは合法だが
コンテナでは未定義。あくまでもend()を使うべき。
0925デフォルトの名無しさん
2007/07/16(月) 21:01:230926デフォルトの名無しさん
2007/07/16(月) 21:02:43つうかコンテナの要素をアドレスで考えちゃいかんよ
どういう実装になってるのかわからないんだから
0927デフォルトの名無しさん
2007/07/16(月) 21:03:58VC7ではmemcopy/memsetに渡すと落ちるなぁ
0928デフォルトの名無しさん
2007/07/16(月) 21:07:23nがcapacity未満の時だけ?
それとも任意のn?
size未満が有効なのは確かだよね。そうじゃないとAPIに渡せない
0929デフォルトの名無しさん
2007/07/16(月) 22:47:19std::copyとかfillで問題無しでmemset/memcpyで落ちるから不思議。
シャローコピーとディープコピーの問題じゃないかな。
0930デフォルトの名無しさん
2007/07/16(月) 22:54:360931デフォルトの名無しさん
2007/07/16(月) 22:59:26コピーオンライトみたいな仕掛けがあるんだろうか。
>ベクトルの要素は隣接して格納される。
> v が<T, Allocator>でT がbool以外のの場合 、
>0 <=n<v.size() の時 &v[n] == &v[0] + n となることを意味する
0932デフォルトの名無しさん
2007/07/16(月) 23:03:250933デフォルトの名無しさん
2007/07/16(月) 23:14:440934デフォルトの名無しさん
2007/07/17(火) 00:01:18そっから先に要素は無いんだから、当たり前じゃね?
0935デフォルトの名無しさん
2007/07/17(火) 00:08:10&v[0] は empty チェックを外でやらないといけないのがめんどい
0936デフォルトの名無しさん
2007/07/17(火) 00:10:160937デフォルトの名無しさん
2007/07/17(火) 00:14:210938デフォルトの名無しさん
2007/07/17(火) 00:18:01std::vector::data() を待て。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#464
と思ったら libstdc++ にはもう入ってるな。
0939デフォルトの名無しさん
2007/07/17(火) 01:09:56!!! チェックしてなかったわちょーさんくす「
0940デフォルトの名無しさん
2007/07/17(火) 10:48:33vector<boost> の特殊化を消すって?
特定のクラスを引数に取ったときだけ
クラステンプレートの特殊化を禁止するなんてことできるの?
なんか俺根本的にテンプレートを理解してない?
0941デフォルトの名無しさん
2007/07/17(火) 10:49:53仕様から取り除くって話だと思われ。
0942デフォルトの名無しさん
2007/07/17(火) 10:51:090943デフォルトの名無しさん
2007/07/17(火) 10:52:24そりゃぁ、>940の頭だろ。
0944デフォルトの名無しさん
2007/07/17(火) 11:15:34利用してるプログラムが軒並みアウトになっちまう。
bool と全く同じように扱えるクラス __bool を標準で提供して、
vector<__bool> とできるようにするとかなら可能。
0945デフォルトの名無しさん
2007/07/17(火) 12:43:400946デフォルトの名無しさん
2007/07/17(火) 13:32:370947デフォルトの名無しさん
2007/07/17(火) 13:35:01今まで vector<bool> としてあったところをそれで置換してもらう、
っつー形に強引にすることはできんのかね。
0948デフォルトの名無しさん
2007/07/17(火) 17:53:33切り替えて使っているのですが、sort を使いたくて困りました。
sort も使いたいのでコンパパイル時に切り替えたいのですが;
自前の #define を使ってではなく、その変数が、list か vector かによって
条件コンパイルする方法はないでしょうか?
実行時では、sort 部分がコンパイルエラーになるので間に合いません。
0949デフォルトの名無しさん
2007/07/17(火) 17:58:010950デフォルトの名無しさん
2007/07/17(火) 18:07:44std::advance関数の実装が参考になるよ。
0951デフォルトの名無しさん
2007/07/17(火) 18:24:07両進イテレータならメンバ関数のsortが用意されていることを期待するわけだ。
C++はこういう見えにくいインターフェースを多用するから困る。
0952デフォルトの名無しさん
2007/07/17(火) 18:33:29コンパイル時にどちらを使うか決定してくれる奴があったと思うけど・・・
0953デフォルトの名無しさん
2007/07/17(火) 18:40:01がりがりオーバーロード書いてたよ。
今からリファレンス読み返してくるorz
0954デフォルトの名無しさん
2007/07/17(火) 19:00:36渡されたコンテナにメンバとしてsort()が定義されている場合はそれを使い
定義されていない場合はsortアルゴリズムを使うように定義されてるみたい
というわけでこれを使うのが楽っぽい?
0955デフォルトの名無しさん
2007/07/17(火) 19:25:30そこでコンセプトですよ。
今までただの文書にするしかなかったけど、
今度、言語仕様に組み込まれそうだし。
0956デフォルトの名無しさん
2007/07/17(火) 19:32:47modern C++ design読めってことですかそうですか
0957デフォルトの名無しさん
2007/07/17(火) 20:43:42だから、どちらの場合でも、iterator_category でイテレータの特性を知ることが出来るよ。
0958デフォルトの名無しさん
2007/07/18(水) 01:10:19trait は型について問い合わせるために使える個々の情報。
concept は型が満たすべき条件と意味づけをひとまとめにしたもの。
0959デフォルトの名無しさん
2007/07/18(水) 19:28:11イテレータは別にstd::iteratorを継承する必要はなく、十分条件に過ぎない。
それを継承すれば、その型に対して簡単にiterator_traitsが使用可能になるというだけ。
0960デフォルトの名無しさん
2007/07/18(水) 19:38:240961デフォルトの名無しさん
2007/07/18(水) 20:24:02value_typeやiterator_categoryなどを定義すれば、
iterator_traitsは使える。
iterator_traitsを特殊化するというもっと荒業めいた方法もある。
0962デフォルトの名無しさん
2007/07/19(木) 12:38:51既存のクラスに後からトレイトやらコンセプトやら
情報を書けるから便利だよな。
これぞ再利用。
0963デフォルトの名無しさん
2007/07/20(金) 14:11:58sstreamがどうしたって?
0964デフォルトの名無しさん
2007/07/20(金) 15:03:090965デフォルトの名無しさん
2007/07/20(金) 18:46:030966デフォルトの名無しさん
2007/07/20(金) 21:28:59読み書きするたびにmutex確保するんですよ
無駄なんですよ
なんとかなりませんかね
0967デフォルトの名無しさん
2007/07/20(金) 21:42:43もうシングルスレッドの時代は終わった。
0968デフォルトの名無しさん
2007/07/20(金) 21:50:59streambufを直接いじくれば?
0969デフォルトの名無しさん
2007/07/20(金) 22:15:28できればpolicyやらで制御できてほしかったンですけどネ・・・
0970デフォルトの名無しさん
2007/07/20(金) 23:24:54CRT用に_CRT_DISABLE_PERFCRIT_LOCKSがある。
これはC++ライブラリでも効くのかは知らないけど。
http://msdn2.microsoft.com/ja-jp/library/ms235356(VS.80).aspx
0971デフォルトの名無しさん
2007/07/21(土) 00:52:02host.hがSTLのビルド時に使う途中変更不可の設定で、
user_config.hがSTLを使うプロジェクトによって変更してもいい設定、
という理解で良い?
0972デフォルトの名無しさん
2007/07/21(土) 05:44:30レスありがとうございます。
チェックいたしましたが、iostreamでは参照されていないようです・・・
0973デフォルトの名無しさん
2007/07/22(日) 00:50:50最近のバージョンはそのあたりのビルドがめんどくさくなったが
0974デフォルトの名無しさん
2007/07/23(月) 20:29:06マージしたりマージしたり・・・・
0975デフォルトの名無しさん
2007/07/23(月) 21:05:020976デフォルトの名無しさん
2007/07/23(月) 21:13:300977デフォルトの名無しさん
2007/07/28(土) 15:10:26もだんなんとかって本読むよ
0978デフォルトの名無しさん
2007/07/28(土) 18:14:560979名無しさん@そうだ選挙に行こう
2007/07/29(日) 03:44:16theoretically interesting for some people, but practically useless!
0980名無しさん@そうだ選挙に行こう
2007/07/29(日) 08:17:130981名無しさん@そうだ選挙に行こう
2007/07/29(日) 12:14:04public:
int nNo; //学籍番号
char szName[20]; //生徒名
int nTensu; //テスト点数
}
上記のようなクラスのインスタンスをvectorに格納しておいて
場合によって、ソート条件を変更したいのですが、どのように
すればいいでしょうか?
学籍番号ソート、生徒名ソート、点数ソートなどしたいのですが。
ソートの為の比較演算子だと1パターンしかソート条件を定義できないような
気がして・・。
operator<(const CTest &a)const{
return nTensu < a.nTensu;
}
どなたかご教示の程、お願いしますm(__)m。
0982名無しさん@そうだ選挙に行こう
2007/07/29(日) 12:21:52std::sortに好きな比較関数オブジェクト作って渡せば?
0983名無しさん@そうだ選挙に行こう
2007/07/29(日) 12:26:19素直にやるなら>>982
邪道な方法としてはメンバ変数にソート用のフラグを用意して、
それをもとにoperator<() の中で分岐
フラグはソート前にセットする。
0984名無しさん@そうだ選挙に行こう
2007/07/29(日) 12:30:35邪道というか、単なる下手な方法では。
0985名無しさん@そうだ選挙に行こう
2007/07/29(日) 12:42:000986名無しさん@そうだ選挙に行こう
2007/07/29(日) 13:29:29どうもありがとうございましたm(__)m
レス数が950を超えています。1000を超えると書き込みができなくなります。