STLスレッド part2
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001960
NGNGC++相談室
http://pc.2ch.net/test/read.cgi/tech/1025010364/
Generic Programming with C++ Template
http://pc.2ch.net/test/read.cgi/tech/1008593126/
リンク
STLPort
http://www.stlport.org/
VC++のSTLバグ
http://www.dinkumware.com/vc_fixes.html
ISO/IEC 14882
Programming languages -- C++
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998
http://www.kuzbass.ru/docs/isocpp/
0002デフォルトの名無しさん
NGNG0004960
NGNG0005デフォルトの名無しさん
NGNG乙〜。
0006名無しさん@Emacs
NGNGこれも入れといてくれよ
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNGおつかれ〜。
0010デフォルトの名無しさん
NGNGサパーリちんぷんかんぷんです。
次にどんな本を読めばよいでしょうか。ご指導宜しくお願いします。
0011デフォルトの名無しさん
NGNG読むより書くべし
0012デフォルトの名無しさん
NGNGよく考えたなぁって言う分には今のところ楽しめてるんだけど、
こんなの自分じゃ書けないよ。
こんな俺は、まだ勉強したことのないSTLについて勉強した方が、
実用的だと思うんだけど・・・。
どうしたらいい?
0013デフォルトの名無しさん
NGNG10です。レスありがとうございます。これから持っている乏しい知識で
どんどん書いてみることにします。
>>12
僕と同じ状態ですね。Effective STLを読破されるとかなり知識がつき
ますよ。
0014デフォルトの名無しさん
NGNG0015デフォルトの名無しさん
NGNG0016デフォルトの名無しさん
NGNGclass T{ int a; char b; } で、
list<T>をsortする時、 bool operator <() を使って、int aで並べ替えられたけど、
char bでも並び替えたい時はどうすれば良いんでしょう。
bool operator <() を2つ定義するわけにも行かないし。
0017デフォルトの名無しさん
NGNG比較用のファンクタ作ってわたせばいいじゃん
0018デフォルトの名無しさん
NGNGbinary_functionをpublic継承すればいいのですか?
0019デフォルトの名無しさん
NGNG継承してもしなくても、どっちでも可能なんじゃない?
0020デフォルトの名無しさん
NGNGうーん、その継承しない方法がよくわからないのです。普通に書くとファンクタ
でなくて関数になってしまいそうで。
0021デフォルトの名無しさん
NGNGpublic:
bool operator()(const T& lhs, const T& rhs) const { return lhs.b < rhs.b; }
};
とかじゃだめなの?↑試してないけど。
0022デフォルトの名無しさん
NGNGなるほど。サンクス。メンバがさらに増えた時の対処も考えてみます。
0023デフォルトの名無しさん
NGNG0024前スレ957
NGNGmem_fun_ref を使うとインライン展開されないので困った
という場合、自分でループをまわしたらいいんでしょうか?
0025デフォルトの名無しさん
NGNG今、前スレ見れないので。
0026デフォルトの名無しさん
NGNG自分でループ回せって
それがいやなら、mem_fun_refの変わりをする関数アダプタを作る。
002724
NGNGやっぱり自分でまわすですか。
じゃぁいまの状態で落ち着かせとくことにします。ありがとん。
ところで、 mem_fun_ref_t の替わりを試しに作ってみました。
template< typename T , typename R , R (T::*MEMFUN)() const >
struct static_const_mem_fun_ref_t : std::unary_function< const T& , R >
{
R operator () ( const T& x )
{
return (x.*MEMFUN)();
}
};
unsigned count_empty( const std::vector<std::string>& v )
{
return std::count_if( v.begin() , v.end()
, static_const_mem_fun_ref_t<std::string,bool,&std::string::empty>() );
}
コードは期待通りですが、ソースがあんまりイクナイです。
&std::string::empty を渡すだけで↑みたなのができたらいいなぁ。
002824
NGNGなので「コードは期待通り」ってのを撤回です。
そんなわけでやっぱり素直にループまわした方がいいみたいです。
unsigned count_empty( const std::vector<std::string>& v )
{
unsigned c = 0;
std::vector<std::string>::const_iterator const end = v.end();
for( std::vector<std::string>::const_iterator cur = v.begin() ; cur != end ; ++cur )
if( cur->empty() )
++c;
return c;
}
0029デフォルトの名無しさん
NGNGところで、boost::mem_fnもダメなの?
0031名無しさん
NGNGこれを回避する方法はありますでしょうか。
g++ だと大丈夫なんですが。
0032デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1004287394/l50
0033デフォルトの名無しさん
NGNG質問ならageでかけ
0034デフォルトの名無しさん
NGNGstdexceptをinclude
0036istreambuf_iterator
NGNG「Effective STL」p124 のサンプルをみながら打ち込んでみたけど、
VC++6.0 ではエラーになってしもた。鬱…。
*/
#include <fstream> // std::ifstream, std::istreambuf_iterator<>
#include <string> // std::string
#include <stdio.h> // puts()
int main()
{
std::ifstream ifs( "a.cxx" ) ;
std::istreambuf_iterator<char> begin( ifs ) ;
std::istreambuf_iterator<char> end() ;
std::string str( begin, end ) ; // 1 番目の引数を 'class std::istreambuf_iterator<char,struct std::char_traits<char> >' から 'const char *' に変換できません。
puts( str.c_str() ) ;
return 0 ;
}
0037istreambuf_iterator
NGNGビジネスオブジェクトになければなりません。
この設計パターンに従えば、将来に備えることができるでしょう
0038デフォルトの名無しさん
NGNGstd::istreambuf_iterator<char> end ;
0039デフォルトの名無しさん
NGNGどのコンパイラなら通ったの?
俺の知る限り、>>36のソースが通るコンパイラは存在しない。
0040デフォルトの名無しさん
NGNGSTLport を入れればコンパイルできる。
リンクできなかったけど。
0041デフォルトの名無しさん
NGNGそれはアンタの環境がおかしいんじゃないの?
STLPort4.53だと普通にコンパイル、リンクできるが。
004240
NGNGリンクできないのは漏れの環境がおかしいからです。
0043デフォルトの名無しさん
NGNGダイナミックだと出来なかった
以上
004436
NGNG0045デフォルトの名無しさん
NGNGSTLPortを使ってもアンタの出したソースは通らないんだよ。
新しいタイプのアンチVC6か?おまえは。
0047デフォルトの名無しさん
NGNGクレクレ君だったのか(w
0048デフォルトの名無しさん
NGNG#include <fstream> // std::ifstream, std::istreambuf_iterator<>
#include <string> // std::string
#include <algorithm>
#include <stdio.h> // puts()
int main()
{
std::ifstream ifs( "a.cxx" ) ;
std::istreambuf_iterator<char> begin( ifs ) ;
std::istreambuf_iterator<char> end ;
std::string str;
std::copy( begin, end, std::inserter(str, str.end() ) ) ;
puts( str.c_str() ) ;
return 0 ;
}
0049デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
NGNG005336
NGNG誰だおめー?
>48
さくとす。
0054デフォルトの名無しさん
NGNG| Standard Template AGE. |
|___________|
∧∧ ||
( ゚д゚) ||
/ づΦ
0055デフォルトの名無しさん
NGNG0056モナ吉
NGNG| 標準 雛型 上昇 |
|___________|
∧∧ . ||
(´∀`).||
/ づΦ
0057デフォルトの名無しさん
NGNG○ベクター
◎ヴェクトゥァー
0058デフォルトの名無しさん
NGNG0059デフォルトの名無しさん
NGNG×ペク夕一
×ワ"τ久卜η了一
0060デフォルトの名無しさん
NGNGpublic:
static void Hoge(int i ){std::cout << i << std::endl;}
};
こんな風にstaticしかないクラスのメンバをfor_eachなどで使うには
どうすればいいの??
0061デフォルトの名無しさん
NGNG0062デフォルトの名無しさん
NGNGfor_each(b,e,T::Hoge);
ではないの?
0063デフォルトの名無しさん
NGNG>>61
0064阻止 落ちませんよ
NGNG0065デフォルトの名無しさん
NGNGどうすればいいですか
0066デフォルトの名無しさん
NGNGしかし、boostのはbinary_function/unary_functionを継承してないから使いづらい
0067デフォルトの名無しさん
NGNG何処らへんで unary_function/binary_function継承してないと使いづらい?
006865
NGNGディレクトリかえるのどうやるかわからんから、mingw使おうと思ったけど
楽しようと思ってDev-C++いれたらcppの関連付けかえられてしもうたぁーーー
0069デフォルトの名無しさん
NGNG自分で直す。俺はそうした。
0070デフォルトの名無しさん
NGNGデフォルトの検索パスを変更するなら、specs ファイル書き換える。俺は明示的に
-I で指定する方が好みだが。
/usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
0071デフォルトの名無しさん
NGNG0072デフォルトの名無しさん
NGNG0073デフォルトの名無しさん
NGNG標準STLではありませんが、なにか?
って書くとイヂワルなので…、
一応SGI STLではfunctionalにunary_composeつー
もんが用意されているらしい。boostについては…
まだ使ってないのでスマソ。
SGIをあまり使う必要が無ければ自作したほうが
ラクかと。
007571
NGNGboost::composeも見てみたらちょっとネーミングが…
boost::bindをみてみたら代用できるようで驚きだ
0076デフォルトの名無しさん
NGNGネーミングって?
compose_f_gx_hxとか?
コレって混成方法を表して居るんだから、
SGI STLの奴より使い出があると思うが。
007771
NGNG0078デフォルトの名無しさん
NGNG最初は俺も感性あわないと思ってたけど
f_gxやf_gx_hxやらf_gxyやらf_gx_hyとかって書いたほうが
1や2って書くよりも解りやすいと思うよ
0079デフォルトの名無しさん
NGNG面白いコンテナやアルゴリズム紹介して
0080デフォルトの名無しさん
NGNG#include <vector>
#include <boost/any.hpp>
void main()
{
std::vector<boost::any> v;
boost::any iany(10); //int
boost::any dany(10.102);//double
boost::any sany("hogehoge"); //char*
v.push_back(iany);
v.push_back(dany);
v.push_back(sany);
std::cout << boost::any_cast<int>(v[0]) << std::endl
<< boost::any_cast<double>(v[1]) << std::endl
<< boost::any_cast<char*>(v[2]) << std::endl;
}
毎度毎度思うけどこんなanyとかって作る人は一体
どういう考えしてるんだろうなぁ
0081デフォルトの名無しさん
NGNG(違いはstatic_castを記述するかany_castを記述するかだけだが)
いずれにせよ代入は簡単だけれども使うときに
キャストを(正しく!!)書く必要があるから結構大変
0082デフォルトの名無しさん
NGNGtemplate<typename T> operator T() { return any_cast<T>( *this ); }
みたいなもの、ってこと?何だか思わぬところで思わぬcastを
されてしまいそうでかえって使いにくい気がする。
0083デフォルトの名無しさん
NGNG関係ないけど、
なんでCの次なのにC++
(プラスが2つ)なの?
0084デフォルトの名無しさん
NGNG0085デフォルトの名無しさん
NGNG0086デフォルトの名無しさん
NGNGソートしたときに C の次に来ないから。
0089デフォルトの名無しさん
NGNG気軽に使えない・・・こんな洩れは逝ってよしですか?
0090デフォルトの名無しさん
NGNGはい。
0091デフォルトの名無しさん
NGNG何を恐れる必要があるというのだ。
009289
NGNG恐れることは山ほどあります。
insertやeraseが中途半端で止まったら対策が面倒とか、
最後の頼みのclearやswapで死んだら打つ手無いじゃんとか。
vectorに皮かぶせたコンテナ作ろうとしたりすると、その辺りが
気になって気になって。
0093デフォルトの名無しさん
NGNGそんなに心配なら、うだうだ言う前に実験しろ!
結果が気に入らなければ、自分で作れ!
0094デフォルトの名無しさん
NGNG0095デフォルトの名無しさん
NGNGスタックオーバーフローが怖くて関数も気軽につかえない口ですか?
0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNGコストがかかるから?
0098デフォルトの名無しさん
NGNGほとんどの場合はどっちを選んでも誤差の範囲でしょ
0099デフォルトの名無しさん
NGNGいや、普段は戻り値まんせーなのと、STLでは成功するものだという思いこみ。
0100デフォルトの名無しさん
NGNG自分が例外を扱わないのに、STLの内部で例外使われていると、なんとなく
悔しい気分になりません?
0101デフォルトの名無しさん
NGNGVC++ローカルな話でスマソ
0102デフォルトの名無しさん
NGNG別にならないよ。
でも、例外だしてくれる奴を無視してると、
あ〜STLとC++の能力を半減させてるなあと思ってしまふ。
0103デフォルトの名無しさん
NGNG例外で勝手に死んでくれるから便利じゃん
0104デフォルトの名無しさん
NGNGSTL 内部でメモリアロケーション田尾の失敗したときに、例外投げてくるからねぇ。
C++ から例外を取ったら、かなり煩雑な書き方を要求されることになるのは間違
いない。
(まー C に時代が戻っただけ、という気もするが)
0105639
NGNGi!=HashDic.end();i++){
delete i
}
0106デフォルトの名無しさん
NGNGclass t = new WordFromDic();
HashDic["test"] = t;
などなど・・・
としたあとで
for(map<string, class WordFromDic*,less<string> >::iterator i=HashDic.begin();
i!=HashDic.end();i++){
delete i
}
となったときにHashDicが所持しているWordFromDicクラスへのポインタを
deleteする方法ってどうやるのですか?
0107デフォルトの名無しさん
NGNGiterator を delete するな!
delete i;
下
delete *i;
0108デフォルトの名無しさん
NGNGHashDicが所持しているWordFromDicクラスへのポインタにdeleteを適用して
ポインタの示しているオブジェクトを破棄したいならdelete i->second;
0109106
NGNGi->second...?の意味は良くわからんですけど
これで
WordFromDic t = new WordFromDic();
しか部分が消えていれば目的達成です。ありがとうございます。
0110デフォルトの名無しさん
NGNG0111デフォルトの名無しさん
NGNG0112デフォルトの名無しさん
NGNG横レスだがpair
0113デフォルトの名無しさん
NGNG横レスだが
>class t = new WordFromDic();
?
0114デフォルトの名無しさん
NGNGVC++なら_CrtSetDbgFlagを使ってメモリリークを検出できるが、
gccとかC++Builderにはこんなのあるんかな。
0115デフォルトの名無しさん
NGNGoperator ::new と ::delete に細工すればいい。
0116デフォルトの名無しさん
NGNGC++BuilderはPRO以上ならCodeGuardがついているよ。
0117デフォルトの名無しさん
NGNGきちんと定義されてるの?
0118デフォルトの名無しさん
NGNGもちろん。そもそも vector って値ベースのコンテナだし。
0119デフォルトの名無しさん
NGNG117じゃないけど、STL始めようとおもってる初心者です。
便乗させてください。
clearのとき、デストラクタは呼ばれるのですか?
値ベースってことは、ポインタを格納することはできないのですか?
0120デフォルトの名無しさん
NGNGポインタの「値」を格納することはできる。
vector <int*> v;
と定義したら v がスコープから外れる場合に int* を delete はしてくれない。
とりあえず STL の入門書を読んだ方が良いと思う。まじめに解説を始めると
書籍で数十ページになる内容だから、ここでやりとりするのは無理だ。
0121119
NGNG親切にありがとうございます。詳しいことは入門書で調べてみますが、
vectorのデストラクタ(と呼ぶのかな?)ではclear()のようなメモリ開放の処理は行われないのですね。
vector <int*> v;
をクラスメンバとした場合、クラスのデストラクタでv.clear()すれば
OKってことですか?
それだけ教えてください。
0122デフォルトの名無しさん
NGNGぜんぜん違う。
clear()と同じことはvectorのdestructorでも呼ばれる。
格納物がポインタならば、ポインタ自身は開放されるがその指す先は関知しないというだけだ。
ポインタ自身の開放ってのはつまり、32bit pointerならば4byteの開放ね。
0123121
NGNG親切に説明してくれているのに
よくわからないので出直してきます。スマソ。
0124デフォルトの名無しさん
NGNGint **pp = new int*;
int *p = new int;
*pp = &p;
としておいて、
delete pp;
としてもpの指す先が解放されないのと同じ。ニュアンスは異なるけど、
言いたい事は伝わりますか?
0125121
NGNG親切にありがとうございます。
わかった気がします。
clear()じゃ、delete int*に相当する処理が行われないということですよね?
int *n = new int;
v.push_back(n);
v.clear();
だとすると、nはメモリ上に残ったままになる・・・と。
この場合、イテレーター使って全要素にdeleteしないといけないの??
0126デフォルトの名無しさん
NGNGそうなりますね。
別のケースで言えば、リスト構造のデータがある時、初期ノードを削除
してしまってもそこからつながったデータは残ったままになるのと同じ
ですね。
0127121
NGNGなんか面倒・・・。
一気にdelete呼ぶ方法はないかな?
boostのshared_ptrとか使えば気にしなくていいの?<これも勉強中です
質問ばっかですいません。
0128デフォルトの名無しさん
NGNG一気にdelete
template<typename T> struct deleteer {
void operator()( T* ptr ) { delete ptr; }
}
for_each( v.begin(), v.end(), deleter<int>() );
とかやるよりは
> boostのshared_ptrとか使えば気にしなくていいの?<これも勉強中です
こっちが正解。
0129121
NGNGありがとうございます。理解できました。
でも、boostのビルドに失敗してるし>自分
http://www.dodgson.org/lab/hat/boost_intro.html
のとおりにやってるつもりなんだけど、
jam -sBOOST_ROOT=. -sTOOLS=msvc
ってやると
warning: unknown rule boost-build
don't know how to make all
...found 1 target...
...can't find 1 target...
とでてしまいます。
0130デフォルトの名無しさん
NGNGどうしてもビルドしたいなら、threads/regex++のディレクトリでmakeしなさい。
0131age
NGNG0132デフォルトの名無しさん
NGNGあ?
013389
NGNG蒸し返すようですが、例えばreserve()を呼んだ後はpush_back()が
例外を投げない(もちろんコピーコンストラクタは例外を投げないとして)
とか、そのくらいまで(実装依存でなく)標準で保証されているのですか?
それとも、そういう保証が欲しければ自作することになりますか?
0134デフォルトの名無しさん
NGNG保証はない
0135デフォルトの名無しさん
NGNGじゃ駄目なの?
0136デフォルトの名無しさん
NGNG0137デフォルトの名無しさん
NGNGあとは STLport 付属の iostream を使う場合には、ライブラリをリンクする
必要があるな。VC++ とかだと #pragma が良きに取りはからってくれるけど。
0138デフォルトの名無しさん
NGNG必要なのはstlport側だろ?
boost側でリンクする物は一切無いよ。
0140デフォルトの名無しさん
NGNG0141デフォルトの名無しさん
NGNG明示的に標準が要求しているのは、push_back() で例外が投げられた場合、
その呼び出しが無効になることだけ。
無効になるとは、コンテナの内部要素に変更が起こらないということだ。
この保障だけで十分安全に push_back() を使うことができると思うが。
もちろん実装が適切に構築されているかどうかは別の話だ。
だいたい標準はガンガン例外を投げろという立場だから、そんな後ろむきな保障の仕方はしていない。
0142デフォルトの名無しさん
NGNG規格で保証されてるのは
1. capacity() は reallocation なしで保持できる要素数を返す。
2. reserve(size_t n) を呼び出すと capacity() な n 以上になる。
だから、結果的に push_back() で例外は飛んで来んと思うが。何か見落としてる?
0143デフォルトの名無しさん
NGNG>無効になるとは、コンテナの内部要素に変更が起こらないということだ。
>この保障だけで十分安全に push_back() を使うことができると思うが。
全然安全じゃない。複数のオブジェクトをnewして、順番にポインタを
push_back()するコードを書いたら、vectorに入るオブジェクトと
入らないオブジェクトが出て来る。
0144デフォルトの名無しさん
NGNGちゃんと例外キャッチして欲しい・・・。
適当にgoogleって眺めてたんだけど、
ちゃんと例外使ってるソース見つけられなかったよ。
誰か参考になるような良いソース知りませんか?
0145デフォルトの名無しさん
NGNG例外のキャッチとSTLに何の関係があるの?
普通の例外のキャッチとなんか違う?
0146デフォルトの名無しさん
NGNG例外が起こるタイミングが予測しにくいところ。
map[str]みたいに書くと、一瞬普通の配列アクセスみたいに見えるから、
例外処理を忘れると後で気付きにくいところ。
0147デフォルトの名無しさん
NGNGそれも例外全般の話で、STLに限ったことじゃないよな。
map[str]での例外に注意が行くかどうかの注意力は、
人のソース見て身につくもんじゃないとおもうけど。
0148デフォルトの名無しさん
NGNG0149デフォルトの名無しさん
NGNG0150デフォルトの名無しさん
NGNG>>145
良い感じのネタフリだったのに、そんなレスすんなよ。
0151145
NGNGじゃぁさ、「そんなレス」の替わりに、145の時点で「俺はbad_allocだけcatchしてる」って
書いてあったら、有意義な方向に話が進んだと思うか?
そんなわけないとおもうけどなぁ。
>>148
なんか理由挙げれる?
ちなみに147=145。
0152デフォルトの名無しさん
NGNG145=ら抜き言葉=小学生
0153デフォルトの名無しさん
NGNG北海道人かもしれんぞ。
0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNGSTLとnewのどっちの仕事なんでしょうか?
もしかして処理系の実装依存?
0156デフォルトの名無しさん
NGNG0157デフォルトの名無しさん
NGNG投げないのは「バグ」です。
0158下逸
NGNG0160デフォルトの名無しさん
NGNGそっから次までが長すぎただけで。
0161デフォルトの名無しさん
NGNGvoid func() throws exception;
みたいな書き方はC++にもあったような気もするが・・・
詳しい人レス希望.
0162155
NGNG> newのお仕事です。newが失敗したらbad_allocを投げることになってるもの。
言われてみればそうですね。
STLportに入れ替えても例外来なかったんで気になってたんですよ。
今まで通り _set_new_handler で誤魔化しながら使うしかないのか。
>>161
その関数がどの例外を投げるのか明示
だったと思うけど使ったことないや。
0163デフォルトの名無しさん
NGNGC++ の例外指定は、コンパイル時に強制チェックが入らないから、あまり
意味がない。
0164デフォルトの名無しさん
NGNG確かにありますけれども。
void foo() throw(A, B)
{
}
のように書いて、foo が A, B 以外の例外を投げないことを保証する。
もしそれ以外の例外を送げようとしたら、unexpected が呼ばれる。
例外指定なしに比べて unexpected を呼ぶコードが付くから、コードが肥大化するかもしれないのに対し、
呼び出し側で何か最適化に利用出来るわけでもなく、あまり意味がない。
assert な気持ちで書くのが良いんじゃないかしら。
0166デフォルトの名無しさん
NGNGでも、変な例外投げそうなら、せめてwarningくらい出して欲しい。
templateがあるから、簡単にいかないのは分かるけど。
0167デフォルトの名無しさん
NGNGリスト長は、最大でもせいぜい20個位なのですが、リストの削除や追加を
一分間に20回ほども繰り返し、8時間ほど常駐されるツールです。
そこで質問なのですが、このように頻繁な追加削除を行う場合、
メモリ空間はどんどん汚れていってしまうのでしょうか?
いつもはあまり気にしないのですが、今回は常駐ツールと言うことで
悩んでいます。つまらない疑問で恐縮ですがよろしくお願いします。
0168デフォルトの名無しさん
NGNG> メモリ空間はどんどん汚れていってしまうのでしょうか?
意味不明だが…
わずか9600回ぐらい気にするな。
0170167
NGNGえっと、追加削除のたびに、確保されていたメモリが
小さな欠片として、散らばってしまうのかなと思ったんです。
解決方法は難しく無さそうですが、後学のためといいますか、
listが上手いこと処理してくれるなら、信頼のおけるlistを
使った方がいいなと思いまして…。
0171デフォルトの名無しさん
NGNG信頼のおけるlistをどうやって作ろうと思っているかちょっと気になる。
0172167
NGNG>>169
返答ありがとうございます。良かった、この位なら大丈夫なのですね。
安全で安心なlistでいけてホッとしています(*´ω`)=3ホッ
0173167
NGNGあ、信頼の出来るlist=STLのlistという意味ですー。
自分で、例えば未使用リストをプールして置くようなのを作るよりは、
信頼の出来るSTLのlistで行った方が、安全だし早くできるなと。
連カキコすいませんです。
0174デフォルトの名無しさん
NGNGメモリ空間が多少乱れても、ページング処理により大勢に影響ないと思う。
メモリ監視ツールとかでどのくらい無駄になっているか調べてみたら?
追加削除でどうしてもメモリ量が増えつづけるなら、
予めリザーブ領域を十分に用意しておけば大丈夫じゃないかな。
0175167
NGNGなるほど…ページング処理…そしてリザーブ多めでOKですか。
最近ようやくハードを意識したプログラムに目覚めたところでして、
こういったキーワードを教えて頂けるのは本当に助かります。
これから詳しく調べてみたいと思います。レスありがとうございました。
0176デフォルトの名無しさん
NGNGstop-and-copyガベージコレクションをするとか。
0177デフォルトの名無しさん
NGNGプールした領域からメモリ確保するようにすれば充分かと
0178デフォルトの名無しさん
NGNG有名な「free/deleteはOSにメモリを返さない」って奴。
0179デフォルトの名無しさん
NGNG実装によっては、さらに STL コンテナの allocator でもプールしてたりする。
0180デフォルトの名無しさん
NGNG0181デフォルトの名無しさん
NGNG格納されている要素オブジェクトも全部コピーされるんでしたっけ?
string みたいにバッファは参照回数付きで共有されるなんて
ことはない?
0182デフォルトの名無しさん
NGNGそういう実装を作ってもいいんじゃない?普通はコピーするだろうけど。
stringも、実際は共有してても、あたかもコピーしているかのように動作しなければならないはずだし。
0183デフォルトの名無しさん
NGNGg++ と VC++ で提供されている STL の実装では、このあたりが
どうなっているかを知りたかったのです。
もし、要素オブジェクトもコピーされるなら、vector オブジェクトの
ポインタを shared_ptr かなんかで包んでしまうとかしますので。
0184デフォルトの名無しさん
NGNGたぶんコピーされるだろう。
0185デフォルトの名無しさん
NGNG要素も全部コピーでいいと思う。
参照渡しじゃだめなの?
0186デフォルトの名無しさん
NGNG> vectorやlistは要素をコピー元と先で、別々に操作したいからなぁ。
要素の操作は、vector や list オブジェクトを介さずに行うことが
できるから、たしかに全部コピーしないとまずいですね。
> 参照渡しじゃだめなの?
vector オブジェクトを包含する別のオブジェクトがあって、
それのコピーをしたいんです。参照で持たせるのはちょっと
使い勝手が悪いんで、やはり shared_ptr あたりを使うことに
しようと思います。
0187デフォルトの名無しさん
NGNG0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNGBCC5.5.1+XPで以下のプログラムを実行すると、Ctrl+Zが1発で終了すると思うのですが、
2発必要です。VC.NETでは問題ありません。
BCCのバグでしょうか?検索しても見つからないのですが。
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
int main()
{
vector<char> v;
copy(istream_iterator<char>(cin), istream_iterator<char>(), back_inserter(v));
for(vector<char>::iterator iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " ";
cout << endl;
}
0190189
NGNGバグなのか私のカンチガイなのか。
どなたかよろしくお願いします。
0191デフォルトの名無しさん
NGNGStlportだとちゃんと終了する
0192デフォルトの名無しさん
NGNGVC6 + STLPort 4.5.3 でメモリ確保失敗時にbad_alloc例外を
投げるようにするには、どうすれば良いのでしょうか。
main() {
try { std::vector<int> v(1000000000); }
catch ( std::bad_alloc & ) { cout << "OK" << endl; }
}
オプションの例外処理は有効にしています。
現状では、コンストラクタ内のfillがNULLポインタに触って
Access Violationで落ちてしまいます。
どのようにすれば、例外を投げてくれるのでしょうか。
0193デフォルトの名無しさん
NGNG0194192
NGNG説明が足りませんでした。
_set_new_handlerは使えないんです。
実は、自作のライブラリ内で使いたいので、メイン側に影響を与えるような
変更は極力避けたいのです。
どうも、_set_new_handlerはDLL越しにでも効いてくるみたいなので
出来ればカスタムアロケータで対応したいのですが。
自前のアロケータを書けば良いのは分かってますが、設定か何かで
ちゃちゃっと出来ないですか。
0195デフォルトの名無しさん
NGNG俺も同じ症状でた。不思議だね。
0196デフォルトの名無しさん
NGNG本当だね。Rogue waveのバグだ。
Borland-C++ 5.6なんだけど、STLPortでは正常に動作し、
#define _USE_OLD_RW_STL をするとおかしくなる。
0197デフォルトの名無しさん
NGNGだったらdll側ではmsvcrtを使わずにスタティックリンク汁
0198192
NGNGなるほど、言われてみればそうですね (^^;
CPPUNITでテストするのに、同じライブラリを呼ばせるため
ダイナミックでリンクしてました。
個別クラスのテストはダイナミックでやって、リリースは
スタティックにすればいいのかな。
素早いレス、どうも有難うございました。
0199デフォルトの名無しさん
NGNGと思うんですけど、ソース読んで
template<> __type_traits< ...
とか書くのが正解なんでしょうか?
もうちょっとマシなやりかたはあったりしませんか?
0200デフォルトの名無しさん
NGNG必要なものだけ再定義しなさい、と書いてあった気がする。
外してたらすみません。
0201デフォルトの名無しさん
NGNG普通のiteratorじゃないと弾かれてしまってキャストも効きません・・・。
VC++6.0付属のSTLを使っています。どうか宜しくお願いします。
0202デフォルトの名無しさん
NGNGreverse_iterator::base()
0203デフォルトの名無しさん
NGNG見事にうまくいきました(´Д⊂
レスありがとうございました。
0204199
NGNGデフォルトの type_traits をもってくる方法が胡散臭いんですよ。
std::type_traits とか、 ::__type_traits とか。
どんなメンバがあるのかも、ソース読まないと分からないようですし。
type_traits を作ってる側から、「自分の奴がほしいなら、こうやって定義してね」
っていうマクロでもあるといいんですが。
0205201
NGNG>>202で教えて頂いた方法を、erase()に使ってみたのですが、
どうしても上手く逝かなくて…、簡略化するとこんな感じです。
main(){
std::list<int> lst;
lst.push_back(0);
lst.push_back(1);
lst.push_back(2);
lst.push_back(3);
lst.push_back(2);
std::list<int>::reverse_iterator r_it;
for( r_it=lst.rbegin(); r_it != lst.rend(); r_it++ ){
if(*r_it == 2 ){//後ろからソートし、最初の2をリストから削除したつもり
lst.erase( r_it.base() );
}
}
std::list<int>::iterator it;
for( it=lst.begin(); it != lst.end(); it++ ){
std::cout << *it << ' ';//0 1 2 3と出力して欲しい
}
}
VC++6.0付属のSTLで、実際にはエラーが出てしまいます。
リバースイテレータの正しい使い方を教えて頂ければ幸いです。
0206201
NGNG0207デフォルトの名無しさん
NGNG{
lst.erase(--r_it.base() );
break;//最初の2が見つかった時点で処理を打ち切る。
}
何故こうする必要があるのかはEffective STLに書いてある。
要するに消去に関してはr_itとr_it.base()は等価ではないということだが。
つーか、この処理のどこにもソートは関係ないと思うが。
0208201
NGNGレス遅れてすいません。なんかネットに繋がらなくて・・・YBBめヽ( `Д´)ノ
おかげさまでうまくいきました。なるほど、等価で無いのですね・・・。
>ソート break
なはは、なんでこんなこと書いちゃったのだろ(もちろんアホだから)…お恥ずかしい。
reverse_iteratorの用法は、不思議とネット(日本語)には無くて…本当に助かりました。
Effectiveシリーズはやはり全部必読なのですね…。返答ありがとうございました。
0209落ちませんよ。。。
NGNGネタがないのでひと休憩...
こんなんあったら便利orこんなん作ったよ
ってテンプレってある?
0210デフォルトの名無しさん
NGNGstd::basic_ostream::operator=()
ってSTL標準じゃないの!?
STLPortには入ってなかったんだが。
0211211
NGNGあと疑問に思ったのだが、代入演算子は
なければ勝手に作成されるはずだが、
それもされない。
VC6+STLPortだと作成されずにゴルァされる。
0212デフォルトの名無しさん
NGNG> それもされない。
void operator=(const _Self&) {};
されてるから。
0213デフォルトの名無しさん
NGNGprivate:
もつけとかないと。
0214デフォルトの名無しさん
NGNGレスTHXです。
標準じゃなかったのか…使いやすかったのに…。
>void operator=(const _Self&) {};
これって、basic_ostream::sentry内で定義さ
れてるのじゃなかったっけ?
今手元にないので、帰ったらもう一度確認
してみます。
0215 デフォルトの名無しさん
NGNGint key;
int data1, data2;
というデータを set か map で扱う場合、そのどちらを選択するかは
「データの構造体がキーを含むものか?」ということを分析して
判断するのものしょうか?
それともどちらかを使ったほうが効率がいい、ということがあるのでしょうか?
1.
----------------------------------------
typedef struct A {
bool operator<(const A& rhs) const { return (key < rhs.key); }
int key;
int data1;
int data2;
} A;
typedef std::set<A> HOGE;
----------------------------------------
2.
----------------------------------------
typedef struct A {
int data1;
int data2;
} A;
typedef std::map<int, A> HOGE;
----------------------------------------
0216デフォルトの名無しさん
NGNG>データの構造体がキーを含むものか?
も一つの選択材料だと思う。
他にも、「データの変更を伴うか?」とか。
効率については特に違いはないと思いま
0217210
NGNGvoid operator=(const _Self&) {};
が定義されているのは
basic_ostream::sentry内で
basic_ostream内では定義されて
いませんでした。
またVC6でデフォルトの代入演算子が
生成されない条件は「クラスを引数とする
代入演算子が定義されていない」こと
らしく、デフォルトが生成される条件には
当てはまっているんだが…。
ワケワカラン...
とりええず、
>標準にはないね。
情報ありがとうございました。
0218212
NGNG> void operator=(const _Self&) {};
> が定義されているのは
> basic_ostream::sentry内で
おうホントだ。失礼。basic_ostreamじゃなくて
派生元のios_base側で禁じてあるようだ。
0219210
NGNG>ios_base側で…
その手があったか。ios_baseまで
確認していなかった。
確かにVC6のSTLでは、
ios_base& iosbase::operator()
が定義されているのでデフォルト生成
される理由の説明がつく。
???となるとどっちがSTL準所なんだ?
VC6STLの方が糞っぽい気が…。
帰ってからSTLPortも確認してみます。
わざわざ見なおしていただいてありがとう
ございました。
0220デフォルトの名無しさん
NGNGあと、効率を無視出来るときは、mapの方が配列演算子使えるから読みやすく書けるってのもあるよ。
0221215
NGNG確かに「データ変更を伴うか?」というのも重要なファクターですね。
見落としていました。
ご回答ありがとうございました。
0223デフォルトの名無しさん
NGNGあれって要素の有無を調べるのには使えないんだよね。3時間くらい無駄にした。
0224デフォルトの名無しさん
NGNGiostream は STL じゃない、よ、ね?
0226デフォルトの名無しさん
NGNGハァ?
iostreamは標準C++ライブラリの範疇だが、STLではないぞ。
ストリームのイテレータがあることで混同しているのかも知れないが。
0227デフォルトの名無しさん
NGNG(゚д゚) ハァ?
ナニ言ってんのコイツ?
(;・;Д;・;) ハッ!!!
あ!
iostreamはSTLじゃなかった。
iostream=C++標準ライブラリ ○
iostream=STL ×
髭...
0228デフォルトの名無しさん
NGNG0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGclass T{
vector<int> aaa;
vector<double> bbb;
};
のようなクラスでコンパイル時にコンテナを換えたいようなとき、
template <typename Container1, typename Container2>
class T{
Container1 aaa;
Container2 bbb;
};
T< vector<int>, vector<double> > foo1;
T< list<int>, list<double> > foo2;
とやらずに
template <templatename Container>
class T{
Container<int> aaa;
Container<double> bbb;
};
T<vector > foo1;
T<list > foo2;
という感じの事はできないんでしょうか。
下の例はあくまでイメージですけれど。
0231デフォルトの名無しさん
NGNG> template <templatename Container>
標準 C++ なら、
template <template<typename> class Container>
みたいに書けるけど、VC++ はこの書き方をサポートしてないんだよね。
0232デフォルトの名無しさん
NGNGVC7 はサポートしてるが、デフォルト・テンプレート引数に対応してないので
どっちにしろ、STL コンテナには使えない罠
0233230
NGNG> template <template<typename> class Container>
g++でコンパイルできました。
gccを使っていますので問題ありません。
こんな書き方ができるとは知りませんでした。
もっと標準C++を勉強してみます。
ありがとうございました。
0234デフォルトの名無しさん
NGNG{...};
こういう書き方も聞いたことある。
VC6しか入れてないので正しいかどうか確認できませんが…
0235230
NGNG勉強のために Modern C++ Design を買ってみたんですが
> template<template<class T> class Container>
のTは省略可能と書いてありました(P.11)
実際 T は使わないからそれでもよいみたいですね。
0237デフォルトの名無しさん
NGNGstd::map<std::string, int> m;
int i = m["NOTEXIST"];
としたときにi==0以外にできるような。
0238てきとー
NGNGpublic:
Integer(): val(1) {}
operator int() const { return val; }
operator =(int v) { val = v; }
以下略
private:
int val;
};
std::map<std::string, Integer> m;
int i = m["key"];
とか
0239237
NGNGども。
整数だけならこうかな?
デフォルト値が型名に入るのが使いにくそうだけど
template<class T, T N>
class defaulted_number {
T value;
public:
defaulted_number<T,N>(): value(N) {}
defaulted_number<T,N>(const defaulted_number<T,N> &t): value(t.value) {}
defaulted_number<T,N>(const T t): value(t) {}
operator T() const { return value; }
T &operator=(const T v) { value = v; return value; }
};
0240デフォルトの名無しさん
NGNG293 名前: STL勉強中 投稿日: 02/01/20 08:11
以下のコードがコンパイルエラーになってしまいます。
void foo(const int &i, const char *s)
{
cout << s << i << endl;
}
int main()
{
int d[] = {1, 2, 3, 4 };
vector<int> v(d, d + sizeof(d) / sizeof(int));
for_each(v.begin(), v.end(), bind2nd(ptr_fun(foo), "foo:%d"));
}
294 名前: 名無しさん@Emacs 投稿日: 02/01/20 12:08
>293
何故ダメなのかはちょっと分からないんだけど, foo の引き数を
const int& から int に変えると g++ 2.95.3 ではコンパイル通るよ.
実際,int とかは参照よりも値渡しの方がパフォーマンスいいし,
参照の必要が無いんなら int にしてみては?
# 必要があるんだと・・・どーすりゃいいのかねぇ.
実際、このケースで、intの代わりに重い構造体への参照使う必要があるのですが
……どーすりゃいいんでしょう?環境はgcc 2.96です。
つーか、何故に参照じゃダメ?
# 過去ログの見落としし等あればスマソ
STL猛者の方、ご教授をお願いします。
0241240
NGNG293, 294が前スレのログで、
最後のブロックが私の質問です。
空白省略されちまいました。見づらくてスマソ
0242デフォルトの名無しさん
NGNGとする。
理由は、binder2ndの
typename _Operation::result_type
operator()(typename _Operation::first_argument_type& __x) const {
return op(__x, value);
}
ここで参照の参照になってしまうから。
0244デフォルトの名無しさん
NGNGメスに興味はない
0245240
NGNG>ここで参照の参照になってしまうから。
あの〜これは既に参照型として使われているから、
わざわざ引数を参照にして関数を作る必要はないということなのでしょうか?
void foo(const int &i, const char *s) → void foo(const int i, const char *s)
でいいって事?
それとも、
>std::ptr_fun<int,char*,void>(foo)
>とする。
そのまんま
for_each(v.begin(), v.end(),
bind2nd(std::ptr_fun<int, char*, void>(foo), "foo:%d"));
と書くと、やっぱり
cannot convert `void (*) (int &, char *)' to `void (*) (int, char *)
と怒られてしまいました。
スマソ、全然理解が足りない。
明日、Effective STLを買いに走ろう。
0247デフォルトの名無しさん
NGNGあー、おれも昔、同じ問題で引っかかったことがある。
そういう理由だったか。
しかし、だとすると bind2nd::operator() とかが参照型を
引数にしている理由が分からんな。
元になる関数 (foo) が参照型を引数にとっていれば、
first_argument も参照型になるし、もとが参照型でないとすれば、
それは参照型にしなくてもさほど効率が落ちないからであって、
やはり first_argument も参照型にする必要はない。
…ということにはならん?
0248デフォルトの名無しさん
NGNGなんだ、勝手に参照型として判断してくれるのか。
なんかプログラマの感覚的にすごく分かりづらい……
>247
結構引っかかる人が多いようで、なんか安心した。
>もとが参照型でないとすれば、
>それは参照型にしなくてもさほど効率が落ちないからであって
どうやって区別しているんだろうねえ――。
無条件の参照型(intとか)は、かえって効率落ちるだろうし。
0249デフォルトの名無しさん
NGNGオメーラ、ホントにヴァカばっかだな。
天才のオレ様が糞みてーなオメーラに(略
と言いたいところだが、漏れも結構ハマったクチ。
んで本題↓。
0250249
NGNGclass clsA //clsAクラス宣言
{
public:
int func(int n) //引数を1つとるメンバ関数
{
//do something...
return n;
}
}
//コンテナ内の全てのclsAに対してfuncを呼ぶ
void do_func(vector<clsA> &cont, int n)
{
for_each(cont.begin(), cont.end(), binder2nd(mem_fun1_ref(clsA::func), n));
}
このようなロジックを書いた場合に、
もし第1引数が値渡しになってしまうと、
binder2nd::operator()が呼ばれた時点でクラスが
コピーされてしまい、コンテナ内にあるclsA自体
にはfunc()が行われなくなってしまう。
…って解釈しているんだが。
>>243
お、オレとはどうよ? ハァハァ...
0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNGやはり納得いかん。そもそも mem_fun1_ref_t を
template <class _Ret, class _Tp, class _Arg>
class mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret>; // _Tp を
ではなくて、
template <class _Ret, class _Tp, class _Arg>
class mem_fun1_ref_t : public binary_function<_Tp&,_Arg,_Ret>; // _Tp& ね
のように作っておけばよかったんではないか? そうすれば、binder2nd も
operator()(const typename _Operation::first_argument_type& __x) const;
ではなくて、
operator()(const typename _Operation::first_argument_type __x) const;
にできたと思うが。だいたい型の分からん関数引数に勝手に & を
つけるほうが間違いじゃないのか。どうよ。
0253デフォルトの名無しさん
NGNGtypename _Operation::result_type
operator()(typename _Operation::first_argument_type& __x) const {
return op(__x, value);
}
なんだ?
typename _Operation::result_type
operator()(const typename _Operation::first_argument_type& __x) const {
return op(__x, value);
}
だったら問題ないはず。(SGI版はそうなっている)
const性も保たれるし、標準では参照の参照は単なる参照として扱われるはず。
あと、vector::iteratorとchar *は同じとは限らない、ってのには
誰も突っ込まないのか?
0254hiraoka
NGNG240はboost::bindでok。
0255デフォルトの名無しさん
NGNG人間が馬鹿なのかSTLが難しすぎるのか。どっちだろうなぁ(w
0257デフォルトの名無しさん
NGNG> 標準では参照の参照は単なる参照として扱われるはず。
そう扱ってくれてもいいと思うんだが、規格書をざっと見た限り、
参照の参照は許されない、という趣旨の記述しか見当たらなかった。
あと、gcc-3.2 だと引数に const がついているようだ。
0258デフォルトの名無しさん
NGNGコンストラクタのpairの新しい値を挿入する仕様である。
だから、例えば m["NOTEXIST"] とした時点で、"NOTEXIST"と 0 のpairが
挿入されてしまう。
他の値を結びつけたければ、m["NOTEXIST"] = -1; のようにすればよい。
0260デフォルトの名無しさん
NGNGそうしないと勝手に挿入されてしまうからなあ。
0261デフォルトの名無しさん
NGNGconst int N = 100000;
struct insert_rand : public std::unary_function<double *, void> {
void operator()(double *d) {
*d = std::rand();
}
};
int main()
{
double ary[N];
std::for_each(ary, ary + N, insert_rand());
}
0262デフォルトの名無しさん
NGNG自己解決しました。for_each()が関数オブジェクトに渡すのはdouble *でなくて
doubleでした。
だから std::unary_function<double &, void> とすれば動きました。
うーんいまいちよく分からないんだよな〜。なんでdouble *じゃないんだろ。
0263デフォルトの名無しさん
NGNG配列なら double* が渡されるとすると、vector なら
vector<double>::iterator、listならlist<double>::iteratorが
渡ってきてしまうわけで、汎用の insert_rand なんてものは
作れなくなるわけだがそれでもよろしいか?
0264デフォルトの名無しさん
NGNGなるほど、ありがとうございます。
そのご説明ならよくわかります。
template <typename T>
struct insert_rand : public std::unary_function<T &, void> {
void operator()(T &d) {
d = std::rand();
}
};
みたいなものが作れなくなるわけですね。
0265デフォルトの名無しさん
NGNGが作れるのか。doubleにハードコードされている事を除けば。
ふむふむ、STLはいろんな事を熟考して作られているんですね。
0266デフォルトの名無しさん
NGNGconst int N = 100000;
int main(void)
{
double ary[N];
std::generate_n(ary, N, std::rand);
//std::generate(ary, ary + N, std::rand);
}
書く前にどのアルゴリズムが一番適確か考慮
した方がいいぞ。
0267250 (1/3)
NGNGう〜ん。長くなってしまうが…
そもそも *argument_type は
「引数の型情報」ではなく
「引数に渡される"生成可能な"型情報」
と解釈した方がいいかも。
もし *argument_type を「引数の型情報」(参照も可)
にした場合、
binder2nd<equal_to<int> >
は...
0268250 (2/3)
NGNGstruct equal_to:binary_function<T&, T&, bool>{...};
//↑コピーのオーバーヘッドを避けるため参照(int&)
template<class Op>
class binder2nd:unary_function<Op::frist_argument_type, Op::result_type>
{
public:
...
protected:
Op operation;
//↑equal_to<int>のインスタンス
Op::second_argument_type value;
//↑参照型(int&)になってしまう。
public:
//↓コンストラクタ
binder2nd(Op& op, Op::second_argument_type v):value(v),operation(op){}
//↑第2引数はコピーではなく参照するのみ!
};
...となり、意図した動作ではなくなってしまう。
0269250 (3/3)
NGNGユーザfunctorを作る際に自由度が増すからだと思う。
template<class Op> func(Op& op)
{
Op::argument_type val; //好きにしてン♥
...
}
とはいえ、確かに *argument_type =「引数の型情報」
にした方が名前通りの情報で納得できるが…。
誰か納得できる答えうp汁!
>>253
スマンコ。binder*は非変更(const)のfunctorですた。
変更を伴うアルゴリズムでは使ってはいけません。
訂正してお詫び(略。
0270デフォルトの名無しさん
NGNG261です。
丁寧なレスありがとうございます。早速試してみます。
0271デフォルトの名無しさん
NGNGtypedef const_iterator _It;
vector(_It _F, _It _L, const _A& _Al = _A())
{insert(begin(), _F, _L); }
void insert(iterator _P, _It _F, _It _L)
{...
iterator _Ucopy(const_iterator _F, const_iterator _L, iterator _P)
{for (; _F != _L; ++_P, ++_F)
allocator.construct(_P, *_F);
return (_P); }
となっているのですが、(つづく)
0272デフォルトの名無しさん
NGNGvector(_It _F, _It _L, const _A& _Al = _A())
: allocator(_Al), _First(0), _Last(0), _End(0)
{insert(begin(), _F, _L); }
template<class _It> ← 追加
void insert(iterator _P, _It _F, _It _L)
{...
iterator _Ucopy(const_iterator _F, const_iterator _L, iterator _P)
{for (; _F != _L; ++_P, ++_F)
allocator.construct(_P, *_F);
return (_P); }
とすべきではないでしょうか?
ttp://www.dinkumware.com/vc_fixes.html のdequeを見ると同じような感じに修正されています。
これで動けば問題は無いのですが、vector<int>をコンパイルしようとすると、次のようなエラーが出ます。何がいけないのでしょうか。
error C2664: '_Ucopy' : 1 番目の引数を 'int' から 'const int *' に変換できません。
コンパイルされたクラスのテンプレートのインスタンス化 'void __thiscall std::vector<int,class std::allocator<int> >::insert(int *,int,int)' の参照を確認してください
でんでん分からず困っています。よろしくおながいします。
0273デフォルトの名無しさん
NGNGよくわからんけど、vector<int>でインスタンスを生成するテンプレートは
元々別に存在しているんじゃないでしょうか。
じゃないと、修正前にvector<int>が通るはずがありませんから。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNGというか、すでに修正済み。
template<class _Iter>
vector(_Iter _First, _Iter _Last, const _Alloc& _Al)
いうまでもなく、VC7で、だがね。
0276デフォルトの名無しさん
NGNGinsertをtemplate化する事により、別のvectorのiteratorを渡して
insertできるようになる!のかな?というつもりだったのだが。
どうやら、template化した事により、多重定義されている別の
insert↓から呼ばれるのがinsert(int*,int,int)だと思われてしまうらしい。
iterator insert(iterator _P, const _Ty& _X = _Ty())
{size_type _O = _P - begin();
insert(_P, 1, _X);
return (begin() + _O); }
つーことで、(つづく)
0277デフォルトの名無しさん
NGNGtemplate<class _It>
void insert(iterator _P, _It _F, _It _L)
{_Insert(_P, _F, _L, _Iter_cat(_F)); }
template<class _It>
void _Insert(iterator _P, _It _F, _It _L, input_iterator_tag)
{size_type _O = _P - begin();
for (; _F != _L; ++F, ++_O)
insert(begin() + _O, *F); }
template<class _It>
void _Insert(iterator _P, _It _F, _It _L, bidirectional_iterator_tag)
{...
_Iter_catを使用してiteratorの場合にコンパイラーが区別できるようになる!?
のかな?よくわからん。
_Iter_catって初めてなんだが、なにもの?
親切な方、おねがいします。
0278デフォルトの名無しさん
NGNG0279275
NGNG>>271
マジレスするとだね、十中八九
vector<int> v(10, 10);
という、変数の初期化の際に
vector(size_t s, int v) // (個数,初期値)
ではなく
template<> vector<int>(int _first, int _last) // (反復子1,反復子2)
が呼ばれてしまうからだ。
Stroustrup 氏のC++3のP522にも書いてある、よく知られた問題だ。
俺もやったことがあるが、これを回避するのは結構めんどいぞ。
体育会系なノリでやっつけるなら、全ての整数型に対して
スペシャライゼーションを作ればいいんだが(シンデモヤラネエ)。
0280デフォルトの名無しさん
NGNGそれができれば嬉しいのですが・・・
諸々の事情で、できればVC付属のを修正するにとどめたいと思いまふて・・・
>>279
よく分かんないんですが、コンストラクターの部分もdequeをみて
iterator使った個所を次のように変更済みです。
感覚的には(Wこれで対応できているような気がするんですが
不十分でしょうか?
template<class _It>
vector(_It _F, _It _L)
: _First(0), _Last(0), _End(0)
{_Construct(_F, _L, _Iter_cat(_F)); }
template<class _It>
vector(_It _F, _It _L, const _A& _Al)
: allocator(_Al), _First(0), _Last(0), _End(0)
{_Construct(_F, _L, _Iter_cat(_F)); }
template<class _It>
void _Construct(_It _F, _It _L, input_iterator_tag)
{insert(begin(), _F, _L); }
0281デフォルトの名無しさん
NGNG>_Iter_cat
糞MSが苦肉の策で作った代用関数。
理由と使用法はiterator_traitsのヘルプに記載。
0282デフォルトの名無しさん
NGNGiterator insert(iterator _P, const _Ty& _X)
{size_type _O = _P - begin();
_Insert(_P, 1, _X);
return (begin() + _O); }
void insert(iterator _P, size_type _M, const _Ty& _X)
{_Insert(_P, _M, _X);}
void _Insert(iterator _P, size_type _M, const _Ty& _X)
{...
とinsert(_P, 1, _X)がiteratorによるinsertと解釈されないように、
呼び出されるべき2番目の処理を_Insertとして分けて、それを呼び出す
ようにしました。
(つづく)
0283デフォルトの名無しさん
NGNG混同されません。
template<class _It>
void insert(iterator _P, _It _F, _It _L)
{_Insert(_P, _F, _L, _Iter_cat(_F)); }
template<class _It>
void _Insert(iterator _P, _It _F, _It _L, input_iterator_tag)
{size_type _O = _P - begin();
for (; _F != _L; ++F, ++_O)
insert(begin() + _O, *F); }
template<class _It>
void _Insert(iterator _P, _It _F, _It _L, bidirectional_iterator_tag)
{...
という事で、なんとか解決しました。
ありがとうございますた。
0284デフォルトの名無しさん
NGNGところで、この修正の意味ですが
insertをtemplate化する事により、
vector<int> v;
list<int> l;
で
v.insert(l.begin(), l.end())
と別の型のiteratorが使えるようになる!
という理解でよろしいのでしょうか?
0285間違えた
NGNG○ v.insert(v.begin(), l.begin(), l.end())
0286デフォルトの名無しさん
NGNG不十分だろ。
vector(size_type _Count, const _Ty& _Val)
を呼んでほしいところで
template<class _It>
vector(_It _F, _It _L)
がよばれてしまうんだから。
>> {_Construct(_F, _L, _Iter_cat(_F)); }
ここで、_F が整数型のときに、_Iter_cat(_F) が Int_iterator_tag のような
適切な型のオブジェクトを返し、
それに対して _Construct()が適切に多重定義されているなら別だが。
0287デフォルトの名無しさん
NGNGとりあえず、コンストラクターに関しては引数二つ(allocator無しのとき)
は使用しなければ、回避でき?る?
vector(it1, it2)したいときには、insertを使えば。
と思ったら、insertも
void insert(iterator _P, size_type _M, const _Ty& _X)
void insert(iterator _P, _It _F, _It _L)
で同じ問題が起きるか。ぐげ。
size_type, const _Tyのコンストラクタとinsertは抹殺したくなった。
0288デフォルトの名無しさん
NGNGそうなんだ。結構根が深いんだよ、この問題は。
VC6SP5で俺がはまったときの解決策なんだが
まず次のような構造体テンプレートを作って
template<bool> struct Bool_type {};
typedef Bool_type<true> Is_integer;
typedef Bool_type<false> Is_not_integer;
template<class It>
struct Integer_traits
{ typedef Bool_type<std::numeric_limits<It>::is_integer> Integer_tag; };
たとえばvector の非公開メンバに次のような内部初期化メンバを加えて
vector::init_size(size_type, const T&)
{ /*...*/ }
template<class It>
vector::init_iter(It first, It last, Is_not_integer)
{ /*...*/ }
template<class It>
vector::init_iter(It first, It last, Is_integer)
{ init_size(first, last); }
(続く……)
0289デフォルトの名無しさん
NGNGvector::vector(size_type s, const T& v) : /* 省略 */
{ init_size(s, v); }
template<class It>
vector::vector(It first, It last) : /* 略 */
{ init_iter(first, last, Integer_traits<It>::Integer_tag()); }
俺の場合はうまくいったんだが、まあ参考ということで
0290デフォルトの名無しさん
NGNGディープですね。後でゆっくり参考にさせて頂きます。
一つ確認したいのですが、某サイトで次のような記述を見つけました。
This problem can occur whenever the code uses the two-argument constructor for vector<integer_type>
where integer_type is any integral type. This is a bug in the draft C++ standard, and the standards
committee is investigating solutions.
つまり、整数型を使用した場合に発生するバグ(仕様ミス)という事ですよね?
STLportでも、ちらっと見た限りは特に対応されおらず、同じ問題は起きると
思っています。何ちゃらEXTRA_TEMPLATE_CONSTRUCTORを使った場合ですが。
0291デフォルトの名無しさん
NGNG0292デフォルトの名無しさん
NGNGVC6 のテンプレートは貧弱で、そうそう手が打てるわけでもないから
同じところに収斂するのも不思議ではないわな
0293デフォルトの名無しさん
NGNGvector<int> a((vector<int>::size_type)10, 10)
とすれば回避できるようです。
しかし、insertは回避できないようなので技を使うか、
insertの使用をあきらめるかしかないようですね。
VC7では解決してるのですよね?
0294デフォルトの名無しさん
NGNG解決してるよ
名前は多少違うが、
整数型タグとして Int_iterator_tag って空の構造体が定義してあって。
_Iter_cat() に整数型の引数を渡すとこれを返すように多重定義してある。
これを使って、>>288の init_iter()のように _Construct() や _Insert() なんかを
多重定義してる。
0295デフォルトの名無しさん
NGNG0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNG多倍長精度整数のテンプレってないん?
まだ詳しく見てないので見落としてるだけかも
しれんが...
0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNGつーかその手のものは、他の技術計算系のライブラリを当たって探すべきだと思うが。
0300デフォルトの名無しさん
NGNGが MinGW 2.0.0-3 と Boost 1.28.0 でコンパイルできません。
shared_ptr<int> なら通りました。
0301デフォルトの名無しさん
NGNG#include <boost/weak_ptr.hpp>
してないに50000ペリカ。
0302デフォルトの名無しさん
NGNG自分がエラーメッセージ見て分からなくても他の皆は分かるだろうに…。)
0303デフォルトの名無しさん
NGNG0304デフォルトの名無しさん
NGNGgcc 使い以外は知らなくて良い。gcc 使いは info 読みましょう。
0305デフォルトの名無しさん
NGNGinfoってなんですか。
(まじすいません)
0306デフォルトの名無しさん
NGNGhttp://www.google.co.jp/search?q=gnu+info
0307デフォルトの名無しさん
NGNGそのリンクでinfoが何であるかわかるやつっているの?
0308デフォルトの名無しさん
NGNGわかるだろう。
> info - The GNU documentation browsing system
とかいう文字列が見えるし。
>>305
しかる後に
http://www.google.co.jp/search?sourceid=navclient&hl=ja&q=gcc+info+%5F%5Fattribute%5F%5F
で google ってくれ。
0309デフォルトの名無しさん
NGNG0310300
NGNG#include <boost/smart_ptr.hpp>
のままでした。
アホ でした。
逝って来ます。
>>302
エラーメッセージを張ったつもりになってました……
コピーしてちょっと他の事してたら、書き込むのを忘れてました。
ごめんなさい。やっぱり、逝って来ます。
0312デフォルトの名無しさん
NGNGbig_int<N>のような形であってもいいと思うんだが…。
>>299
boostライブラリgrepしてみたけどみつかりませんですた…。
勉強ついでに多倍長精度整数テンプレクラス。
作ってみてるよ。
今までどうやってやってるのかとても疑問だったんだが、
理論をみてみると恐ろしいほど単純だったんだね…。
目から鱗ですた。
0313デフォルトの名無しさん
NGNG<N>のNは何を入れればいいのでしょうか。桁数?桁数は可変長に
すればいいような気が。
0314デフォルトの名無しさん
NGNGhttp://www.boost.org/status/cs-win32.html
ここみると、boostは使えない?
テスト内容はrunになってるけど、そもそもコンパイル通らない(泣
0315デフォルトの名無しさん
NGNGboost::poolを使おうとするとDJGPPのm4が必要っぽい気がするが。
boost/pool/detail/pool_construct.batあたり見た感じ。
0316312
NGNG可変長も考えたが固定長にしてみた。
bitset<N>形式にするか、
vector<bool>形式にするかみたいな
感じかな。
STLとは話がずれてしまうのでsage
0317デフォルトの名無しさん
NGNGhttp://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/boost-sandbox/boost-sandbox/boost/bigint.hpp?rev=1.1&content-type=text/vnd.viewcvs-markup
↑これとかは一番単純に作っただけっぽいけど、
多倍長整数、本気で高速化しようとすると結構面倒いよ。
頑張ってくだちい。
0318デフォルトの名無しさん
NGNG0320デフォルトの名無しさん
NGNGハァ?
簡単にキャリーが取れるとかそういうレベルか?
アセンブラで一からFFT実装したくないぞ
0321デフォルトの名無しさん
NGNGそれめちゃめちゃ重要
0322デフォルトの名無しさん
NGNG四則演算だけでいいの?
0323デフォルトの名無しさん
NGNG0324322
NGNG他の実装面での面倒さに釣り合うの?
と言いたかった。
0325デフォルトの名無しさん
NGNG0326デフォルトの名無しさん
NGNG何で実装しようと基本的な四則やビット演算を定義した後は
それを利用するから問題なくないか?
0327デフォルトの名無しさん
NGNGを高速するのがアセンブラだと面倒という話ではないのか?
# 個人的には、FFTをCで書いてもAsmで書いても大して変わらんと思うけど。
0328デフォルトの名無しさん
NGNGここはSTLスレッドです。
0329デフォルトの名無しさん
NGNG廚な質問だがスレ流れ引き戻しということでご容赦してほしい、、、
vector<vector< list<double>* > > link;
のような形で、list<double>へのポインタを保存したいのだが、
構造体Hogeへのポインタ
vector<vector<Hoge*> > link;
と同じような感覚で余分なオーバーヘッドかけずに使えるもの?
○?×?
#二重vectorのオーバーヘッドはもちろん覚悟
まだSTL使い慣れてないので、なんかコンテナへのポインタに抵抗が。
0330デフォルトの名無しさん
NGNG○だろ
いちいち聞くな。
0331デフォルトの名無しさん
NGNGで、329 は、どの辺に不安をおぼえたんでしょうか。
0332デフォルトの名無しさん
NGNG0333デフォルトの名無しさん
NGNGコンストラクタに一票。
でもHogeのコンストラクタが明示
されていない諸刃の(略
0334329
NGNGコンテナにポインタをかける使い方、
list<double>* test;
とかは(あまり例題が見つからないせいもあり)使うのになんか不安を覚えました。
本当に(いちいちオブジェクトを作らずに)単なるポインタとして扱ってくれるか
確認がとりたかった次第です。
例えば、
list<list<list Hoge *> > > link;
とか連なってくると、なんかだんだん疑心暗鬼になってきました。
スマソ
0335334
NGNGすんません。
0336デフォルトの名無しさん
NGNGそれより2重vectorはオーバーヘッドが出るだけでなく例外安全性を
損なうから避けた方がいい。
0338デフォルトの名無しさん
NGNG似たような症状の方おりませんか? stlportを入れてますが、iostream
はVCのを使うようにしてます。
c:\program files\microsoft visual studio\vc98\include\fstream(217) :
error C2059: 構文エラー : '&'
c:\program files\microsoft visual studio\vc98\include\fstream(213):
クラス テンプレートのメンバ関数 'void __thiscall
std::basic_filebuf<char,struct std::char_traits<char> >::_Init(struct _iobuf *,
enum std::basic_filebuf<char,struct std::char_traits<char> >::_Initfl)' のコンパイル中
c:\program files\microsoft visual studio\vc98\include\fstream(218) :
error C2143: 構文エラー : ';' が '}' の前に必要です。
c:\program files\microsoft visual studio\vc98\include\fstream(213):
クラス テンプレートのメンバ関数 'void __thiscall std::basic_filebuf<char,struct std::char_traits<char> >::_Init(struct _iobuf *,
enum std::basic_filebuf<char,struct std::char_traits<char> >::_Initfl)' のコンパイル中
#このスレじゃまずいかな・・
0339デフォルトの名無しさん
NGNG#include <stream> は <fstream> の間違いです。
0340デフォルトの名無しさん
NGNG寝ぼけて.cppのど真ん中でincludeしてたせいですた。
なんでそれだとだめなのかわかんないけど。。。。
0341デフォルトの名無しさん
NGNG例えば、
vector<vector<int> > v;
v.push_back(vector(10, 3));
v.push_back(vector(20, 2));
v.push_back(vector(30, 4));
まで成功していたとして、
v.erase(v.begin());
とすると、内部では
v[0] = v[1];
v[1] = v[2];
v[2].~vector<int>();
--(vのサイズ);
という処理が行われる。
ここでもし2番目の代入演算子が例外を投げると、vectorの中身は
{{20, 20}, {20, 20}, {30, 30, 30, 30}}
という状態になってしまい、処理が失敗したのにvectorの中が変わる、
という状況が起こる。例外をキャッチしても、どこが書き変わったかは、
例外が起こった場所によって変わるから、結局例外が起こった場合
vectorの中身は全く信用できなくなる。ただ、vectorが壊れるわけでは
ないから、開放だけは安全に実行できる。
コピーコンストラクタ、代入演算子が例外を投げる場合は、コンテナに
入れるとどうしてもこの種の問題が起こるから、例外が起こったら
有無を言わさず開放してしまうか、あるいは例外を起こすオブジェクトを
コンテナに入れる時はshared_ptrにくるんでから入れるのが正解。
0342デフォルトの名無しさん
NGNG0343337
NGNG詳しい説明サンクスです。
>コピーコンストラクタ、代入演算子が例外を投げる場合は...
たしかPart1にも書いてあったやつですね。
確かにユーザクラスであれば考慮して例外をなくすこともできるが、
STLのであれば…どうしようもありませんね。
>shared_ptr
shared_ptrは上記の操作では例外を投げないことを保証
してるってことなのかな?
まだshared_ptrは見ていないので、後ほど参照してみまつ。
ありがとうございますた。
0344デフォルトの名無しさん
NGNGmapにmapを持たせて
↓
map< string, map< string, string > > inimap;
insertで値を代入したいんですが、
「含まれる方のmap」を先に作っておいて
↓
map< string, string > temp;
temp.insert(map< string, string >::value_type(key, value));
inimap.insert(map< string, map< string, string > >::value_type(section, temp));
↑
とやるしか方法は無いんでしょうか?
>map< string, string > temp;
の部分は、どうせ1要素しか必要無いんだからpair型(でしたっけ?)
かなんかで代用できるんじゃないのかーとか思ったんですが
イマイチ良くわかりません
ちなみにtempを作らないで1行で済まそうとしたらコンパイラに怒られました・・・
//直上でコンテナ内コンテナの危険性について触れていて
//本当にこんな事して良いのか不安ですけど・・・
0345デフォルトの名無しさん
NGNG単純にmapのコンストラクタを使えばいいんじゃない?
int main()
{
std::map<std::string, std::map<std::string, std::string > > inimap;
inimap.insert(std::make_pair("abc", std::map<std::string, std::string>()));
inimap["abc"].insert(std::make_pair("def", "ghi"));
std::cout << inimap["abc"]["def"] << std::endl;
}
0346デフォルトの名無しさん
NGNG(2)value_typeを使う。
inimap.insert(std::map<std::string, std::map<std::string, std::string> >::value_type("abc", std::map<std::string, std::string>()));
(3)pairを使う。
inimap.insert(std::pair<std::string, std::map<std::string, std::string> >("abc", std::map<std::string, std::string>()));
0347デフォルトの名無しさん
NGNGその方法だと(345氏の例に倣えば)
inimap["abc"][] と inimap["abc"]["def"] の2つの要素ができちゃわないですか?
理想としては狙った1要素だけinsertしたいんですが
例えば
std::pair< std::map< std::string, std::string > > PairTemp("def", "ghi");
みたいな方法って無いんでしょうか
要は1要素しか扱わないのにわざわざ新しくmapを宣言するのが
もったいないというか、非効率なんじゃないかと思ったワケでして・・・
0348デフォルトの名無しさん
NGNGそれなら単に
inimap["abc"]["def"] = "ghi";
とすればいいのでは。それから、inimap["abc"][]という空のmapと
inimap["abc"]["def"]という中身の入ったmapは同時には存在しない。
0349デフォルトの名無しさん
NGNGなるほど・・・
[]演算子だと「該当するキーが見つからなくて新たに挿入する場合」に
余計に時間がかかってしまうからinsertの方が良いかと思ったんですけど
そもそもmap持ちmapとかやってるヤシが気にする事じゃないっすか・・・
0350デフォルトの名無しさん
NGNG実はinsertで何とかしようとして、いろいろやってみたんですが、
mapの中にmapがある場合、コンストラクタだけでは足りないようです。
insert関数が何かやっているようなのですが。
どなたかこのコードを通るようにして下さいませんか。
typedef std::map<std::string, std::string> MapStringString;
typedef std::map<std::string, MapStringString> MapStringMapStringString;
MapStringMapStringString inimap;
MapStringString i2;
i2.insert(MapStringString::value_type("def", "ghi"));
inimap.insert(MapStringMapStringString::value_type("abc", i2));
inimap.insert(MapStringMapStringString::value_type("abc", MapStringString("def", "ghi"))); //この行が通らない
std::cout << inimap["abc"]["def"] << std::endl;
0351デフォルトの名無しさん
NGNGtypedef std::map<std::string, std::string> MapStringString;
typedef std::map<std::string, MapStringString> MapStringMapStringString;
MapStringMapStringString inimap;
MapStringString i2;
i2.insert(MapStringString::value_type("def", "ghi"));
inimap.insert(MapStringMapStringString::value_type("abc", i2));
inimap.insert(MapStringMapStringString::value_type("abc", MapStringString::value_type("def", "ghi"))); //この行が通らない
std::cout << inimap["abc"]["def"] << std::endl;
0352デフォルトの名無しさん
NGNGあ〜
>344で言った「1行にまとめるとコンパイルエラー」って
ソレの事です
なんで通らないんでしょうねぇ・・・
0353デフォルトの名無しさん
NGNGなるほど、ここまで考えられて行き詰まっておられたのですか。
自然な考えでは、MapStringStringのコンストラクタを渡せば認識
してくれるはずなんですが。insert()関数に問題がありそうです。
0354デフォルトの名無しさん
NGNG一時変数を返すのではないということです。
それで、pairとmapがかみ合わず、エラーが出るのではないでしょうか。
ですから、何とかしてmap型の一時変数を生成すればコンパイルは
通るはずです。
0355デフォルトの名無しさん
NGNGはないようなので、std::map型の一時変数を生成することはできないよう
です。うーむ残念。
0356デフォルトの名無しさん
NGNGエラーになってしまいます。
#include <algorithm>
#include <list>
#include <iterator>
std::list<int> coll;
std::remove(coll.begin(), coll.end(), std::ostream_iterator(std::cout, " ")); // エラー
なぜか、std::を付けると、remove(const char*)の方を呼び出そうとして
エラーになります。std::を取ると正常にコンパイルできます。多重解決が
うまくできてないように見えます。
STLPortではalgorithmで定義されているアルゴリズムは、std::をつけるとだめ
なのでしょうか?
0357デフォルトの名無しさん
NGNGちなみにgcc3.2(MinGW)でコンパイルすると、std::removeとしても
正常にコンパイルできます(そうあって欲しいものです)。
0358デフォルトの名無しさん
NGNG0359デフォルトの名無しさん
NGNGいろいろやってみた所、とBorland-C++5.6内蔵のSTLPortでだけ
エラーになるようです。これはバグということになるでしょうね。
どうも使いづらいです。かと言ってこの記事をC Buider相談室
に書いても多分無視されるでしょうし・・・・
0360デフォルトの名無しさん
NGNGchar*を引数にとり、そこへ結果を入れて返す関数に渡した場合
その結果は未定義のカタマリですか?
std::string buffer;
buffer.reserve(1024);
snprintf(buffer.begin(), 1024, "test", 0);
みたいな・・・
0361デフォルトの名無しさん
NGNG(;´Д`) アアッ...
0363デフォルトの名無しさん
NGNGsnprintf(&chbuf[0], 1024 ...
とか
0364360
NGNG具体的にやりたいことは、iniファイルの内容を
std::map< std::string, std::map< std::string, std::string > >
に取り込むという作業でして、現在の実装が
/* もちろんおそろしくて実行していませんがコンパイルは通ります */
#define INIMAP std::map< std::string, std::map< std::string, std::string > >
#define STRMAP std::map< std::string, std::string >
std::string SectionTemp, EntryTemp;
SectionTemp.reserve(MAX_LINE_LENGTH);
EntryTemp.reserve(MAX_ENTRY_LENGTH);
// iniファイルに含まれるセクションを全て取り出す
GetPrivateProfileSectionNames(SectionTemp.begin(), MAX_LINE_LENGTH, FilePath.c_str());
// 全てのセクションに対して処理されるまで繰り返す
while (SectionTemp.length()) {
// 現在のセクションをIniMapに登録する
IniMap.insert(INIMAP::value_type(SectionTemp.c_str(), STRMAP()));
// 現在のセクションに含まれる全てのエントリを取り出す
GetPrivateProfileSection(SectionTemp.c_str(), EntryTemp.begin(), MAX_ENTRY_LENGTH, FilePath.c_str());
// 全てのエントリに対して処理されるまで繰り返す
while (EntryTemp.length()) {
// エントリを'='で分解してIniMapに登録する
IniMap[SectionTemp.c_str()].insert(STRMAP::value_type(EntryTemp.substr(0, EntryTemp.find('=', 0)), &EntryTemp[EntryTemp.find('=', 0)+1]));
// 処理の終わったエントリを削除する
EntryTemp.erase(0, EntryTemp.find('\0', 0));
}
// 処理の終わったセクションを削除する
SectionTemp.erase(0, SectionTemp.find('\0', 0));
}
0365360
NGNG非常にややこしい事になってしまうんです
範囲削除もなかなか一筋縄ではいかなかったので
できればstringで実装したいんです
どうにかならないでしょうか?
0366360
NGNGGetPrivateProfileSectionNamesの事書くの忘れてました
こいつは渡したバッファに
「セクション1\0セクション2\0セクション3\0セクション4\0\0」
みたいな感じでiniファイルにある全てのセクションを返してきます
GetPrivateProfileSectionのほうは
「キー1=値1\0キー2=値2\0キー3=値3\0\0」
といった感じです
0367デフォルトの名無しさん
NGNGちょっとデータの構造が違いますがプログラムを作ってみました。
#include <iostream>
#include <fstream>
#include <string>
#include <map>
const char* FILENAME = "ODBCINST.INI";
typedef std::map<std::string, std::string> MSS;
typedef std::map<std::string, MSS> MSMSS;
int main()
{
MSMSS inimap;
MSS tmp;
std::string buf, seckey, value1, value2;
int state = 0;
std::ifstream ifs(FILENAME);
0368デフォルトの名無しさん
NGNGif (!getline(ifs, buf)) break;
if (buf.length() && buf[0] == '[') {
inimap.insert(std::make_pair(buf, MSS()));
seckey = buf;
} else if (buf.length() == 0)
continue;
else {
value1 = buf.substr(0, buf.find("="));
inimap[seckey][value1] = buf.substr(buf.find("=") + 1);;
}
}
MSMSS::const_iterator pos = inimap.begin();
for (; pos != inimap.end(); ++pos) {
std::cout << pos->first << std::endl;
MSS::const_iterator pos2 = pos->second.begin();
for (; pos2 != pos->second.end(); ++pos2)
std::cout << pos2->first << '=' << pos2->second << std::endl;
}
}
0369デフォルトの名無しさん
NGNG自身にpush_backするのは安全でつか??
0370デフォルトの名無しさん
NGNGvectorを継承するということは、vectorを「実装手段とする」ということ?
もしそうだったら、包含を使った方がよいです。
もし public派生なら、vectorの反復子は派生したクラスを正しく指せる
ように実装すべきでしょう。
0371デフォルトの名無しさん
NGNGpublic派生です
0372デフォルトの名無しさん
NGNG「vectorの反復子は派生したクラスを正しく指せる ように実装すべきでしょう。」
の意味がわかんないです・・・
0373デフォルトの名無しさん
NGNGvectorから派生したコンテナクラスは、vectorの一種であるから、vectorの
反復子も派生したコンテナを指せないといけない。そうしないと、オブジェクト
指向の大前提が崩れてしまう。
例えばvectorから派生したクラス名をneo_vectorとすると、
neo_vector<int> p;
vector<int>::iterator pos = p.begin();
のような事ができなければならない。
0374デフォルトの名無しさん
NGNGとして宣言されてないと都合が悪いことになるな・・・・
実際はどうなんでしょうか?識者の方でこの当たりの事を実験してみら
れた方はいらっしゃいません?
0375369
NGNG特に何も書かなくてもコンパイルできてしまうんですが、
これじゃまずいってことですよねえ?
#include <vector>
using namespace std;
template < typename T >
class neo_vector : public vector<T> {};
class neo_vector2 : public vector<int> {};
int main( void ) {
neo_vector<int> v;
vector<int>::iterator pos = v.begin();
neo_vector2 vv;
vector<int>::iterator pos2 = vv.begin();
}
0376369
NGNG包含しておいてconstな参照だけ露呈してしまってもいいんですけど。。
0377360
NGNGえーと、最初は私もifstream使ってやってたんですけど
不正なエントリを弾いたり重複を無視したり
そういう細かい処理はAPIが提供してくれるからまかせてしまおうと
GetPrivateProfile〜を使った実装に変えたんです
今回の質問の大筋は、char*の配列の変わりになりうる
STL(あるいはC++標準)のコンテナが無いかという事でして・・・
できればstringのように、範囲削除とか部分参照が簡単にできないかなぁと
まぁそんなわけなのですが、どうにかならんもんでしょうか
0378デフォルトの名無しさん
NGNGなく、コンテナの中身を指すんですよね。
だから、こういう場合反復子がオブジェクト指向かどうかという問題は
ちょっと違うような気がしました。
むしろ、次のような場合に問題が起きないようにすべきかも。
neo_vector<int> p;
vector<int>* vp = &p;
0379デフォルトの名無しさん
NGNG0380デフォルトの名無しさん
NGNG済みません、書けば書くほどボロが出てくるようなので今日はこの辺で
逃げます。(汗
0381360
NGNG「データ\0データ\0データ\0\0」というchar配列(vector<char>でも)を
stringにまるまるコピーする事って可能ですか?
普通に=演算子とかassign()を使っても、最初の\0までしかコピーされないですよね?
std::copy(charvector.begin(), charvector.end()-1, targetstring);
みたいな事ってできますか?
0382デフォルトの名無しさん
NGNG0383360
NGNG0385360
NGNG違うんですか?
環境はBCCなんですが
0386デフォルトの名無しさん
NGNG0387デフォルトの名無しさん
NGNGC++標準ライブラリより。
std::string s(5, '\0');
s.length() == 5
0388デフォルトの名無しさん
NGNG0389デフォルトの名無しさん
NGNG0390360
NGNGいや、std::copy(charvector.begin(), charvector.end()-1, targetstring);
ってコンパイルできませんよ?
例えば上記のような処理ってできないんですか?っていう質問なんですが・・・
>384,>387
最後の\0までの長さなんですね・・・失礼しました
0391360
NGNG誰もそんなこと言ってませんよ・・・
0392デフォルトの名無しさん
NGNGこれを応用してやってみて下さい。
int main()
{
std::string str(100, '\0');
std::string dst;
std::copy(str.begin(), str.end(), std::back_inserter(dst));
std::cout << "dst length = " << dst.length() << std::endl;
}
0393デフォルトの名無しさん
NGNG0394デフォルトの名無しさん
NGNG0395デフォルトの名無しさん
NGNG0396デフォルトの名無しさん
NGNG0397デフォルトの名無しさん
NGNG0398デフォルトの名無しさん
NGNG0399デフォルトの名無しさん
NGNG0401デフォルトの名無しさん
NGNG0402デフォルトの名無しさん
NGNG0403デフォルトの名無しさん
NGNG0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNG0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNG0408デフォルトの名無しさん
NGNG0409デフォルトの名無しさん
NGNG0410デフォルトの名無しさん
NGNG0411デフォルトの名無しさん
NGNG0412デフォルトの名無しさん
NGNG(´-`).。o○(結構深夜でも見てる人いたんだね...
0413デフォルトの名無しさん
NGNG0414デフォルトの名無しさん
NGNG0415デフォルトの名無しさん
NGNG(´-`).。o○(セクース話しかしてないのにな.....
0416デフォルトの名無しさん
NGNG●●●●●●●●「オセロさえ納期内に作れない=OO役立たず 」祭り●●●●●●●
/| | |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ
| | | ̄ ̄ ̄ /| ||
| | | / /|TTTTTT TTTTTTTTTT||TTTTT
| /\ | /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^
| / / |// / /|
| / / |_|/|/|/|/|
| / / |文|/ // /
|/ /. _.| ̄|/|/|/ Λ_Λ
/|\/ / / |/ / (___)
/| / / /ヽ /〔 非OO 〕〕つ
| | ̄| | |ヽ/l `/二二ヽ
| | |/| |__|/ Λ_Λ / /(_)
| |/| |/ ( ´∀`) (_) Λ_Λ
| | |/ // / ^ ̄]゚ (` )
| |/ ゚/ ̄ ̄_ヽ ⊂〔〔 非OO 〕
0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNGここまで必死になって飛ばしたい恥ずかしいレスはどれだ?
>388=>393あたりか?
0419デフォルトの名無しさん
NGNG0420デフォルトの名無しさん
NGNGいや、片っ端からageて回られているようです。
OO信者さんの巡回ではないでしょうか?
0421デフォルトの名無しさん
NGNGえ、オセロの祭りやってんのは非OO信者じゃないの?
0422デフォルトの名無しさん
NGNG0423デフォルトの名無しさん
NGNG0424デフォルトの名無しさん
NGNG0425デフォルトの名無しさん
NGNG0426デフォルトの名無しさん
NGNG0427デフォルトの名無しさん
NGNG0428デフォルトの名無しさん
NGNG0429デフォルトの名無しさん
NGNG(´-`).。o○(どうせ教科書どおりに書いても遅いだろうし…
0430デフォルトの名無しさん
NGNG(´-`).。o○(…std::sortに至ってはqsortより一桁速いし…)
0431デフォルトの名無しさん
NGNGあふぉ
>>430
ちょびっとだけあふぉ
0432デフォルトの名無しさん
NGNG0433デフォルトの名無しさん
NGNG(´-`).。o○(とかマジレスしてみようかな...
0434デフォルトの名無しさん
NGNG0435デフォルトの名無しさん
NGNG0436デフォルトの名無しさん
NGNG(´-`).。o○(とか言ってみようかな...
0437デフォルトの名無しさん
NGNG0438デフォルトの名無しさん
NGNG0439デフォルトの名無しさん
NGNG0441デフォルトの名無しさん
NGNG(´-`).。o○(>>403であることと昨日の道程君であることとは独立だね..
0443デフォルトの名無しさん
NGNGなんで引数に副作用をもたらすことができるる
for_eachってないの?
あると何かと便利だとおもうんだが…
boostにあったら...ごめんなさい。
0444デフォルトの名無しさん
NGNG(´-`).。o○( for_each って引数に副作用をもたらすことができるけど?
void add_1( int& n ) { n = n+1; }
for_each( c.begin(), c.end(), add_1 );
0445デフォルトの名無しさん
NGNG(´-`).。o○(確かSTLでは引数の変更は禁止しているはずだけど...
(´-`).。o○(あ、ここでの引数とは、ファンクタを除外した話しね...
0446デフォルトの名無しさん
NGNG(´-`).。o○(std::transformではダメなのか?
0447デフォルトの名無しさん
NGNG(´-`).。o○(確かtransformは出力先の変更を許しているだけで、
入力元の変更は許してないはず...
ってかVCだと平気で入力元の変更できちゃうね。
もしかして単に入力反復子を認めるために禁止しているだけで
あって、利用者が前方反復子の保証さえ持てば変更しても
構わないのかな?
(´-`).。o○(んなワケないか...
0448デフォルトの名無しさん
NGNGend()-1ってのは意図した動作とは違うと思う。
0449デフォルトの名無しさん
NGNGなければ新しく作成しようとするんですか?
0450デフォルトの名無しさん
NGNGそういう仕様だから。
0451デフォルトの名無しさん
NGNG0452443
NGNG以下、引用の要約
for_each()アルゴリズムはシーケンス変更なしの
アルゴリズムに分類されているけど、それは明示的に
(必ずしも)変更されるわけではないかららしいです。
ってことで、シーケンスの変更は可能です。
またtransformについては分類上シーケンス変更アル
ゴリズムですが、こちらも同様入力シーケンスが変更
される可能性があるようです。
ってことでウソついちゃった♪
(>ν< )> テヘッ♪
0453デフォルトの名無しさん
NGNGmap<int, std::string> m;
m[1] = "abc";
とすると、m[1]が存在しなくても、pair<int, std::string>(1, "abc");
を挿入してくれる。もし新しく作成してくれなかったら、空のm[1]
を作ってから代入しなければならなかったろう。
0454デフォルトの名無しさん
NGNGstd::map<std::string, std::string> cont;
string str=cont["ne-yo!"];
こうした場合、どういった動作を望んでるの?
exception?
でも存在確認はfindでできるのでexceptionと
似た操作は行えるし...
0456デフォルトの名無しさん
NGNG...ど、どつきあいしてください?
0457デフォルトの名無しさん
NGNG0458デフォルトの名無しさん
NGNG0459デフォルトの名無しさん
NGNGstd::vector< const Foo* > v; があるとき、v の内容を Foo::getLength()
の結果の順にstd::sortしたいんですが、単にsortするとポインタのアドレス
順になってしまいますよね…。
operator< を定義すればよいのでしょうか? ちょっと方法が思いつかないので
教えていただけませんか。比較のために
std::binary_function< const Foo*, const Foo*, bool>
を継承したclassを一つ作る?しかないですか???
0460デフォルトの名無しさん
NGNGboostを入れて、
#include <boost/compose.hpp>
std::sort( v.begin(), v.end(),
boost::compose_f_gx_hy( // or SGI-STL の std::compose2
std::less<int>(),
std::mem_fun(&Foo::getLength),
std::mem_fun(&Foo::getLength) ));
とか。
(´-`).。oO( でもbinary_function継承クラスを作った方がわかりやすいかも・・・
0461デフォルトの名無しさん
NGNGす、すごい。僕の脳では絶対におもいつきません…
やってみます。どうも。
0463デフォルトの名無しさん
NGNG0464チンコ
NGNG0465459
NGNGVC6+STLPort と g++ 2.96/3.2 です。
0466デフォルトの名無しさん
NGNG戻りがvoidなメンバ関数を std::mem_fun() すると、
error C2562 (voidが戻りの関数で値を返そうとした) と怒られ、
コンパイルできません。
これは確かVCの有名な不具合だったと思うのですが、うまい回避方法って
ないのでしょうか? いまは、仕方がないので関数の戻りを意味もなくbool
にしています。
なにか知恵をくださいませ。
0467デフォルトの名無しさん
NGNG使おうと思ったのですが、不可解なコンパイルエラーがたくさん出て
困っています。同様の環境で使われている人はいらっしゃいますか?
とくに/usr/include/boost/*/detail/*hppのファイルにおいて
たくさんのシンタックスエラーが発生します。
テストしてみたサンプルは以下のような簡単なものです。
$cat test1.cc
#include<boost/lambda/lambda.hpp>
int main(){
boost::function<int,int,int> f;
}
$g++-3.2 test1.cc -o test1 -lboost_thread \
-I/usr/include/g++-3/ -I/usr/include/stlport/
何か助言があれば教えてください
0468デフォルトの名無しさん
NGNGcompose2はf(g(x))のような合成関数を導くアダプタのようですね。
0469デフォルトの名無しさん
NGNGboost::mem_fn。これ。
>>467
1.28だとgcc3.2リリースより前の版だから、知らないコンパイラだぞゴルァという
警告が大量に出るが、それではなくて他にもエラーが出るのか?
とりあえずlambdaを使いたいのかfunctionを使いたいのかthreadを使いたいのか
はっきりしてから、最初の一個のエラーメッセージくらい貼り付けれ。
つーか、STLと別にboostスレ建てた方がよいかもね...
0470デフォルトの名無しさん
NGNGg++-3.2から/usr/include/c++/3.2/
などという新しいディレクトリ下のファイルを使うことに
なっているみたいなのですが(/usr/include/g++-3は使わない)、
これはg++の環境の話なのでGCCスレにいってきます。
ちなみに3.2の/usr/include/c++/3.2/にはヘッダーファイルに
stlportの拡張も一部取り込まれているみたいなので、
467を以下のようにシンプルな感じにしたらコンパイルは通りました。
$cat test1.cc
//#include<boost/lambda/lambda.hpp>
#include<boost/function.hpp>
int main(){
boost::function<int,int,int> f;
}
$g++-3.2 test1.cc -o test1 -I/usr/include/c++/3.2/
gccはc++のABI変更もあったので早いところ3.0,3.1系は廃棄処分に
してほしいですね(/usr/include/g++-3は2.95系専用という位置付けで)。
gccに依存した配布系でそれら古いものが使われることもないだろうし。。。
ちなみにboostスレは欲しいですね。でもgenerative programming
スレもそろそろ新スレが必要な頃だし、いいタイトルを付けてそっちと
一緒にやっていくのもいいかもしれないです。
0471デフォルトの名無しさん
NGNG○(/usr/include/g++-3は使わなくてもよい)
0472デフォルトの名無しさん
NGNG【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/
0473デフォルトの名無しさん
NGNGスレ立てた後に言うのもなんだが...
細分化されると見づらくなる…。
0474デフォルトの名無しさん
NGNGない今現在、boostを入れる意味があるのか悩んでしまった。
標準STLの欠点をうまく補ってくれる点ではありがたいのだが。
0475デフォルトの名無しさん
NGNG一部分使うだけでも、便利でええやん。
0477デフォルトの名無しさん
NGNGstd::mapで、キーの方を変更するには、どのようにしたらよいでしょうか。
例えば、std::map<std::string, std::string> m; で、
m.insert(std::make_pair("abc", "def"));
std::map<std::string, std::string>::iterator pos = m.begin();
m->first = "ghi";
とするとエラーが出ます。firstはconstのようなのです。何かスマートな
方法があるのでしょうか。
0478デフォルトの名無しさん
NGNG0479デフォルトの名無しさん
NGNGerase して insert し直す必要があります。
仮に、強引にエラーを回避してキーだけ書き換えれたとしても、そんなことしたらBツリーが壊れてしまうので、やっちゃだめです。
0480デフォルトの名無しさん
NGNGレスありがとうございます。やっぱりそうなのですか。
確かにキャストを使って無理矢理キーを書き換えたらできないことも
なさそうですが、キーがソート順でなくなってしまいますね。
どうもありがとうございました。
0481デフォルトの名無しさん
NGNGfind_if して、見つかった要素に何らかの Func unaryfunc を適用するようなのって
ありませんかね?boostでもいいです。
find_if と transform かなにかを組み合わせて自分で書くしかないですか?
0482デフォルトの名無しさん
NGNGtransformよりはfor_eachかも
0484デフォルトの名無しさん
NGNG0485デフォルトの名無しさん
NGNGVC++ではつかえないとか、CVS版のboostにしか入ってないとか
ありますか? なんか
error C2039: 'make_indirect_iterator' : 'boost' のメンバではありません。
らしい。鬱。。
0486デフォルトの名無しさん
NGNGtemplate <class OuterIterator>
inline typename indirect_iterator_generator<OuterIterator>::type
make_indirect_iterator(OuterIterator base)
だってさーあははははははははははは(涙
0487デフォルトの名無しさん
NGNG他のコンパイラに問題が無いわけじゃないけど、なんで
一番潤ってる企業の出すコンパイラがヘボイわけ?
ユーザー数が多いからって開き直ってるとしか思えない。
0488デフォルトの名無しさん
NGNGストレスで禿げるほど同意。
VC6にはSP6って出ないんですかねえ・・・・
0489481
NGNGtemplate < typename InIter, typename UnPred, typename Func >
inline bool apply_one_if( InIter start, InIter end, UnPred pfn, Func unaryfunc ) {
InIter result = std::find_if( start, end, pfn );
if ( result == end ) {
return false;
}
unaryfunc( *(result) );
return true;
}
}
でOKでしょうか?
0490デフォルトの名無しさん
NGNG少しはましになってる?
0491デフォルトの名無しさん
NGNG0492デフォルトの名無しさん
NGNGstd::list<something> any;
std::list<something>::const_iterator i = any.end();
--i; //ココ
って合法か教えていただけませんでしょうか?
0493デフォルトの名無しさん
NGNGany.size() > 0なら、合法じゃないか。
0494デフォルトの名無しさん
NGNGlist<>::iteratorは双方向反復子だから、any.begin() != any.end();なら
--i は使用可能です。
0495デフォルトの名無しさん
NGNG0496デフォルトの名無しさん
NGNGtemplate<typename T> struct Fn : public std::binary_function<std::auto_ptr<T>, std::auto_ptr<T>, bool> {
bool operator() (std::auto_ptr<T> f, std::auto_ptr<T> s) const {
return f->geti() < s->geti();
}
};
class For_auto {
int i;
public:
int geti() const { return i; }
For_auto(int j) : i(j) {}
};
int main()
{
std::auto_ptr<For_auto> a(new For_auto(1));
std::auto_ptr<For_auto> b(new For_auto(2));
std::cout << std::max(a, b, Fn<For_auto>())->geti() << std::endl;
}
0497デフォルトの名無しさん
NGNG漏れそっちの元質問者(汗
0498デフォルトの名無しさん
NGNGそうそう(汗。
どうもstd::auto_ptrは使ったことないもんで、多分関数オブジェクトを
呼び出す時、仮引数(のようなもの)に所有権が渡ってクラッシュする
らしいです。
しかも、関数オブジェクトは同名のオーバーロードをするとエラーになる
ことがわかって(汗^2 です。
constな参照で受けるっつーのはだめなの?
0500デフォルトの名無しさん
NGNG動いたーありがとうございます!!
でもどうしてconstな参照にするとクラッシュしなくなるのでしょうか?
std::auto_ptrの特殊性によるものでしょうか。
0501デフォルトの名無しさん
NGNG動いた奴貼ってけろ
参照なら所有権が移らないから。
別にconstは無くてもいいんだけど、constなものは普通constにする。
0503デフォルトの名無しさん
NGNGなるほどまた一つ勉強になりました。
>>501
貼ります
template<typename T> struct Fn : public std::binary_function<const std::auto_ptr<T>&, const std::auto_ptr<T>&, bool> {
bool operator() (const std::auto_ptr<T>& f, const std::auto_ptr<T>& s) const {
return f->geti() < s->geti();
}
};
class For_auto {
int i;
public:
int geti() const { return i; }
For_auto(int j) : i(j) {}
};
int main()
{
std::auto_ptr<For_auto> a(new For_auto(1));
std::auto_ptr<For_auto> b(new For_auto(2));
std::cout << std::max(a, b, Fn<For_auto>())->geti() << std::endl;
}
0504デフォルトの名無しさん
NGNGコピーすると所有権が移るから今回のようなケースではconst
云々ではなく、参照にしないとだめ。
このクセがあるからコンテナには使えないと聞いた。
0505デフォルトの名無しさん
NGNG0506デフォルトの名無しさん
NGNGa と b の大小を比較するために
> bool operator() (std::auto_ptr<T> f, std::auto_ptr<T> s) const
が呼ばれるとき、a と b が引数の f と s にコピーされるでしょ。
auto_ptr をコピーすると、元の a と b は所有権を失って NULL になってしまうです。
関数から戻ってきたら、a も b も NULL になってるから、
> max(a, b, Fn<For_auto>())->geti()
最後に geti を呼んだときに落ちる。
0507デフォルトの名無しさん
NGNGありがとうございます。やっぱりそうですね。関数オブジェクトは普通の
関数とは違うのかと思っていましたが、同じように考えればいいのですね。
>>505
boostもインストールしたんですが、イマイチ使い方がわからない状態
なのです。参考書も売られていないし。まずはstd::auto_ptrを使って、
その利点と欠点を知り尽くした後にboostのスマートポインタを使って
みようかと。
shared_ptrとかweak_ptrとかいろいろ種類があるようですね。
0508デフォルトの名無しさん
NGNGとりあえず触りだけなら
Let's boost
http://www.kmonos.net/alang/boost/
0510デフォルトの名無しさん
NGNGありがとうございます!!さっそく覗かせていただきます。
>>509
いやあ漢だなんて、買いかぶり過ぎっす。自分の性格的に、骨まで
しゃぶり尽くしたいという衝動がありまして。言語要素にも、存在意義
というものを一つ一つ見いだしたいのです。
0511デフォルトの名無しさん
NGNGtemplate< typename T > struct identity : public std::unary_function< T, T > {
result_type operator() ( argument_type arg ) const {
return arg;
}
};
}
で、"implicit typename is deprecated" っておこられるんですが、これって
gcc 3.2 のバグですか?なんか間違ったことかいてますでしょうか。
0512デフォルトの名無しさん
NGNGtypename std::unary_function< T, T >::result_type operator() ( typename std::unary_function< T, T >::result_type arg );
俺はTを直接使ったほうがいいと結論しました
参照:(520が俺)
GCCについて
http://pc3.2ch.net/test/read.cgi/tech/1007731543/520-
0513デフォルトの名無しさん
NGNGresult_typeとargument_typeの前にstd::を付ければ。
0514デフォルトの名無しさん
NGNGうひゃー。でもTを直接つかうなら継承しなくていいよなぁ・・・・・
この警告は勘弁してほしいです。
0515デフォルトの名無しさん
NGNGよくわからんが、ヘッダファイルの中で
typedef T result_type;
のようになっているからだろう。
typedef typename T result_type;
となっていれば警告が出なかったかもしれない。
0516514
NGNG些細なことだけど
typename std::unary_function< T, T >::result_type operator() ( typename std::unary_function< T, T >::argument_type arg );
やね。
0517514
NGNGlibstdc++なおしてくれーって感じっすか。
0518デフォルトの名無しさん
NGNGnamespace hogeratta {
template <typename T>
struct identity : public std::unary_function<T, T> {
typename identity::result_type operator() (typename identity::argumet_type arg) const {
return arg;
}
};
}
で動くよ。やってみそ。
0519514
NGNG動いた!ありがとう。
0520デフォルトの名無しさん
NGNGSTRMAP mymap;
とした場合、mymap["test"]が存在するか不定として
mymap["test"].assign("any string");
と
if (mymap.count("test") == 0)
{
mymap.insert(STRMAP::value_type("test","any string"));
}
はどっちが高速であると予想されますか?
0521デフォルトの名無しさん
NGNG・前者は デフォルトコンストラクタ + 代入 の2段階になる
・後者は コピーコンストラクタ一発で済むかもしれない、かわりに
二分木をたどる処理が2回必要になるかもしれない
っつーか実装/環境による。
0522デフォルトの名無しさん
NGNGinsert()は定数時間が保証されるとか
operator[]()はキーが無い場合対数時間が要求されるとか
そういう単純な話ではないのですか?
0523521
NGNG・insert() の保証は O( log n )。
・operator[] はキーがあろうがなかろうが保証は O( log n ) まで。
・count() も同じ O( log n )。
結局どっちも O( log n ) だから速度のオーダは変わらない。おしまい。
が、前者ならstringのデフォルトコンストラクタのオーバーヘッドが
かかる(これがmapの操作と比較してどの程度の重さかはわからない)し、
後者はconutとinsertの二回木を下る分遅いかもしれない。
が、同じキーに対する探索はキャッシュされる実装になってて
事実上一回で終わって後者でも速かったりするかもしれず…etc。
0524デフォルトの名無しさん
NGNGよくわかりましたありがとう
(自分の質問が頓珍漢であることが・・・)
0525デフォルトの名無しさん
NGNG高速性を求めるなら、これでどうかな・・・。
でも mymap["test"]="any string"; の方が読みやすくて良いと思うぞ。
string key("test");
STRMAP::iterator i = mymap.lower_bound(key);
if(i != mymap.end() && i->first == key){
i->second.assign("any string");
}else{
mymap.insert(i, STRMAP::value_type(key, "any string"));
}
0526デフォルトの名無しさん
NGNGそもそも、"test"が存在する場合は上書きするつもり?しないつもり?
しかもなぜただのmapでcount()を使う?
上書きするつもりとして、ノードの追加には成功したが、文字列の代入は
例外で失敗した場合に、mapの中身が変わってしまうのがいやなら、
>>525のコードで、代入に失敗したら単にmapを消してしまうつもりなら
mymap["test"]="any string";だろう。
0527デフォルトの名無しさん
NGNG0528デフォルトの名無しさん
NGNG後者は
if (mymap.count("test") == 0)
{
mymap.insert(STRMAP::value_type("test","any string"));
}
else
{
mymap["test"].assign("any string");
}
のつもりです
というか、setとごっちゃに理解してたようであります・・・
0529デフォルトの名無しさん
NGNG0530デフォルトの名無しさん
NGNG0531デフォルトの名無しさん
NGNGでも意味がイマイチわからない…。
sort()、uniq()を一発でできるアルゴリズムが
用意されているかってこと?
0532デフォルトの名無しさん
NGNG自作しれ
0533デフォルトの名無しさん
NGNGごく単純に
sort(from,to,fn);
uniq(from,to,fn);
と書くより効率の良い方法はあるかなぁとふと思いました。
抽象的すぎて答えようがないですかねえ・・・・・・
0534デフォルトの名無しさん
NGNGってことはsortは必須。
そういうもの。
ってか、
・順序付け
・ユニーク
ならmapかset使えば?
0535デフォルトの名無しさん
NGNGいえてる!ありがと。
0536デフォルトの名無しさん
NGNGもっとも、ほとんどの処理系ではstd::vectorでstd::sort(); std::unique();と
やった方がずっと速いけどね。
0537デフォルトの名無しさん
NGNG良いプログラムは良いリファレンスから
0538デフォルトの名無しさん
NGNGstd::strcmp()と同じような返り値だね。
0539デフォルトの名無しさん
NGNG0540デフォルトの名無しさん
NGNGその通りです。
0542デフォルトの名無しさん
NGNGどなたかわかりやすく教えてください
0543デフォルトの名無しさん
NGNG【名】《【複】traits》
(1) (人・物の) 特性, 特質, 特色
提供:R○b○c○de(俺の)
0544デフォルトの名無しさん
NGNGOh! ah! uuhn!
Yes come on!!come on!
Ahhha!
0545デフォルトの名無しさん
NGNG0546デフォルトの名無しさん
NGNG日本語読みは「トレイツ」
「型特性の宣言」みたいなのが主な使われ方
(アロケータはまた余計に説明すんのめんどいから省くけど)
template <class charT, class traits>
basic_string<charT, traits>
というテンプレートがあったとして、
basic_string<char, char_type>と宣言されていたら、
「char型のbasic_stringを、char_type特性として使うぞ」みたいな意味
(もちろんchar_typeがどういう振る舞いなのかは別の場所に定義されているわけだが・・・)
ちなみにboostにはtype_traitsやcall_traitsなどというテンプレートがあって
type_traitsは、テンプレートが展開されるときに
「テンプレートパラメータは数値を扱う型であるか?」とか
「相互にコピー可能な型であるか?」などを調べるのに使う
call_traitsは、例えばテンプレート化された関数の引数を
「組込型ならコピー渡し、コピーにかかるコストが大きいと予想される型はコンスト参照渡しにする」
とかいう使い方をする
と、思う
覚えたばっかで間違ってるかもしれん
0547デフォルトの名無しさん
NGNG0548547
NGNGstd::copy?
0549デフォルトの名無しさん
NGNGint main()
{
std::vector<int> v;
int a[10];
for (int i = 0; i < 10; i++)
v.push_back(i);
std::copy(v.begin(), v.end(), a);
std::copy(a, a + 10, std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
0550デフォルトの名無しさん
NGNGできませんか?
for (map<int, string>::iterator i = hoge.begin(); i != hoge.end(); ++i) {
…
if (ほにゃらら)
hoge.erase((*i).first);
こんな感じのコードを書いたら無限ループになりますた。
VC++6
0551デフォルトの名無しさん
NGNGhoge.erase((i++)->first);
0552デフォルトの名無しさん
NGNGhoge.erase(i++);
0553デフォルトの名無しさん
NGNG0554デフォルトの名無しさん
NGNG…
if (ほにゃらら)
hoge.erase(i++);
else
++i;
}
0555デフォルトの名無しさん
NGNGじゃあ、どうやってまわすのか?
0556デフォルトの名無しさん
NGNGstd::for_each
0557デフォルトの名無しさん
NGNG>>556 で、boost の lambda
0558デフォルトの名無しさん
NGNG0559デフォルトの名無しさん
NGNGミテクレ イノチ ナンダヨ!
0560デフォルトの名無しさん
NGNG禿げどう
0561デフォルトの名無しさん
NGNG0562デフォルトの名無しさん
NGNGトリッキーなコードを書いて自己満足するためなんだよ!!!
for_eachぐらいじゃそうとも言えないか…。。。
0564556
NGNG漏れも以前はそう思っていたが、boost::bindを使えばfor_eachの第3引数
が常に非常にシンプルに書けることに気づいてからはiteratorでループはやめた。
0565556
NGNG轟沈したのは内緒。
0566デフォルトの名無しさん
NGNGつい面倒になって匿名名前空間内にただの関数つくってそれのポインタを
渡してしまうと逆に遅くなる罠。自分のメンバ関数に渡すとか、
inner class つくってoperator()なら問題ないわけだが特に後者はタイプ
数多すぎ(w
0567デフォルトの名無しさん
NGNG子のノードを複数持たせるには、どのようなコンテナ構造にすればよい
でしょうか。
0568デフォルトの名無しさん
NGNGset*のset
0569デフォルトの名無しさん
NGNGありがとうございます。その場合、std::listのように、親のノードを辿ることは
可能でしょうか。
std::set自体は赤黒木のようなもので実現されているらしいので、回転操作
が伴うため、要素の挿入の度に親がしょっちゅう変わってしまうようなことは
ないでしょうか。
0570568
NGNGデータメンバは下のような感じになるか
template<class T>
struct mlist {
T value;
mlist<T> *parent;
std::set<mlist<T>*> child;
};
親が変わるっていうのはどういうことか理解できなかった。
0571デフォルトの名無しさん
NGNG親が変わるというのは、二分木の構造が変化するということです。
しかしよく考えてみると、std::setは親とか子という概念は始めから
ないことに気づきました。
データメンバに親と子へのポインタを持たせるということには気が
つきませんでした。普通のCのように考えればいいのですね。
どうもありがとうございました。
0572デフォルトの名無しさん
NGNG0574デフォルトの名無しさん
NGNG例えば親が変わる例として、
2
\
1
に3を挿入すると、
2
/
3
\
1
になったとします。この場合、1から見た親は、2から3に変わって
しまっています。こういう事を避けたいのです。
0575デフォルトの名無しさん
NGNGtemplate <typename T>
struct mlist {
T value;
mlist<T>* parent;
std::set<mlist<T>*> child;
mlist(T i = 0) : value(i) {
parent = 0;
}
};
template <typename T>
bool operator<(const mlist<T>& m, const mlist<T>& n)
{
return m.value < n.value;
}
0576デフォルトの名無しさん
NGNGint main()
{
mlist<int> mm;
mm.parent = 0;
mm.value = 111;
mm.child.insert(new mlist<int>(3));
mm.child.insert(new mlist<int>(1));
std::set<mlist<int>*>::iterator pos = mm.child.begin();
while (pos != mm.child.end()) {
std::cout << (*pos)->value << ' ';
++pos;
}
}
0577デフォルトの名無しさん
NGNGtemplate <typename T>
class Sort;
template <typename T>
struct mlist {
T value;
mlist<T>* parent;
std::set<mlist<T>*, Sort<T> > child;
mlist(T i = 0) : value(i) {
parent = 0;
}
};
template <typename T>
struct Sort {
bool operator()(const mlist<T>* m, const mlist<T>* n) const {
return m->value < n->value;
}
};
0578デフォルトの名無しさん
NGNGsetに入るのはアドレスで、デフォルト(setの第2テンプレート引数を省略)では
それをそのまま比較して順序づけするからかな?
0579578
NGNG0580デフォルトの名無しさん
NGNGやっぱりそうなのですね。bool operator< を作っていろいろやってみたの
ですが、引数がクラス変数でないとダメとかコンパイラに叱られて、いろ
いろと文献を見ていたら、関数オブジェクトなら比較関数として渡せるこ
とがわかりました。
うーん複雑だ。
0581デフォルトの名無しさん
NGNG要素が見つからないと新しく作って返すんですか?
よく考えたらイテレータが返ってくるし、そうなんですか
純粋に要素があるかないか調べたい場合はcount(key)ですか?
0582デフォルトの名無しさん
NGNG0583デフォルトの名無しさん
NGNGfind()もイテレータが返ってきますが・・・
見つからない場合は何が返ってくるのでしょうか?
0584デフォルトの名無しさん
NGNGすいません
stl_tree.hを読んで謎が解けました
find()だとend()が返ってくるんですね
0585デフォルトの名無しさん
NGNGちなみにVC++6.0のヘルプによるlower_bound()の解説。
>map::lower_bound
>
>iterator lower_bound(const Key& key);
>const_iterator lower_bound(const Key& key) const;
>このメンバ関数は、制御シーケンスの中で key_comp()(x. first, key)
>を偽とする最初の要素 x を指す反復子を返します。
>該当する要素が存在しない場合、この関数は end() を返します。
一度まともな解説書を通読することを*強く*勧める。
0586デフォルトの名無しさん
NGNGところがBCC5.5.1標準ではend()が返ってこなかったのです
暇なときにもうちょっと奥まで見てみますが
stl_tree.hのclass __Rb_treeの実装で、find()では
return (見つかったか)?見つかったヤツのイテレータ:end();
となっていて、lower_bound()では
return 何かのイテレータ; //この先(前?)を見てないので不明
となっていました
0587デフォルトの名無しさん
NGNGmap<string, size_t> の内容を、size_t 降順 + 大文字小文字区別無し string 昇順で
ソートして標準出力にでも出力したいのですよ。
が、map<K, T> は sort() にかけることができず、map<K, T, Comp> でも T を使った
ソートはできないみたいです。
なので、一度 vector<map<string, size_t>::value_type> に放り込んでから、sort() を
かけようと思うたのです。
が、今度は pair<string, size_t> の operator= が定義されていないとかでコンパイル
通りませんぬ。
仕方ないので pair<> 互換で operator= と operator< をつけた構造体を vector<> に
詰めたら、それでやっと sort() がかけられたのです。
でも、もっと簡潔な方法無い? map<> か pair<> をソートする方法。
0588デフォルトの名無しさん
NGNGpair<string, size_t>をインサートする時にソートする関数オブジェクトを
定義してやれば済むんじゃないの?
0589587
NGNGvector<> にも map<> にも、insert() で関数オブジェクトが指定できそうな
場所が見当たらないんだけど・・・。
意味が違う?
方法に気付かない漏れがアフォなの?
0590デフォルトの名無しさん
NGNGちょっとboost使わないとスマートにならないけど、こんな感じでどう?
#include <iostream>
#include <map>
#include <algorithm>
#include <boost/compose.hpp>
struct StrCmpi {
bool operator() (const std::string& s1, const std::string& s2) const {
return std::lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(),
boost::compose_f_gx_hy(std::less<char>(), std::ptr_fun(std::toupper), std::ptr_fun(std::toupper)));
}
};
int main()
{
typedef std::map<std::string, size_t, StrCmpi> Ssize;
Ssize mp;
mp.insert(std::make_pair("test1", 123));
mp.insert(std::make_pair("Test2", 456));
Ssize::const_iterator pos;
for (pos = mp.begin(); pos != mp.end(); ++pos)
std::cout << "string = " << pos->first << ", size_t = " << pos->second << std::endl;
}
0591デフォルトの名無しさん
NGNGスマソ。降順でしたね。std::lessをstd::greaterにしてくださひ。
0592デフォルトの名無しさん
NGNG0593デフォルトの名無しさん
NGNGして挿入はできるけど、二番目の要素でソートして挿入はできない
ようだ。誰か助けて〜。
0594587
NGNG元々 boost 知らない漏れが書いたのは↓こんなの。
using namespace std;
typedef map<string, size_t> map_type; typedef map_type::value_type pair_type;
struct sort_pair {
string first; size_t second;
sort_pair(const pair_type &NewValue) { this->first = NewValue.first; this->second = NewValue.second; }
operator=(const sort_pair &NewValue) { this->first = NewValue.first; this->second = NewValue.second; }
operator<(const sort_pair &CompValue) {
int Ret = (int)this->second - (int)CompValue.second;
if(Ret > 0) return true; if(Ret < 0) return false;
return stricmp(this->first.c_str(), CompValue.first.c_str()) < 0;
}
};
int main()
{
map_type Map; char Buf[256]; const int ItemNum = 10;
srand((unsigned)time(NULL));
for(int i = 0; i < ItemNum; i++) { sprintf(Buf, "Test%u", ItemNum - i); Map.insert(pair_type(string(Buf), rand() >> 13)); }
cout << "==== Before Sort ====" << endl; size_t Cnt = 0;
for(map_type::iterator itrMap = Map.begin(); itrMap != Map.end(); itrMap++)
cout << ++Cnt << ": " << itrMap->first << "(" << itrMap->second << ")" << endl;
vector<sort_pair> Vector;
for(itrMap = Map.begin(); itrMap != Map.end(); itrMap++)
Vector.push_back(*itrMap);
sort(Vector.begin(), Vector.end());
cout << "==== After Sort ====" << endl; Cnt = 0;
for(vector<sort_pair>::iterator itrV = Vector.begin(); itrV != Vector.end(); itrV++)
cout << ++Cnt << ": " << itrV->first << "(" << itrV->second << ")" << endl;
return 0;
}
0595デフォルトの名無しさん
NGNGboost知らなくても、boost::compose_f_gx_hyを分解して書けば書けるよ。
それと、std::mapよりstd::setにpairを挿入した方がこの場合はいいようなので
それで作ってみます。
0596デフォルトの名無しさん
NGNGstruct Comp {
bool operator()(const pair_type& a,const pair_type& b) {
return /* 比較結果 */;
}
};
vector< pair<map_type::key_type, map_type::mapped_type> > v(Map.begin(),Map.end());
sort( v.begin(), v.end(), Comp() );
あるいは
set<pair_type, Comp> s(Map.begin(), Map.end());
でソート完了、で十分でないの?
0597デフォルトの名無しさん
NGNGstring+size_tでソートかけるなら
setでいいのでは?
>size_t 降順 + 大文字小文字区別無し string 昇順
このい見がイマイチ理解できないのだが…
size_t+string?
それとも、
size_tまたはstringどちらかで切り替えられるって意味?
0599596
NGNG0601デフォルトの名無しさん
NGNG#include <iostream>
#include <set>
#include <iterator>
#include <cctype>
#include <boost/compose.hpp>
typedef std::pair<std::string, size_t> Ss;
struct Cmp {
bool operator() (Ss s1, Ss s2) const {
if (s1.second != s2.second)
return s1.second > s2.second; //降順
else
return std::lexicographical_compare(s1.first.begin(), s1.first.end(), s2.first.begin(), s2.first.end(),
boost::compose_f_gx_hy(std::less<char>(), std::ptr_fun(std::toupper), std::ptr_fun(std::toupper)));
}
};
int main()
{
std::multiset<Ss, Cmp> ss;
ss.insert(std::make_pair("test1", 123));
ss.insert(std::make_pair("Test2", 456));
ss.insert(std::make_pair("Test2", 123));
std::multiset<Ss>::const_iterator pos;
for (pos = ss.begin(); pos != ss.end(); ++pos)
std::cout << "string = " << pos->first << ", size_t = " << pos->second << std::endl;
}
0602594
NGNGそうしようとするとボロボロにエラーが出るのは、コンパイラが VC6 だからなの?
しかし、漏れのせいで pair<596, 597> が出来上ってしまったようだ・・・。
0603594
NGNG> >size_t 降順 + 大文字小文字区別無し string 昇順
> このい見がイマイチ理解できないのだが…
出現した単語の集計。
出現数が多い読みを左側に、出現数が同じのは文字列順に。
http://pc.2ch.net/test/read.cgi/unix/1025600265/367-385
map<> とか使うより最適解があるかな?
みんなありがとう、漏れの修行の足りなさが良くわかったよ。
>>601 がほぼ模範になるのかな?
0604デフォルトの名無しさん
NGNG601です。
std::mapだと、挿入時にsecondの値でソートできないので都合悪いです。
std::setにstd::pairを挿入するのが一番すっきりするようです。
0605デフォルトの名無しさん
NGNGstruct Cmp {
bool operator() (const Ss& s1, const Ss& s2) const {
if (s1.second != s2.second)
return s1.second > s2.second; //降順
else
return std::lexicographical_compare(s1.first.begin(), s1.first.end(), s2.first.begin(), s2.first.end(),
boost::compose_f_gx_hy(std::less<char>(), std::ptr_fun(std::toupper), std::ptr_fun(std::toupper)));
}
};
0606デフォルトの名無しさん
NGNGclass Cmp {
static bool compare(char c1, char c2) {
return std::toupper(c1) < std::toupper(c2);
}
public:
bool operator() (const Ss& s1, const Ss& s2) const {
if (s1.second != s2.second)
return s1.second > s2.second; //降順
else
return std::lexicographical_compare(s1.first.begin(), s1.first.end(), s2.first.begin(), s2.first.end(),
compare);
}
};
0607597
NGNG>出現した単語の集計。
そっか…。
insert後にsize_tの値が変化する
(集計が続行される)ならsetにも
問題が出てくるね…。
setで集計情報更新ごとにerase、
insertするか、
map<size_t, string>でstringソート時に
map<string, size_t>でソートするか、
って方法でいかが?
0608597
NGNG>map<string, size_t>でソートするか、
ごめん。
ここらへんは>>597のコンパイルエラー
size_tまたはstringと勘違い…
0609デフォルトの名無しさん
NGNG後から集計するなら、std::setでなくてstd::vectorにpairぶちこんどいて、
最後にCmpを渡してstd::sortするのが簡単だね。
多分std::mapを使ったのは、mp[word]++;のような書き方が便利だから
でしょう。
std::vectorを使ったら、std::findでキーを検索して、secondの値を++
するしかないでしょうね。
0610デフォルトの名無しさん
NGNGまずいんでしょうか? 戻りがなんであれコンパイルは通りますけども。
どうなんでしょう?
0611596
NGNG> そうしようとするとボロボロにエラーが出るのは、コンパイラが VC6 だからなの?
うそーん。…と思ったら、確かにsetのコンストラクタが変だな、VC6。
修正。
#include <色々>
using namespace std;
typedef map<string, size_t> map_type;
typedef map_type::value_type pair_type;
struct Comp {
bool operator()(const pair_type& a,const pair_type& b) {
return b.second<a.second ||
!(a.second<b.second) && strcmpi(a.first.c_str(),b.first.c_str());
}};
int main() {
map_type Map;
char Buf[256]; const int ItemNum = 10; srand(time(0));
for(int c=10;c--;) { sprintf(Buf, "Test%d", c); Map.insert(pair_type(string(Buf), rand() >> 13)); }
cout << "==== Before Sort ====" << endl; size_t Cnt = 0;
for(map_type::iterator itrMap = Map.begin(); itrMap != Map.end(); itrMap++)
cout << ++Cnt << ": " << itrMap->first << "(" << itrMap->second << ")" << endl;
set<pair_type, Comp> s;
copy(Map.begin(), Map.end(), inserter(s,s.end()));
cout << "==== After Sort ====" << endl; Cnt = 0;
for(set<pair_type,Comp>::iterator i=s.begin(); i!=s.end(); ++i)
cout << ++Cnt << ": " << i->first << "(" << i->second << ")" << endl;
}
0612596
NGNG最初からvectorに突っ込むなら、Loki::AssocVector辺りが便利かと。
>>610
> 25.1.1 For each [lib.alg.foreach]
> ....
> Notes:
> If f returns a result, the result is ignored.
0613デフォルトの名無しさん
NGNGvectorにcopyして、sortすればええやん。
0615デフォルトの名無しさん
NGNG禿堂
漏れも自分ならそうする。
0616594
NGNGなるほど、そう書くのか。
漏れは C 上がりなので、文字列操作となるとすぐ <cstring> に逃げてしまう。
>>611
ありがとう、それでまま OK のようだ。
>>605、612
漏れは boost とか Loki とか外部ライブラリを全然知らんのだけど、習得には
およそどれくらいかかる?
英語もダメだから、日本語ドキュメントがほとんど無いというのにもつい二の足を
踏んでしまう。
>>613
漏れも最初はそう思ったんだが、どうも pair<> を食ったコンテナは sort() で
コンパイルエラーになるのだ、pair<>::operator= が定義されてないとかで。
だからソートに対応した sort_pair を 594 みたいに書いたんだが、set や
multiset なら sort() が要らなそうだね。
結局は 603 の通り 「出現した単語の集計」 なのだが、集計は最初から set<>
を使うのは無理がありそうなので map<string, map<string, size_t>> でして、
終わったら set<string, set<string, size_t, comp1>, comp2> に放り込んで
ソートという事てでよろしいか。
0617デフォルトの名無しさん
NGNGpairを食わせたvectorでもちゃんとソートできるよ。
typedef std::pair<std::string, int> Si;
struct Cmp {
bool operator() (const Si& s1, const Si& s2) const {
return s1.first < s2.first;
}
};
int main()
{
std::vector<Si> sv;
char buf[128];
for (int i = 0; i < 10; i++) {
std::sprintf(buf, "%d", std::rand());
sv.push_back(std::make_pair(std::string(buf), i));
}
std::vector<Si>::const_iterator pos;
std::cout << "--- before sort ---" << std::endl;
for (pos = sv.begin(); pos != sv.end(); pos++)
std::cout << "pair(\"" << pos->first << "\", " << pos->second << ")" << std::endl;
std::sort(sv.begin(), sv.end(), Cmp());
std::cout << "--- after sort ---" << std::endl;
for (pos = sv.begin(); pos != sv.end(); pos++)
std::cout << "pair(\"" << pos->first << "\", " << pos->second << ")" << std::endl;
}
0618デフォルトの名無しさん
NGNGそうそう、boostだけど、無理に覚える必要はないよ。標準のSTLだけでも
組み合わせれば実現できるから。
どうしても覚えたいなら、ドキュメントとまではいかないが有益なサイトが
ある。
http://www.kmonos.net/alang/boost/ とか
http://user.ecc.u-tokyo.ac.jp/~g940455/wp/boost/index.html とか。
最初は標準STLだけで何とかやり繰りして、不自由を感じてきた頃にboost
に走ればよいと思う。俺も未だにboostはよくわからない。
0619616
NGNGΣ(゚д゚lll) 確かにできるな・・・。
つーか、漏れも最初はそう書いたんだけど、何故かできなかったのよ。
元ソース残ってないから検証できない・・・。
ところで、struct Cmp は binary_function<> を継承しなくてもいいの?
よくある解説には、必ずそうしろと書いてあるんだけど・・・。
理念上の問題?
>>618
酸楠、読んでみる。
0620デフォルトの名無しさん
NGNGunary_functionやbinary_functionは、argument_typeとかresult_type
という型名を使いたい時に継承すればいいんじゃないかな。
これらの型名はファンクタ名で修飾しないとエラーになるコンパイラ
もあるので、結構使いづらいですよ。
0621デフォルトの名無しさん
NGNGfatal error C1083: インクルード ファイルがオープンできません。'../include/stddef.32771'
っていうエラーが出るんですが
こんなエラー出たことある人いますか?
どうも修正方法がわからなくて困ってます
0622596
NGNG出来ないのは、たぶん vector< map::value_type > とやったから。
value_type::first は const なので、当たり前だが
value_type::operator=() は使えなくて、結局コンテナの書き換えが必要な
sort() も使えないことになる。
>>605
LokiはModernC++Design(日本語訳あり)を一冊読み切れば
すぐ使えるようになると思う。で、この本を読み終わったならば、
ドキュメントなしでもboostとかが何をどうやっているのか
理解できるようになってるはずなので、そっちも
てきとーに使っていくこともできるかと。
0623デフォルトの名無しさん
NGNG/(ヘ つ )ヘ 加えて、単純なアルゴリズムも便利な物が多い。
しかし、関数オブジェクトの必要性がどうしても分からない。
ひとつの処理のために、クラス作ってoperator()定義したり、
boost使って技巧を極めるより、泥臭くてもforで回した方が
素直に書けると思うんだけど。
0624619
NGNGらじゃ。でも先立つものが 。(´д`;)
>>623
例えば漏れの提出した質問 >>587 への一連のレス。
map やら set やらの要素を好みの並び順にするためとか。
これは for で解決できる問題じゃない。
関数オブジェクトったって、operator() の引数と中身は普通の関数と一緒
だし、その外側を包む struct 定義の分で 2、3 行増えるだけだし。
面倒と言う程でもない。
関数ポインタが代用になりそうな気が一瞬するが、それが通用するのは
アルゴリズム等で、テンプレート引数には指定できない。
アルゴリズムでも、関数テンプレートは使えない。
逆に言うと、処理する型が決まっている場合は、アルゴリズムには関数
ポインタで充分な気もする。
0625619
NGNG>>622
> 出来ないのは、たぶん vector< map::value_type > とやったから。
確証はないが多分それだ、ありがとう。
今度から気をつける。
0626デフォルトの名無しさん
NGNG>unary_functionやbinary_functionは、argument_typeとかresult_type
>という型名を使いたい時に継承すればいいんじゃないかな。
bind1st/2ndとか否定回路とか使うならこれらの肩名がないとコンパイルできんすね
0627デフォルトの名無しさん
NGNG( `Д) <レスさんくす。
/(ヘ つ )ヘ 587からのレスをへ〜と思いながら眺めてたんだけど、
確かに、こういう風にずばっと解決すると気持ちがいいな。
「これがSTLの威力か!」ってね。
小さい単純なプログラムでいろいろ試してる所なんだけど、
まず、自分で全部書こうと先に思ってしまう。
これはC++を初めてやったときに「こんなもんCで全部できる」と
考えたときに似てる。まだまだ勉強不足だな。
0628デフォルトの名無しさん
NGNG0629デフォルトの名無しさん
NGNG>ポインタで充分な気もする。
inline化されんので遅い
0631デフォルトの名無しさん
NGNG本当だ、std::unary_functionを継承しないファンクタを使うと、std::logical_not
などを渡すとコンパイルエラーになる。知らなかった。
0632STL beginner
NGNG確かにひとつの処理のために、クラス作るのは泥臭い。
しかし ptr_fun や mem_fun があるじゃないか。
関数作るのも泥臭いって?
ウムム…
0633デフォルトの名無しさん
NGNGmem_funは用途がちゃうやろ
0634デフォルトの名無しさん
NGNGとか、したい。
0635デフォルトの名無しさん
NGNGお好きなのをどうぞ。
http://www.boost.org/libs/lambda/doc/
http://www.kfa-juelich.de/zam/FACT/start/index.html
http://www.cc.gatech.edu/~yannis/fc++/
0636デフォルトの名無しさん
NGNG0637デフォルトの名無しさん
NGNGへー、いろいろあんのね。…日本語のドキュがあればもっといいんだが。
0638デフォルトの名無しさん
NGNG0639デフォルトの名無しさん
NGNG出ました(泣。
Borland-C++5.6です。gccとかでないとだめなのですか?
0641デフォルトの名無しさん
NGNGhttp://spirit.sourceforge.net/index.php?doc=docs/v1_5/introduction.html
すごいね。しかし再帰下降パーサなのね。
0642デフォルトの名無しさん
NGNGぐはっ、左様ですか…。
lambda ppか…はー、lambdaが標準に追加されれば問題ないのになぁ。
0643デフォルトの名無しさん
NGNGそうね。
boost::lambdaでいくら頑張っても、"C言語でもOOPは可能だもんね!"
と熱弁をふるう連中なんかと同類になるだけな気がする。
0644デフォルトの名無しさん
NGNG0645デフォルトの名無しさん
NGNG0646デフォルトの名無しさん
NGNG唐揚げで満足できないのか
0647デフォルトの名無しさん
NGNGカラアゲうまうまはもう食ってしまったYO。
カップラーメンでも食うか。仕方ないし。
0648デフォルトの名無しさん
NGNG643の意見に煽りをいれてみた挙句にboost::lambdaのわかりやすい解説と活用法をこのスレに書き始める、なんてのはどうだ?
もちろん、それを漏れが見たいだけだが。
0649デフォルトの名無しさん
NGNGBorland-C++ではboost::lambdaはコンパイルできないんだよなー。
かなりがっくし来てる。
gcc3.2(cygwin or MinGW)を使うしかない。今のところ。
0650デフォルトの名無しさん
NGNG{
double d[] = {1.111, 2.222, 3.333};
std::vector<double> v(d, d + 3);
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << ' ');
std::cout << std::endl;
}
とか。くだらんな。
0651648
NGNG0652デフォルトの名無しさん
NGNGあるdouble値 hoge がdvの 何番目 に格納されているかを知るにはどうしたらいいで
しょうか?iteratorでループまわすしかないですか?
#知りたいのは、「何番目」であって、格納されている要素を指すiteratorでは
#ないです
0653デフォルトの名無しさん
NGNGhttp://ahirujigen.hp.infoseek.co.jp/stl04.htm
find()じゃいかんの?
0654デフォルトの名無しさん
NGNG>find()は検索対象が見つかればその要素へのイテレータを返し,
>見つからなければend()を返す.
ですから、駄目なのでは?
0655デフォルトの名無しさん
NGNGiteratorをdistance()すればいいんじゃないか?
0656652
NGNGstd::distanceでいけそうですね。お騒がせしました。
0658デフォルトの名無しさん
NGNG0659デフォルトの名無しさん
NGNG0661デフォルトの名無しさん
NGNGふと湧いた疑問。演算結果を受け取る変数の型は、
std::vector<double>::difference_type と
std::vector<double>::const_iterator::difference_type の
どちらが適切?
0662デフォルトの名無しさん
NGNG意味的にはどちらも同義だと思う。
どちらでもイイ!のでは?
・std::vector<double>::difference_type
vectorで使われているイテレータの差を表現する型
・iterator::difference_type
イテレータの差を表現する型
0663デフォルトの名無しさん
NGNG0664デフォルトの名無しさん
NGNG標準C++でもboost使ってでもなんでもいいんですが。
0665デフォルトの名無しさん
NGNGdouble なら fabs()
class なら if(a < 0) a = -a;
0666デフォルトの名無しさん
NGNGそれだとクラステンプレートの実装を書いているときにイマイチなわけですが・・
0667デフォルトの名無しさん
NGNGどうイマイチ?
0668デフォルトの名無しさん
NGNGならば
template<typename T> inline T generic_abs(const T& a) {
return a<T() ? -a : a;
}
inline float generic_abs(float a) { return fabs(a); }
inline double generic_abs(double a) { return fabs(a); }
inline int gene...(以下略)
とでもしておけばよいでのは?traits化した方がよいかもしれんが。
0669デフォルトの名無しさん
NGNGすでにそんなことをしているライブラリはSTL/boostにはないって事ですよね。
0670デフォルトの名無しさん
NGNGつか std::abs じゃダメなの?
0671デフォルトの名無しさん
NGNGそれってint型しか取れないんじゃなくって?
0672デフォルトの名無しさん
NGNGテンプレになってるから、何でもOKだよ
0673デフォルトの名無しさん
NGNG0674デフォルトの名無しさん
NGNG規格には何とかいてあるんでしょうかね
$ grep -r abs /usr/include/g++-3/*
/usr/include/g++-3/cmath:float fabs (float);
/usr/include/g++-3/cmath:inline float abs (float x) { return fabs (x); }
/usr/include/g++-3/cmath:inline double abs (double x) { return fabs (x); }
/usr/include/g++-3/cmath:long double fabs (long double);
/usr/include/g++-3/cmath:inline long double abs (long double x) { return fabs (x); }
/usr/include/g++-3/cstdlib:inline long abs(long x) { return labs (x); }
/usr/include/g++-3/cstdlib:inline long abs(long x) { return x >= 0 ? x : -x; }
0675デフォルトの名無しさん
NGNGstruct C
{
vector<int> v;
void f(int x) { std::cout<<x; }
void NG()
{
std::for_each( v.begin(), v.end(), &C::f );
}
void OK()
{
std::vector<int>::iterator it( v.begin() );
while( it != v.end() ) {
f( *it++ );
}
}
};
0676674
NGNGboost::bind( &C::f, this)
);
が、漏れは一番見やすいと思っているが。
0677674
NGNGstd::for_each( v.begin(), v.end(),
std::bind1st( std::mem_fun( &C::f ), this )
);
だっけ? いまからコンパイルしてみる。
0679674
NGNG問題なさそうだ。
メンバ関数ポインタを mem_fun すると、元の関数の引数に加えて、呼び出
し先のオブジェクトを引数に加えた関数オブジェクトが帰る、とでも考えてください。
0680674
NGNGさらにおせっかいを書くなら、その関数が2引数以上だと、
bind1st/2ndを何度も使わなければならず、著しく可読性が落ちるから、
そんなら割り切っていつでもboost::bindを使っらええやん、と思ってしまう。
(実行)速度面ではどうなんですかね。検討したことがない。
コンパイル速度は落ちます。>boost::bind
0681デフォルトの名無しさん
NGNG0682デフォルトの名無しさん
NGNGcomplex とか valarray の abs を考えりゃわかるけど、
もともとそんなにgenericに書けるたぐいの関数じゃないし。
0683672
NGNGboost::bind というのは使ったことが無いのですが
調べてみます。
>>681
VC6 + STLPortなら行けるみたいです。
貴重な情報感謝します。
0684683
NGNGboost::bind もVC6では通らないですね。
テンプレート固有の訳分からないエラーがいっぱい出てきます。
0685デフォルトの名無しさん
NGNGえ、ほんとにコンパイルできました?
俺が勘違いしているのかなぁ。
実際に、手元の環境では
c:\program files\microsoft visual studio\vc98\include\stlport\stl\_function.h(139) : error C2562: '()' : 関数は 'void' 型として宣言されていますが、値を返しました。
と言われるのですが。
0686674
NGNGん、逆にboost::bindなら通ると思うんだが....
std::for_each( v.begin(), v.end(), boost::bind( &C::f, this, _1 ) );
と思ったら、>>676 はtypoあり。ごめんなさい。上が正しい。
0687デフォルトの名無しさん
NGNG実は &C::f というのは投稿用に考えたサンプルで、675の手元のコードでは、
呼ぶメソッドがvoidじゃないに1ペリカ。
0688デフォルトの名無しさん
NGNG>>680
>その関数が2引数以上だと、
>bind1st/2ndを何度も使わなければならず...
std::bind*は2引数以外のファンクタは受け取れなよ。
0689デフォルトの名無しさん
NGNGはい、申し訳ない。嘘書きました。
0690デフォルトの名無しさん
NGNGさしているんでしょう?
C c;に対して適用する場合は
std::for_each(c.v.begin(), c.v.end(), std::mem_fun(&c.f));
ではどうしてだめなんでしょうか?
0691デフォルトの名無しさん
NGNG>&c.f
こういう記法はC++にゃありません、としか言えないような・・
0692デフォルトの名無しさん
NGNG"メンバ関数ポインタ" でgoogleすると良いと思うけど。
あと679。
0693デフォルトの名無しさん
NGNGありがとうございます。結局次のように書くことで無事コンパイルを通りました。
std::for_each(c.v.begin(), c.v.end(), std::bind1st(std::mem_fun(&C::f), &c));
なんとも不格好なのですが、このように書くしかないのでしょうか?
もっとスマートに書けないものでしょうか。
0694デフォルトの名無しさん
NGNGC c; に対して外部からfor_eachするのね (サンプルのコードとはちょっと違うね)。
>なんとも不格好なのですが、このように書くしかないのでしょうか?
俺の理解する限りではそれしかないと思うけど。
std::mem_fun1_t<void, C, int> fn(&C::f);
std::for_each(c.v.begin(), c.v.end(), std::bind1st(fn, &c));
とか書いてもスマートではないよねえ・・
0695デフォルトの名無しさん
NGNG>結局次のように書くことで無事コンパイルを通りました。
それより、VC6のvoid問題をどう回避したのかおしえてくれよう。
www.issei.org/diary/d200112b.html にも載っている問題。
C::f() の戻り型はvoidなんでしょう?
0696デフォルトの名無しさん
NGNGそうです。C c; はthisを持っているから省略してもいいと思っていたら
だめで、やっぱり &c は省略できませんでした。
手持ちの参考書を片っ端から読んで見たのですが、それらしい例が
載ってないのです。mem_funは鬼門なのでしょうね。
>>695
すみません、BCC5.5.1デス・・・・
0697デフォルトの名無しさん
NGNGみようかなあ。
0698デフォルトの名無しさん
NGNGなんだVCじゃないのかYO!!
ところで695のURIはとても勉強になると思うよ。
0699デフォルトの名無しさん
NGNGすみません。BCCもboost::lambdaがことごとく撃沈するという不具合が
ありますので必ずしもいいとは言えません。
早速URL見てみます。
0700デフォルトの名無しさん
NGNGboost::bindは、単体で使える。一緒に覚えないといけないのは boost::ref くらいか。
boost::mem_fnとか、boost::function はあとまわしにして大丈夫よ。
0701700
NGNG徹夜コーディングマンセー。。。。
0702デフォルトの名無しさん
NGNGサンクス。早速試してみます。
0703デフォルトの名無しさん
NGNGご苦労様です。体を壊さないでくださいね。風邪が流行ってますから。
なるほど、boostを使うとこのように書けるのか。
std::for_each(c.v.begin(), c.v.end(), boost::bind(&C::f, &c, _1));
0704700
NGNGyes.
bindは、第一引数に何を渡すかで、微妙に挙動を(使いやすく)変えてくれるのがいいところ。何を渡せるかはオフィシャルのドキュソメンツに詳しく書いてあるます。
0705デフォルトの名無しさん
NGNGといいつつ本家boostスレは全く無視しているのであった。ホホホ
0706デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNGとか言って Stop しますた。
メイクファイルいぢって /Zm200 オプションつけて動かしたらコンパイル通ったけど、
これで OK なの?
0708デフォルトの名無しさん
NGNGスレ違いの予感。
消火されますた。
0709707
NGNG0710平岡
NGNGstaticならbind不要
0711デフォルトの名無しさん
NGNGstaticはthisポインタ持たないからだね。
0713デフォルトの名無しさん
NGNG0714デフォルトの名無しさん
NGNGそりゃ char* では?
0715デフォルトの名無しさん
NGNGできません。
0716712
NGNG別のコンテナから char** を得る方法はありますか?
0717デフォルトの名無しさん
NGNG0718デフォルトの名無しさん
NGNG0719712
NGNGstd::string< std::string > で c_str() を使うって「あり」ですか?
これが ????\0????\0????\0 .... ????\0\0 を指してくれれば・・・
0721デフォルトの名無しさん
NGNG&v[0][0];
0723デフォルトの名無しさん
NGNGvector<string>が
|s|t|r|i|n|g|1|\0|s|t|r|i|n|g|2|\0|s|t|r|i|n|g|3|\0|
とメモリにマッピングされる保証は「ゼロ」なので
別の方法を考えてください
string::c_str()が\0で終わる事は保証されます
0725712
NGNGstd::basic_string< std::string > ですね。失礼。
0726デフォルトの名無しさん
NGNG0727デフォルトの名無しさん
NGNG>>719のメモリレイアウトにこだわるのであればvector<char>しか無い。
"abc\0def\0ghi\0\0"に対して
挿入・削除・追加・ソート・検索等をしたいのであれば
文字列→適当なコンテナ<string>してから処理して
文字列に戻すのが簡単かな。
0728デフォルトの名無しさん
NGNGその通り!但しstd::char_traits<std::string>を定義する必要がある。
…ってんなわけねぇだろ!
0730デフォルトの名無しさん
NGNGもしかして、利用したい変更不可能な関数の引数がchar**型なんだけど
自分の管轄内ではstringの配列として管理しておきたいので
どうやって渡せば良いのか?っつー質問か?
そうだとすればchar**型の変数に代入してから渡すしかないぞ
vector<string> dataならchar** tempとして
i = 0; it = data.begin();
while (it != data.end()) {
strcpy(temp[i][0], it->c_str());
i++; it++;
}
とか
0731デフォルトの名無しさん
NGNGいや、そもそも
>std::vector< std::string > を char** にキャストできますか?
C++のどのキャストでも出来ません。で終ってもいいんだけど
vector<string>をchar**にする目的は?
これがわからないとなんとも…
もしかしたら char** にする必要が無いかもしれないし、
vector<string>が間違いかもしれない。
もうちょっと状況を詳しく。
0732デフォルトの名無しさん
NGNGキャストと言ってるくらいだから temp の領域はとってないんだろ。
char*[] と要素ごとの char[] をそれぞれ new する必要があると見た。
vector<string> からのキャストを受け付けて、内部表現が char** の
struct でも作れば new と delete は自動化できるか。
0733732
NGNG0734712
NGNG> >>712
> もしかして、利用したい変更不可能な関数の引数がchar**型なんだけど
> 自分の管轄内ではstringの配列として管理しておきたいので
> どうやって渡せば良いのか?っつー質問か?
その通りです。説明不足すみません。
> そうだとすればchar**型の変数に代入してから渡すしかないぞ
> vector<string> dataならchar** tempとして
> i = 0; it = data.begin();
> while (it != data.end()) {
> strcpy(temp[i][0], it->c_str());
> i++; it++;
> }
> とか
↑利用させていただくかもしれません。
どうもありがとうございます
0735712
NGNGちなみに、この関数↓です。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_ctoolbarctrl.3a3a.addstrings.asp
(本当はMFCではなくWTLの方)
0736デフォルトの名無しさん
NGNGおいおい、それ char** じゃないよ・・・。
>>735
おいおい、それ char** じゃないよ・・・。
| CToolBarCtrl::AddStrings
| ツール バー コントロールで利用できる文字列のリストに、
| 新しい文字列を追加します。
|
| int AddStrings(
| LPCTSTR lpszStrings
| );
|
| パラメータ
| lpszStrings
| ツール バーの文字列リストに追加される NULL で終わる文字列
| を 1 つ以上持つバッファのアドレス。
| 最後の文字列は、2 つの NULL 文字で終わります。
-- 中略 --
| // adds three strings with one call
| lpszStrings = "String 1\0String 2\0String 3\0";
0737C 関数使ってるが &rlo;ろれくてし許 &lro;
NGNG{
ToMultiSZ(vector<string> vs)
{
size_t i = 1;
vector<string>::iterator itr;
for(itr = vs.begin(); itr != vs.end(); itr++) i += itr->size() + 1;
sz = new char[i]; i = 0;
for(itr = vs.begin(); itr != vs.end(); itr++) i += sprintf(&sz[i], "%s", itr->c_str()) + 1;
sz[i] = '\0';
}
~ToMultiSZ() { delete[] sz; sz = NULL; }
operator char *() { return sz; }
private:
char *sz;
};
void PrintMultiSZ(char *sz)
{
if(!sz) return;
size_t i = 0;
while(sz[i]) i += fprintf(stdout, "%s\n", &sz[i]);
}
int main(void)
{
vector<string> vs;
vs.push_back("Test1"); vs.push_back("Test2"); vs.push_back("Test3"); vs.push_back("Test4");
PrintMultiSZ(ToMultiSZ(vs));
getchar();
return 0;
}
0738737
NGNGstruct ToCharPP
{
ToCharPP(vector<string> vs)
{
num = vs.size();
if(!num)
pp = NULL;
else
{
pp = new char *[num + 1];
size_t cnt = 0;
for(vector<string>::iterator i = vs.begin(); i != vs.end(); i++)
strcpy(pp[cnt++] = new char [i->size() + 1], i->c_str());
pp[num] = NULL;
}
}
~ToCharPP()
{
if(pp)
{
for(size_t cnt = 0; cnt < num; cnt++)
delete[] pp[cnt];
delete[] pp;
pp = NULL;
}
}
operator char **() { return pp; }
private:
char **pp; size_t num;
};
0739デフォルトの名無しさん
NGNG{
void operator()(const string& s)
{
if (m_bFirst)
m_bFirst = false;
else
m_v.pop_back();
copy(s.begin(), s.end(), back_inserter<vector<char> >(m_v));
m_v.push_back('\0');
m_v.push_back('\0');
}
vs2sz(vector<char>& v): m_v(v), m_bFirst(true)
{}
vector<char>& m_v;
bool m_bFirst;
};
void for()
{
……
vs // vector<string>
buf // vector<char>
buf.reserve(100);
……
for_each(vs.begin(), vs.end(), vs2sz(buf));
……
bar.AddString(&buf[0]);
}
0740739
NGNG0741712
NGNG>>737-738
どうもありがとう。
ToCharPP のようなラッパー構造体(クラス)とオペレータ char** を参考にさせていただきます。
>>739-740
どうもありがとう。
これは vector< string > ではなく vector<char> に "\0" を 加えているのですね。
疑問なのですが、
"abc\0def\0ghi\0\0"
0742712
NGNG疑問なのですが、
"abc\0def\0ghi\0\0"
↑ここの"\0\0"を付加しているようですが、
↑ここの"\0" は反映されますか?
0743712
NGNG> | パラメータ
> | lpszStrings
> | ツール バーの文字列リストに追加される NULL で終わる文字列
> | を 1 つ以上持つバッファのアドレス。
> | 最後の文字列は、2 つの NULL 文字で終わります。
型が LPCTSTR ですが、文字列が"\0"で区切られ最後に"\0\0"がつくので、
char** で考えてます。もしかしてまちがっていますか?
const の事でしたら、後でどうにかしますので問題ありません。
0744デフォルトの名無しさん
NGNG反映?何に?
あとWindowsSDKで\0区切りの文字列の
本当の終端が\0\0っていうのはお約束
0745デフォルトの名無しさん
NGNG>型が LPCTSTR ですが、文字列が"\0"で区切られ最後に"\0\0"がつくので、
>char** で考えてます。もしかしてまちがっていますか?
まったくもって間違っている
char**はchar型のポインタへのポインタ
今回扱っているのは\0区切りの文字列
0746712
NGNG>>743 に追記
> | // adds three strings with one call
> | lpszStrings = "String 1\0String 2\0String 3\0";
これには一番最後に見えない"\0"が付いているのではないのでしょうか?
それとも、単に、最後の"\0"の存在を明示的に表すため、
ここでは付けている?
私の考えは、
"String 1\0String 2\0String 3\0" のデータは
|S|t|r|i|n|g| |1|\0|S|t|r|i|n|g| |2|\0|S|t|r|i|n|g| |3|\0|\0| になっていて、
"String 1\0String 2\0String 3\0\0" のデータは
|S|t|r|i|n|g| |1|\0|S|t|r|i|n|g| |2|\0|S|t|r|i|n|g| |3|\0|\0|\0| になってしまう、です。
0747712
NGNG終端の\0\0の話ではなく、間の\0の話です。
vs2sz::operator()(const string& a) が、間の"\0"を反映しているのでしょうか?
>>745
char st[][]={ "AAA", "BBB", "CCC" };
は |A|A|A|\0|B|B|B|\0|C|C|C|\0|\0| になりませんか?
0748デフォルトの名無しさん
NGNGは
0:|A|A|A|\0
1:|B|B|B|\0
2:|C|C|C|\0
じゃなかったけ?
0749デフォルトの名無しさん
NGNGバラバラにメモリを確保ですか?
0750デフォルトの名無しさん
NGNGクソスレにすんなヴォケども。
0751デフォルトの名無しさん
NGNG見えない\0なんてあるわけないだろ?
勝手な妄想するなよ
>私の考えは、
だから、おまえの考えが間違ってるだけだって言ってるだろ?
>>747
反映しているっつー意味が全然わからんが
vector<char>に\0をpush_backすれば\0が挿入される
それと、2次元配列と\0区切りの文字は違うっつーの
>>749
ばらばらかどうかなんてのは問題じゃない
メモリイメージがどうであるかの問題
0752デフォルトの名無しさん
NGNGこのようなhogeをvectorかsetにつっこみたいのですが、スマートな方法はどのようなものでしょうか?
hogeの最後の要素を特別な値(-1など)にすることは可能です。
0753デフォルトの名無しさん
NGNGとかかな。
ところで、sizeof(hoge+int())はできるのに、sizeof(hoge/int())ができないのは何故なんだろう…。
0754デフォルトの名無しさん
NGNGあーーーーーーーー
その割り算のテクニック、知らぬ間に脳から蒸発していました。
感謝。どうもありがとう。
0755デフォルトの名無しさん
NGNGsizeof(hoge+int()) == 4になるみたい。謎だ。
0756デフォルトの名無しさん
NGNG#define ARRAY_SIZE(name,type) (sizeof(name)/sizeof(type))
にしておいたのですが、template使ってnameがポインタだった場合に
コンパイルエラーにすることはできないでしょうか?
ちょっとスレ違いで申し訳ないんですが。
>>755
g++ 3.2 でも4でした
0757デフォルトの名無しさん
NGNGhttp://www.eptacom.net/pubblicazioni/pub_it/nl_9.html
なにやらゴソゴソやってるが英語ではない。読めず。
0758753
NGNGinline size_t array_size(T* a){
if (sizeof(a) == sizeof(T*)){
// なんかエラー
}
return sizeof(a)/sizeof(T);
}
これはコンパイルエラーじゃないか。
>>755のヤツは
hogeがポインタに変換されてそれにint()が足されるから、つまりはポインタのサイズになるってことだな。
多分。
0759756
NGNGにありました。
template<class T, size_t N> inline size_t lengthof(T (&)[N])
{ return N; }
ポインタ渡すとたしかに no matching function for call to `lengthof(int*&)' と
拒否してくれた。
上記URLによれば配列のサイズの宣言につかえぬ、という制限があるそうですが、今回は問題ないです。
int hoge = {1,2,3}
int hoge2[lengthof(hoge)]; //error
0760デフォルトの名無しさん
NGNGそんな使い方が出来るとは知らなかった…。。。
0761756
NGNG0762デフォルトの名無しさん
NGNGVC6でコンパイルできない罠・・
0763デフォルトの名無しさん
NGNG0764デフォルトの名無しさん
NGNGMyクソsoftにテポドソ打ち込みたい気分。
0765デフォルトの名無しさん
NGNG一番ケツにかい。
0766デフォルトの名無しさん
NGNGhttp://www.cuj.com/articles/2000/0012/0012g/0012g.htm?topic=articles
http://www.cuj.com/articles/2000/0010/0010h/0010h.htm?topic=articles
動かんと明記されてるよ
0767デフォルトの名無しさん
NGNGpointer型と同じサイズの配列を渡せなくないか・・・・?
0768デフォルトの名無しさん
NGNG0769デフォルトの名無しさん
NGNGchar[256] を投げても 4 が帰ってくるし。
sizeof 使うならマクロじゃなきゃ駄目っしょ。
>>759 が通らないなら >>756 しか無いんじゃないか。
0771デフォルトの名無しさん
NGNG0772デフォルトの名無しさん
NGNGtemplate の特殊化って・・・
0773デフォルトの名無しさん
NGNG(略)言いたいだけちゃうんかと。(略)
と?
0775デフォルトの名無しさん
NGNG「どうにかならんものでしょうか?」 という言いまわしが (・∀・)イイ!!
0776デフォルトの名無しさん
NGNG0777デフォルトの名無しさん
NGNG0778デフォルトの名無しさん
NGNGhttp://www.kmonos.net/wlog/23.php の9/2に、
マクロとsizeofを噛ませて、配列サイズの宣言に使える版。
0779デフォルトの名無しさん
NGNG0780デフォルトの名無しさん
NGNGtemplate<class T> size_t lengthof_(T a[],size_t t)
{ return t/sizeof(T); }
じゃだめか?
0781デフォルトの名無しさん
NGNGそれはポインタを渡しても通っちゃうし配列サイズにも使えないし。
0782デフォルトの名無しさん
NGNG#include <string>
#include <vector>
#include <algorithm>
#include <functional>
template<typename X> std::string int2string(X i) {
return "123"; // dummy
}
int main() {
std::vector<int> vi;
vi.push_back(1); vi.push_back(2); vi.push_back(3);
std::vector<std::string> vs;
std::transform( vi.begin(), vi.end(), std::back_inserter(vs), int2string<int> );
return 0;
}
error LNK2001: 外部シンボル ""class _STL::basic_string<char,struct
std::char_traits<char>,class _STL::allocator<char> > __cdecl
int2string(int)" (?int2string@@YA?AV?$basic_string@DU
?$char_traits@D@std@@V?$allocator@D@_STL@@@_STL@@H@Z)"
は未解決です
となってしまうのですが、なにか間違っているところがありますでしょうか?
教えてください。g++3.xだと通ります。
0783デフォルトの名無しさん
NGNGstd::string (*pf)(int) = int2string<int>;
上の行をtransformの前に入れてみれ。
こける理由はよう分からん。どうも一度は明示的に実体を作ってやらないといけないのかな?
0784デフォルトの名無しさん
NGNGまだ試してないですけどナルホドという感じ。コンパイラの気分になってみればそんなもんかという気もするけど勘弁してほしいな。
普通にstructでoperator()にしますわ・・。どうも。
0785デフォルトの名無しさん
NGNGBCC5.6だと通るね。テンプレートの実体化のタイミングの問題のようだ。
0786デフォルトの名無しさん
NGNG0787デフォルトの名無しさん
NGNG間違ってる所なさそうだから通らないとおかしいのでは?
0788デフォルトの名無しさん
NGNGってかリンク時の問題だから関係ないのでは。
0789デフォルトの名無しさん
NGNGそれは違うと思われ。
0790デフォルトの名無しさん
NGNGリンク時のことも規定されてるの?
0791デフォルトの名無しさん
NGNG0792デフォルトの名無しさん
NGNG0793デフォルトの名無しさん
NGNGVCは文法的に正しく解釈したので正常。
なので言語規格としては正しい。
ただしコードをはかない時点でVCコンパ
イラはアフォ。
ってことになるのかな?
0794デフォルトの名無しさん
NGNG日本語を喋れ...
0795デフォルトの名無しさん
NGNGどこらへんが?
むずかしいことばはわからない?
ひらがなでかいたほうがいいかな?
0796デフォルトの名無しさん
NGNG正直同感。ひらがなでもいいから、規格に沿って正確な技術用語で
言いたいことを書いてみてもらえない?
0797デフォルトの名無しさん
NGNGしないとおかしいんじゃない?
0798デフォルトの名無しさん
NGNGonline eva.ではわからん。残念。
Comeau C/C++ 4.3.0.1 (Aug 20 2002 15:39:28) for ONLINE_EVALUATION
Copyright 1988-2002 Comeau Computing. All rights reserved.
MODE:strict errors C++
In strict mode, with -tused, Compile succeeded (but remember, the Comeau online compiler does not link).
0799デフォルトの名無しさん
NGNGコンパイラは文法については正しく理解している。
ただコードを吐かないのは問題。
って意味なんだけど。
0800デフォルトの名無しさん
NGNG799がVCを擁護したくてたまらないのなら止めませんが。
0801デフォルトの名無しさん
NGNGそうなん?その部分を聞いているんだが。
> 799がVCを擁護したくて…
わかったわかった。
あんたが全て正しい!
>>799はVC厨!
これでいいか?
とりあえずマターリ進行なのに荒らすな。
0802デフォルトの名無しさん
NGNG788=799は最初にname manglingの問題かなにかと取り違えたのが
残念だったということで。
0803デフォルトの名無しさん
NGNG0804デフォルトの名無しさん
NGNG「呼ばれない限りコード生成は認めんぞゴルァ!
(ポインタ渡しは認めない)」
ってことではないかと。
漏れも同じエラーで引っかかったとき、そう解釈
してあきらめた。
とりあえずVC厨といわれそうなので…
M$、VCは糞!
とでも言ってみる。
>>803
あ、ゴメン…。
0805次の話題
NGNGiteratorの型はmap<T,U>を使って表せますッけ?
うーん、map<T,U>::iterator::???
0806デフォルトの名無しさん
NGNG0807デフォルトの名無しさん
NGNG...
0808デフォルトの名無しさん
NGNGそうなら買ってみてもイイ!かも
0809デフォルトの名無しさん
NGNGう〜ん...
スレの趣旨がずれてきているのでC++スレ
の方がよろしいかと。
ちなみに私は使ったことないのでナントモ。
スマソ...
0810デフォルトの名無しさん
NGNGアルゴリズムって標準では存在しないっすよね?
for_eachもどきの自作かboost::filter_iteratorでしょうか? なにか知恵を。
0811デフォルトの名無しさん
NGNGついてこない。
フロントエンドだけ。
0812デフォルトの名無しさん
NGNGvaluetypeの方はどういう基準で選別するの?
0813デフォルトの名無しさん
NGNG見ないつもり
0814デフォルトの名無しさん
NGNG一般的にどちらをつかうべきなのか悩んでいます。
0815デフォルトの名無しさん
NGNGfind だと指定した値ぴったしの要素じゃないと見つからない。
lower_bound は指定した値以上の要素があれば一致しなくてもヒットする。
0816814
NGNGそうでした。ありがとうございます。
0817デフォルトの名無しさん
NGNG鬱死
0818デフォルトの名無しさん
NGNG0819デフォルトの名無しさん
NGNGその述語晒せ。
0820デフォルトの名無しさん
NGNGstruct CFooCompar : public std::binary_function< const CIFoo*, const CIFoo*, bool > {
result_type operator()( first_argument_type first, second_argument_type second ) const {
return ( first->GetSize()() < second->GetSize() );
}
};
です。ソートするvectorは、vector<CIFoo*>ではなくvector<CFoo*>で、
class CFoo : public CIFoo { ... }; です。
0821820
NGNG0822820
NGNG0823デフォルトの名無しさん
NGNGCIFoo と CFoo は適当に定義した。CFooCompar は 820 のまま。
class CIFoo {
protected:
int value;
public:
CIFoo() { value = 0; }
CIFoo(int i) { value = i; }
int GetSize() const { return value; }
};
class CFoo: public CIFoo {
public:
CFoo(int i) { value = i; }
};
ostream &operator<<(ostream &o, CFoo &c) { return o << c.GetSize(); }
int main()
{
CFoo c1(34), c2(78), c3(56), c4(12);
vector<CFoo*> vc; vector<CFoo*>::iterator itr;
vc.push_back(&c1); vc.push_back(&c2); vc.push_back(&c3); vc.push_back(&c4);
for(itr = vc.begin(); itr != vc.end(); itr++) cout << **itr << endl;
cout << endl;
sort(vc.begin(), vc.end(), not2(CFooCompar()));
for(itr = vc.begin(); itr != vc.end(); itr++) cout << **itr << endl;
cin.get();
return 0;
}
0824820
NGNGどうも。
こちらの手元でも単体では動きました。CIFooは純粋仮想関数
だけしかもっていなくてGetSize()はCFooの方でインプリされてるん
ですけどまぁ一緒ですよね。
というわけでSTLとは関係ない場所でメモリ破壊でもしてるかな・・
お騒がせしました。
0825823
NGNGpublic:
virtual int GetSize() const = 0;
};
class CFoo: public CIFoo {
int value;
public:
CFoo(int i) { value = i; }
int GetSize() const { return value; }
};
に直したけど、やっぱり動くね。何がいけないんでしょ。
0827825
NGNG0828
NGNG0829デフォルトの名無しさん
NGNGstruct DeleteObject {
void operator() (T* ptr) {
delete ptr;
ptr = NULL; } };
class Test {
public:
vector<int*> v;
public:
Test() {
v.reserve(10);
for (int i = 0; i < 10; ++i) {v.push_back(new int);}
}
void Delete() {for_each(v.begin(), v.end(), DeleteObject<int>());}
~Test() { } };
int main() {
Test hoge;
hoge.Delete();
vector<int*> v(10);
for (int i = 0; i < 10; ++i) { v.push_back(new int); }
for_each(v.begin(), v.end(), DeleteObject<int>());
if (hoge.v[0] == NULL) { cout << "OK" << endl; }
if (v[0] == NULL) { cout << "OK" << endl; }
return 0; }
のソースの処理結果が
OK(main内部で回した奴)
しか表示されません。何故、Testで回したループは正常に動作しないのでしょうか。
0830デフォルトの名無しさん
NGNG正常に動作してるよ。
vector<int*> v(10); ←となっているから、main()内のvは実際には
20個まで増える。だからhogeとvは対称には比べられないよ。
0831デフォルトの名無しさん
NGNGポインタへの参照を渡さないといけない。
template <typename T>
struct DeleteObject {
void operator() (T*& ptr) {
delete ptr;
ptr = 0;
}
};
0832デフォルトの名無しさん
NGNGtemplate <typename T>
struct DeleteObject {
void operator() (T*& ptr) {
delete ptr;
ptr = 0; }};
class Test {
public:
std::vector<int*> v;
Test() {
v.reserve(10);
for (int i = 0; i < 10; ++i)
v.push_back(new int); }
~Test() { }
void Delete() {
std::for_each(v.begin(), v.end(), DeleteObject<int>()); } };
int main()
{
Test hoge;
hoge.Delete();
std::vector<int*> v;
for (int i = 0; i < 10; ++i)
v.push_back(new int);
std::for_each(v.begin(), v.end(), DeleteObject<int>());
if (hoge.v[0] == 0) { std::cout << "OK" << std::endl; }
if (v[0] == 0) { std::cout << "OK" << std::endl; }
}
0833デフォルトの名無しさん
NGNGmainのvで10個確保したのに、そこからpush_back?
0834デフォルトの名無しさん
NGNG0835デフォルトの名無しさん
NGNGのにポインタの参照を渡してなかったという事でよろしいか?
0836デフォルトの名無しさん
NGNG0837デフォルトの名無しさん
NGNG0838829
NGNG>T*&
ということは、ポインタ値を値渡ししているという認識で
あっていますでしょうか。
>833
ポカしてますね(汗
v(10, new int)でpush_backはなしの方向で・・・
0839デフォルトの名無しさん
NGNGポインタの参照渡しです。
それから今実験してみたけど、v.reserve(10); としても空のvectorが
10個確保されるわけではないようだ。だからやっぱりhogeは10個まで、
vは20個まで増えることがわかったよ。
0840デフォルトの名無しさん
NGNGv(10, new int)だと、同じポインタが10個満たされるよ。
0841814
NGNGiteratorまわしてiter->firstを set<key_type> につっこんでみるとか、
std::unique_copy あたりで vector<value_type> につっこんでみるとか、
そんな方法しかないでしょうか? コピーが発生しない上手な方法があったら教えてもらえませんか。
0842デフォルトの名無しさん
NGNGmultimap::size_type count_unique( const multimap& x )
{
multimap::size_type result = 0;
const multimap::const_iterator end = x.end();
for( multimap::const_iterator i = x.begin()
; i != end
; i = x.upper_bound( i->first ) )
{
++result;
}
return result;
}
0843814
NGNGありがとうございます。勉強になりました。
;; multimap::size_type って可能なんですね・・
;; multimap<hoge>::size_type しか許可されないかと思ってた。
0845829
NGNGT*&はそうですよね(汗
T*はポインタの値渡しだなぁと思いまして
>v.reserve(10); としても空のvectorが10個確保されるわけではないようだ。
>v(10, new int)だと、同じポインタが10個満たされるよ。
やっぱり、適当に書いてたらダメですね(汁
今度からは、ちゃんと考えてかきます(´-`)
0846デフォルトの名無しさん
NGNG型指定しないとコンパイルエラーになります。それで、templateを使って
型を類推させるようにしてみました。typedefが半分ほどしか活かされて
ないのが残念ですが。
template <typename Key, typename Value>
std::multimap<Key, Value>::size_type count_unique(const std::multimap<Key, Value>& x)
{
typedef std::multimap<Key, Value> Mkv;
Mkv::size_type result = 0;
const Mkv::const_iterator end = x.end();
for(Mkv::const_iterator i = x.begin(); i != end; i = x.upper_bound(i->first))
++result;
return result;
}
0847デフォルトの名無しさん
NGNGそうですね。T*はポインタの値渡しですね。だから、ポインタの指す値
を変えることはできても、ポインタそのものの値の変更は反映されな
いのでしょう。
0848デフォルトの名無しさん
NGNG説明はどうも誤訳のようですね。「戻り値はvalue以上の」とありますが、
これは「戻り値はvalueより大きい」となると思います。
0849デフォルトの名無しさん
NGNG原文はmore than?
0850デフォルトの名無しさん
NGNGそれとも、原文からして間違っているのかなあ?一応鉛筆で直して
おいたけど。英語の原本は持ってないのです。
0851デフォルトの名無しさん
NGNGvector v;
copy(hoge.begin(), hoge.end(), back_inserter(v));
でできますが、vがsetの場合ってcopyの第3引数はどう書けば
よいのでしょうか? 教えてください。
0852デフォルトの名無しさん
NGNGcopy(hoge.begin(), hoge.end(), inserter(s, s.end()));
0853デフォルトの名無しさん
NGNG0854デフォルトの名無しさん
NGNG0855デフォルトの名無しさん
NGNG0856デフォルトの名無しさん
NGNG0857デフォルトの名無しさん
NGNG普通こんなことしないと思うけど、なんとなく気になったんで。
ただのゴミだと思うけど、SEGV出る可能性あるのかな。
0858デフォルトの名無しさん
NGNGCで言うと配列の添え字の一つ大きい値を実体化させるようなもので、
危険です。
0859デフォルトの名無しさん
NGNG*foo.end() が既にダメだから、「end() の先」 じゃなくて 「end() 以降」 は
アクセスしない事。
「ただのゴミだと思う」 って、アクセスしちゃったの? 知らないよ。
仮に foo.end() にアクセス成功したとしても、*foo.end() が何を指すかわから
ないでしょーが。
iterator::operator* がガードしてくれる場合もあるかもしれないけど。
何かアクセスしたい事情でもあるの?
>>858
未確認情報だけど、T array[N]; の場合、array[N] にアクセスできる保証がある
って聞いた事がある気がする。
あくまで未確認。
0860デフォルトの名無しさん
NGNG>>859
そうです。ANSI-Cではarray[N]のアドレスを取れることを保証しています。
但し値を実体化したら動作は未定義です。
STLのend()もこれと事情は似ていて、end()は取れますが、*end()は未定義
です。
0862857
NGNG全くもってアクセスしたい事情はないんですが、
厳密に駄目なのか、ひょっとしたらendだけなんか保証があるのかとか
はっきりわからなかったってことです。
0863デフォルトの名無しさん
NGNG*end()は何もないので、動作は未定義です。
>>861
array[N]はアドレスを取ったり、アドレスと比較したりする事だけが許されて
いて、アクセスした時の動作は未定義です(大抵他の確保したオブジェクト
を指すことが多い)。
0864デフォルトの名無しさん
NGNG俺もどっかでそんな話聞いた気がする。
アクセスしても意味のある値は取れないけどSEGVとかにはならないとか何とか。
気のせいだったかしら?
0865デフォルトの名無しさん
NGNGしないから、array[N]にアクセスするのもやっぱりまずいでしょ。
0867デフォルトの名無しさん
NGNG他方では、それ、彼は自然、およびそれを使用する方法へのその構造
(回使[[ものいくらか]])を理解することができます?p、達する、そしての外部で。
0868デフォルトの名無しさん
NGNGあなたの文章を理解するのは難しいです。
0869アバウト意訳
NGNGしかし、それが使用法として構造上自然であると、
いくらか学習することで理解できるようになるでしょう。
0870デフォルトの名無しさん
NGNGすげー。
でも 「p、達する、そしての外部で。」 は?
0871デフォルトの名無しさん
NGNGそして膣外射精。
0872870
NGNG0873デフォルトの名無しさん
NGNGワロタ
0874デフォルトの名無しさん
NGNGそれは熟練するために全能力に置いて心細いです。
それはどんなに問ったんですか。
0875デフォルトの名無しさん
NGNG1 行目と 2 行目は理解できるけど、3 行目は理解できない。
0876デフォルトの名無しさん
NGNG「どんな風に練習されたんですか?」のような気がする。
0877デフォルトの名無しさん
NGNG0878デフォルトの名無しさん
NGNGよいのでしょうか?
0879デフォルトの名無しさん
NGNGコンテナに要素が転送される順番が重要な時は、copy() と copy_backward() を
使い分ければいいんじゃないでしょうか。
例えば、コピー先が要素のキー値の重複を許していない場合とか・・・。
あんまり思いつきませんけど。
普段は copy() 一本でいいんじゃないでしょうか。
いきなり copy_backward() とか書かれると、意味を探らないと逝けなくなるし。
0880デフォルトの名無しさん
NGNG>>879さんの意見の他に、自分自身のコンテナ内でブロック転送する
場合、転送前後の領域が重なる際に使い分けが必要となる。
|a|b|c|d|e|
↓
|a|b|c|d|e|
のような時はstd::copy()でいいが、
|a|b|c|d|e|
↓
|a|b|c|d|e|
の時はstd::copy_backward()を使わないと内容が転送中に壊れてしまう。
0881デフォルトの名無しさん
NGNGおおっありがとう!
どうやらCで言う所のmemcpy()とmemmove()のような関係にある
ようですね。ちょっとニュアンスが違うけど。
試してみます。
0882デフォルトの名無しさん
NGNGconst_iterator(に相当するもの)の値参照の返り値をconst var*にしたいのですが
何かお約束の方法などないでしょうか。
# std::vector<var>とすればconst_iterator::operator*()の返り値がconst varとなって
# varをconstにしたいという目的は達せられるんですが、
# どうしてもstd::vector<var*>とする必要があるのです。
試してみたのは
1. std::vector<const var*>::const_iteratorを使う。
これだとstd::vector<var*>::iteratorからの代入が出来なくなってしまいます。
# gcc2.95ではiteratorはpointerと同義のようで出来るようですがgcc3.2では×です。
2. const_iteratorのoperator*()をオーバーロードする。
class my_const_iterator : public std::vector<var*>::const_iterator {
const var* operator*(void) { return operator*(); }
};
のようにconst_iteratorを継承してoperator*()をオーバーロードすると
(現在はとりあえずこうしています)、gcc2.95ではconst_iteratorはクラスではないから
継承できない(iterator≡pointer)とダメだしされます。
0883デフォルトの名無しさん
NGNGconst var* foo = *citer;
ではあかんのけ?
0884883
NGNG読んだことないから非常に無責任な事この上ないんだけど、
boost::indirect_iteratorの実装は参考にならないかな?
http://user.ecc.u-tokyo.ac.jp/~g940455/wp/boost/iterator_adaptors.html
0885882
NGNGそれは逐次一次変数に代入してから使うということでしょうか。
できればconst_iterator::operator*()が直接const値になっていて欲しいです。
>>884
ちょっと眺めてみます。情報どうもです。
0886883
NGNG完成したら const_const_iterator とでも銘々して僕にもくださいw
0887882
NGNGまだよく判ってませんがとりあえず使いながら理解していこうと思います。
--------------
#include <boost/iterator_adaptors.hpp>
typedef boost::indirect_iterator_pair_generator<
std::vector<var*>::iterator, // 元になるイテレータ(or ポインタ)
var // operator*(operator*())が返す修飾なしの型
// ここにconstと非constについての参照型やポインタ型が並ぶが省略可
> iterator_gen; // とりあえず命名
std::vector<var*> var_list;
iterator_gen::iterator i(var_list.begin());
iterator_gen::const_iterator j(var_list.begin());
*i; // var型
*j; // const var型
--------------
>>883
どうも助かりました。
命名するまでもないものですがお役に立てば・・・。
0888デフォルトの名無しさん
NGNG0889デフォルトの名無しさん
NGNG#include <stdio.h>
を書くと
stlport\stdio.h(22) : fatal error C1083:
インクルード ファイルがオープンできません。'../include/stdio.32771'
というエラーが出ます。
該当する行は
# include _STLP_NATIVE_C_HEADER(stdio.h)
です。
こんなエラーって出たこと有る方いませんか。
解決法を教えてください。
0890デフォルトの名無しさん
NGNGSTLPortはどこに入れてるのさ。
0891デフォルトの名無しさん
NGNGそういう時は-P付けてプリプロセッサの出力見れ。
うちだと
>#line 463 "c:\\ap\\devel\\vs6\\vc98\\include\\../include/stdio.h"
となってて、試しに環境変数INCLUDEをunsetしたら同じエラーが出た。
つまり、vcvars32.bat実行するなり手動で設定するなりしろボケ、と。
0892デフォルトの名無しさん
NGNG使うときのネームスペースどうしてます?
他の環境(社内の違う人)に渡すときに
STLPortを使ってることをわかりやすいように
_STL:: を使ったほうがいいですかね
0893デフォルトの名無しさん
NGNG無駄
STLportをわかってる人ならそんなん要らん。
STLportをわかってない人ならそんなん意味ふめ。
でさ、もーわかったと思うけどSTLPortじゃなくて STLport な。
0894デフォルトの名無しさん
NGNGヤクザ(((( ;゚Д゚))))ガクガクブルブル
0895デフォルトの名無しさん
NGNG0896デフォルトの名無しさん
NGNG意味がわかんないのですが
環境変数 INCLUDE に stlport のフォルダを設定するって事?
0897デフォルトの名無しさん
NGNGint main()
{
std::vector<int>* vect;
vect = new std::vector<int>;
vect->push_back(1);
vect->push_back(4);
vect->push_back(2);
vect->push_back(3);
vect->push_back(5);
std::for_each(vect->begin(), vect->end(), std::ostream_iterator<int>(std::cout, " "));
}
0898デフォルトの名無しさん
NGNG0899デフォルトの名無しさん
NGNGありがとうございます〜。大きな勘違いをしてました。
0900デフォルトの名無しさん
NGNGと叱られてしまいました。どうしてでしょうか?わかりません。
template <typename T>
struct test : public std::unary_function<T, void> {
void operator()(T p) {
std::ostream_iterator<T>(std::cout, " ") = p;
}
};
int main()
{
std::vector<int>* vect;
vect = new std::vector<int>;
vect->push_back(1);
vect->push_back(4);
vect->push_back(2);
vect->push_back(3);
vect->push_back(5);
test<int> t();
std::for_each(vect->begin(), vect->end(), t); // test<int>()とすると通る
delete vect;
}
0901デフォルトの名無しさん
NGNGtest<int> t(); → test<int> t; とすると通りました。
しかし、なぜだろう?関数オブジェクトじゃないのか?
0902デフォルトの名無しさん
NGNG0903デフォルトの名無しさん
NGNGなるほど。宣言の形が関数をしているからですね。しかし、次の例では
関数オブジェクトと見なされるようです。うーん難しい。
template <typename T>
struct test : public std::unary_function<T, void> {
test(T v = 0) : val(v) {}
void operator()(T p) {
std::ostream_iterator<T>(std::cout, " ") = p * val;
}
private:
T val;
};
int main()
{
std::vector<int>* vect;
vect = new std::vector<int>;
vect->push_back(1);
vect->push_back(4);
vect->push_back(2);
vect->push_back(3);
vect->push_back(5);
test<int> t(2);
std::for_each(vect->begin(), vect->end(), t);
delete vect;
}
0904デフォルトの名無しさん
NGNG0905デフォルトの名無しさん
NGNG本当ですね。実はt(int); とやったらコンパイルは通るものの、
リンク時にエラーが出て首をひねっていたんですよ。
そういう事だったのか。関数オブジェクトに対する理解が一つ深く
なりました。
0906デフォルトの名無しさん
NGNG正しい対処法も載ってたけど、コンパイラによってはその「正攻法」が使えず、
汚い書き方しかでけへん、と嘆いていた記憶が。
0907デフォルトの名無しさん
NGNG0908デフォルトの名無しさん
NGNG使えるようになるのは初めて知った。
0909デフォルトの名無しさん
NGNGコマンドラインからコンパイルしようとしてるんだろ?
だったらVC++のコマンドラインコンパイラ用の設定をちゃんとやれ、
という事。設定方法が分からないなら「vcvars32.bat」でヘルプ検索
でもしろ。
配列の初期化を、コンパイル時に自動的に生成する方法って無いですか?
#include <iostream>
#include <vector>
using namespace std;
typedef void __cdecl FUNC(void);
typedef FUNC* PFUN ;
template<int n> struct f{ static FUNC f_; };
enum Id{ MOGE, HOGE, HAGE, SAGE, maxId };
template<MOGE> void f<id>::f_(void) { cout<<"MOGE"<<endl; }
template<HOGE> void f<id>::f_(void) { cout<<"HOGE"<<endl; }
template<HAGE> void f<id>::f_(void) { cout<<"HAGE"<<endl; }
template<SAGE> void f<id>::f_(void) { cout<<"SAGE"<<endl; }
// ↓を自動化したい!
PFUN funcTable[maxId] = { f<0>::f_, f<1>::f_, f<2>::f_, f<3>::f_ };
void main()
{
for(int k=0; k<maxId; ++k ) funcTable[k]();
}
0911訂正 ◆xSK1SiC5MI
NGNGtemplate<> void f<HOGE>::f_(void) { cout<<"HOGE"<<endl; }
template<> void f<HAGE>::f_(void) { cout<<"HAGE"<<endl; }
template<> void f<SAGE>::f_(void) { cout<<"SAGE"<<endl; }
UP用に書き換えた時ミスったっス。
0912デフォルトの名無しさん
NGNGプリプロセッサ使ってよければ
http://lists.boost.org/MailArchives/boost/msg36155.php
とか。templateのみだと無理だと思う。
0913デフォルトの名無しさん
NGNGエラーが出ました。
このエラーは、もちろんalgorithm.h中でrand()を呼び出している際に、std::rand()
とせずに単にrand()として呼び出しているせいです。
こういう場合、どうしてもusing namespace std;を付けなければいけないのでしょうか?
それとも、algorithm.hを書き換えるべきでしょうか?
コンパイラはBorland-C++5.5.1 + STLport4.5.3です。
0914デフォルトの名無しさん
NGNG.h をはずしたらどうなる?
0915デフォルトの名無しさん
NGNGもちろん #include <algorithm> としてあり.hは付けていません。
妥協策として、using std::rand; を入れてエラーを回避しています。
0916デフォルトの名無しさん
NGNGstd::remove()を使うと、
エラー E2034 9-8-4.cpp 30: 'int *' 型は 'const char *' 型に変換できない(関数 main() )
エラー E2342 9-8-4.cpp 30: パラメータ '__path' は const char * 型として定義されているので int * は渡せない(関数 main() )
エラー E2227 9-8-4.cpp 30: std::remove(const char *) の呼び出しに余分なパラメータがある(関数 main() )
というエラーが出ます。std::remove(const char*)との関数の多重定義がうまく解決できて
ない模様です。STLport独自の名前空間である _STLを使って_STL::removeとすることにより
エラーを回避しています。これも仕方ないのでしょうか?
0917デフォルトの名無しさん
NGNGSTLportのヘッダがそのusing宣言を済ましているはずなのだが・・・。
具体的にrand()って書いてあるのは、
stlport/stl/_algo.c : 434
で、ここはSTLportのnamespaceの中のはず。
0918デフォルトの名無しさん
NGNGですよね。でも、だめなんです。うーむ。Borland-C++とSTLportの相性が悪いのか・・・・
0919デフォルトの名無しさん
NGNGC++Builder6はSTLport採用だそうな。
プリプロセッサ出力を見たらなんかわかるかも。
0920デフォルトの名無しさん
NGNGその手がありました!今からプリプロセッサ(cpp32.exe)を通して、どのように
展開されているか見てみます。これではっきりしますね。ありがとうございます。
実はC++Builder6も持っています。試してみた所、全く同様のエラーが出ました。
0921デフォルトの名無しさん
NGNGusing std::randを生成してくれていません。rand()そのものはstd名前空間に
包まれたままです。
using namespace std;を前提に書かれているようです。折角の名前空間
の機能が活かされていないような気がして。
でも、バグと分かれば、割り切って使うことができますね。
0922デフォルトの名無しさん
NGNGSTLportにはnamespaceまわりのオプション(マクロ)が何個かあるから、
ソースとプリプロセッサ出力見ながら、それぞれのオプションの動きを追えば・・・。
めんどくせぇな。
0923デフォルトの名無しさん
NGNGわかりました。stlport.orgを見てじっくり研究してみます。
#低レベルな質問ばかりしてスマソ。過去ログみて皆さんのレベルの高さにビクーリ。
0924デフォルトの名無しさん
NGNGしてないです
VCのIDEからです
0925デフォルトの名無しさん
NGNG0926デフォルトの名無しさん
NGNG順番てのがわからんけど、
一気に長さカウントして領域確保してコピペじゃだめなの?
0927デフォルトの名無しさん
NGNGiteratorじゃなくてalgorithmでコピーしたいんですが・・
0928デフォルトの名無しさん
NGNGboost::lambda使えば?
int main()
{
std::vector<std::string> vs;
std::string str;
vs.push_back("abc");
vs.push_back("def");
vs.push_back("ghi");
std::for_each(vs.begin(), vs.end(), str += boost::lambda::_1);
std::cout << str << std::endl;
}
0929デフォルトの名無しさん
NGNGBCCでつ・・
0930デフォルトの名無しさん
NGNG0931デフォルトの名無しさん
NGNG0932デフォルトの名無しさん
NGNG0933デフォルトの名無しさん
NGNG0934デフォルトの名無しさん
NGNG0935デフォルトの名無しさん
NGNG0936デフォルトの名無しさん
NGNGgetline(buf, count);
0937デフォルトの名無しさん
NGNG0938デフォルトの名無しさん
NGNG0939デフォルトの名無しさん
NGNGファイル全体をstringに読む場合で、istream_iteratorを使わない方法で
綺麗なのってどんなんですかね?
0940デフォルトの名無しさん
NGNG俺はこういう風にしてるけど、algorithmとか使った方がいい?
int main()
{
std::ifstream ifs("filename");
std::string str, tmp;
while (std::getline(ifs, tmp))
str += tmp + '\n';
std::cout << str;
}
0941デフォルトの名無しさん
NGNG0942デフォルトの名無しさん
NGNGそれだったら std::string str(mmapaddr, length); のように長さを与えて
やらないといけないのでは?
0943デフォルトの名無しさん
NGNGを使えばいいのか。
0944デフォルトの名無しさん
NGNGint main()
{
std::ifstream ifs("filename");
std::string str;
std::getline(ifs, str, '\0');
std::cout << str;
}
0945デフォルトの名無しさん
NGNGgetlineなんてものが標準にあったのか…
勉強不足だな…死のう(-_-)
0946デフォルトの名無しさん
NGNG生�`
0947デフォルトの名無しさん
NGNGC++が、ローカルクラスとtemplateを組み合わせて良い仕様だったら
面白い物が書けるんだけどねぇ。
0948デフォルトの名無しさん
NGNGパラメータの型によってメンバがダイナミックに変化するクラス?
(((( ;゚Д゚))))ガクガクブルブル
0949デフォルトの名無しさん
NGNG0950デフォルトの名無しさん
NGNG0951デフォルトの名無しさん
NGNG0952デフォルトの名無しさん
NGNG0953デフォルトの名無しさん
NGNG0954デフォルトの名無しさん
NGNGじゃあVC++IDEのオプション/ディレクトリ設定でインクルードパスの
設定をちゃんとやる。つか、デフォルトからいじってなければ問題
ないはずだが…
0955デフォルトの名無しさん
NGNG♥♠♫♣☻♥♠♫♣☻
♥♠♫♣☻♥♠♫♣☻
♥♠♫♣☻♥♠♫♣☻
♥♠♫♣☻♥♠♫♣☻
0956デフォルトの名無しさん
NGNGboost だのなんだのもあつかえるように。
0957デフォルトの名無しさん
NGNGboostスレと統合ですか?
0958デフォルトの名無しさん
NGNG希望。
0959デフォルトの名無しさん
NGNG0960デフォルトの名無しさん
NGNGC++ ジェネリックプログラミング (STL/Boost/Loki 統合スレ)
あたりでいかが?
0961デフォルトの名無しさん
NGNGC++にそんなに沢山スレは要らないと思う。
0962デフォルトの名無しさん
NGNGboost::any とか、それにちかいことやってんじゃん。
0963デフォルトの名無しさん
NGNG0964デフォルトの名無しさん
NGNGナニにガクガクしてんだかわからん・・
>>963
しかし、「(STLで)どのようにかけますか?」「xxxですが、boostならもっと楽でxxx」
みたいなやりとりが多いのも事実。再統一してもいいな。
0965デフォルトの名無しさん
NGNGまあ、漏れは別にどっちでも構わん。
もともとどっちも進行の遅いスレだし。
0966デフォルトの名無しさん
NGNG細分化されすぎるとワケワカラン。
誰か新スレをSTLで作ってくだちい。
0967boost::thread new_thread( &f );
NGNG「新スレですが、boostならもっと楽に新スレッド作れますよ。」
0968こんなんでいい?
NGNGC++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。
STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/
【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
他の関連スレ、その他リンクは >>2-5 あたりに。
0969デフォルトの名無しさん
NGNGよいんでない?
リンクはこんなもんかなぁ。
----------------------------------------
関連スレ
C++相談室 part12
http://pc3.2ch.net/test/read.cgi/tech/1035005882/
リンク
STLPort
http://www.stlport.org/
boost
http://www.boost.org/
Loki
http://freshmeat.net/projects/lokilibrary/
http://www.geocities.com/rani_sharoni/LokiPort.html
ISO/IEC 14882
Programming languages -- C++
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998
http://www.kuzbass.ru/docs/isocpp/
0970デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1037795348/l50
0971デフォルトの名無しさん
NGNG0972デフォルトの名無しさん
NGNGあまぐりむいてもらうならイマノウチ
0973デフォルトの名無しさん
NGNG_ー|ー-ー | _ ヽ \ | |
__|_」  ̄~| ̄ / レ |
/ |ノ ^ヽ _.、| < ノ
(_ノ| ノ ∠_ノ\ \ /
. _」__  ̄──
_| \ | ヽ /
(ノ^|. | | |
(_._」 レ / \
●
ヽ(;´Д`)ノ
0974デフォルトの名無しさん
NGNG_ー|ー-ー | _ ヽ \ | |
__|_」  ̄~| ̄ / レ |
/ |ノ ^ヽ _.、| < ノ
(_ノ| ノ ∠_ノ\ \ /
. _」__  ̄──
_| \ | ヽ /
(ノ^|. | | |
(_._」 レ / \
●
ヽ(´Д`;)ノ
0975デフォルトの名無しさん
NGNG○
ミ∴
∴∴
0976デフォルトの名無しさん
NGNG0977デフォルトの名無しさん
NGNGmapにinsertしたいんだけどどうすればいいの?
0978デフォルトの名無しさん
NGNGstd::auto_ptrにはコピーコンストラクタはありますが、通常のコピーコンストラクタ
と意味が違い所有権の譲渡があります。
コンテナにstd::auto_ptrを挿入するのはCOAPと呼ばれ、動作が保証されないばか
りでなく、挿入そのものを禁止しているSTL処理系があります。
コンテナにスマートポインタを挿入したければboost::shared_ptrを使いましょう。
0979デフォルトの名無しさん
NGNGhttp://www.kmonos.net/alang/boost/smartptr.html
0980デフォルトの名無しさん
NGNG本屋で Effective STL の第8項を立ち読みしましょう。
つーか、新しい話題は新スレへどーぞ。
http://pc3.2ch.net/test/read.cgi/tech/1037795348/
0981デフォルトの名無しさん
NGNGありがとうございます。
早速よんでみます。
ところでこのスレはつぶさないの?
放置でDat待ち?
0982デフォルトの名無しさん
NGNGmapにinsertしたいんだけどどうすればいいの?
0983デフォルトの名無しさん
NGNGmamco に insert したいんだけどどうすればいいの?
0984デフォルトの名無しさん
NGNG何も被せず生のままinsertする事が推奨されてます。
0985984
NGNG0986デフォルトの名無しさん
NGNGそのmamcoコンテナは、要素の出し入れを繰り返すと、だんだん中に入る要素の数が
増える不思議なコンテナだよ。
0987983
NGNGまだ generic に手を出すには時期尚早なんで、
スマートポインタskin_ptrでwrapしておきまつ・・・
>>986
空間確保を繰り返すと、確保に慣れて始めから多目に空間を確保
するようになるというコンテナであると聞きますた。
ホントにmamcoみたいなコンテナあったら面白いカモ(w
0988デフォルトの名無しさん
NGNG0989デフォルトの名無しさん
NGNG復帰不可能だ。
# ・眼中にない completely ignore
0990デフォルトの名無しさん
NGNG0991デフォルトの名無しさん
NGNGじゃあ最近の流行は
NoMoneyExceptionか?
0992デフォルトの名無しさん
NGNG0993デフォルトの名無しさん
NGNGコンテナがStdExceptionに汚染され、
StdExceptionに汚染されたコンテナへ挿入時に
StdExceptionをキャッチしてしまうと
挿入アイテムがStdExceptionに汚染されます。
0994デフォルトの名無しさん
NGNGレス数が950を超えています。1000を超えると書き込みができなくなります。