●STL スレッド●
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG0232デフォルトの名無しさん
NGNGhttp://www.dinkum.com/vc_fixes.html
直すべし。
つーか、SPに入れてくれよ。>MS
0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNGそれに、dinkumのパッチとVC6のSP5は衝突しているヘッダがあって、
どっちを取るか悩ましいっす。
つーか、STLportを使うべきか。
0235デフォルトの名無しさん
NGNGその方が、何かと幸せだと思われ。
0236デフォルトの名無しさん
NGNG0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNGしかもその遅さが許容範囲を超えるならdinkum patchを宛ててそっちを使え。
0239デフォルトの名無しさん
NGNGrandom_shuffleが元と同じには絶対ならないのって仕様?
(1 2 3 4 5)てsequenceをrandom_shuffleすると
絶対(1 2 3 4 5)にはならないってことね。
とりあえず2回random_shuffleすることにして回避したけど、そのときは。
0241デフォルトの名無しさん
NGNG技術的な相談は、下から。
下っ端の、技術一本でやってる人つかまえて
たばこでも吸いながらマターリと、
付録のSTLをこき下ろそう。
0242234
NGNG問題はそういうことではなくて、
誰が責任をもつか、ってことなんだな。
0243デフォルトの名無しさん
NGNGうーん、
VC の STL (Known Bug あり) を使うと MS が責任をとってくれるの?
STLport を使わずに自作すれば、上の人が責任をとってくれるの?
と考えると、俺は STLport 使うように説得した方が良いと思うけどな。STLport はフリーだけど
品質はかなり高いよ。
もし金を払ってサポートを買いたいって話なら http://www.stlport.org/services.html に情報が
あるから、そちらもどうぞ。
(これ以上は技術と関係なくなりそうだから、プログラマー板かな)
0244デフォルトの名無しさん
NGNGSTLport好きな人、教えてください。
STLportを使った自分のプロジェクトに、VC++6標準のSTLを使ったライブラリ(*.libと*.hが利用可能)を
組み込もうとしたんだけど、上手くいかないんですよう。リリースビルド時に例外起こして逝きます。
デバッガで追いかけてみたらdelete時にメモリ破壊してました(debugビルド時は平気)。
ライブラリのヘッダの
#include <vector>
でSTLportの方のvectorがincludeされてしまい、おそらくそれが原因では無いかと思っておるのですが。
0245デフォルトの名無しさん
NGNGSTLportが一番下ならSTLportが試用されていない。
STLportが一番上ならSTLportが試用されている。
libと同じ設定でビルドしなさい。
0246デフォルトの名無しさん
NGNGすみません、それってlibと同じようにVCのSTL使えって事デスカ?
STLportのディレクトリ設定は、コンパイラに引数で渡してますので最優先で検索されてます。
0247デフォルトの名無しさん
NGNGSTLport は確かマクロを定義すると、ネームスペース std:: ではなく stlport: に閉じ込められるはず。
そうした上で std::vector() と stlport::vector() を別モノとして区別して使うしかないと思われ。
vector なんかを include するときには、諦めてフルパスで 2 つ書くか、STLport の方にはパスを切
らずに、親ディレクトリにパスを切って
#include <vector>
#include <stlport/vector>
みたいに使うとか。(試したことないけど)
0248デフォルトの名無しさん
NGNGありませんか?日本語だと嬉しいのですが
0249デフォルトの名無しさん
NGNGclass a{
proteted:
char b;
int c;
};
class d{
public:
vector<a> e;
};
int main(){
d* D=new d();
a A;
D->e.push_back(A);
int fh;
fh=_open(....,....,...);
//Dをwriteしたい
_close(fh);
return 0;
}
で、Dの内容を書き込みたいのですが、クラスのベクトルを含んだサイズを取得するにはどうすればよいのでしょう。
0250名無しさん@Emacs
NGNGfor_each(D->e.begin(), D->e.end(), hoge());
って感じで hoge() で書き込む処理を書いとくんじゃだめかい?
# ビミョーに主旨と違う答えな気もするけど
0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNGwrite(fh,D,sizeof(D));だったら、ベクトルの中身まで保存されないのです。。。
0253デフォルトの名無しさん
NGNGhttp://www.josuttis.com/cppcode/allocator.html
0254248
NGNGありがとうございます
なかなかシンプルですね(w もうちっと詳しいのどこかに無いかなあ
書籍なんかでもほとんど解説が無いのですがカスタムアロケータって
こういうものでしょうか?
0255デフォルトの名無しさん
NGNGEffective STL の Item 11.
4 page 弱だが、最低限必要なことは書いてあると思われ。
0256デフォルトの名無しさん
NGNG基本的にポインタが含まれるクラスや構造体をバイナリイメージのまま保存しても、ポインタ値が保存されるだけでその参照先は保存されないので、意味がないです。
必要な要素を1個ずつ地道に保存しましょー。
0257デフォルトの名無しさん
NGNGModern C++ Design は?
0258デフォルトの名無しさん
NGNG0259デフォルトの名無しさん
NGNGいざ使おうとなると、
???。
0260名無しさん@Emacs
NGNG0261デフォルトの名無しさん
NGNGstring s1, s2="abc";
s1.assign(s2, 0, s2.size()+1);
if("abc" == s1)
cout << "success" << endl;
else
cout << "failure" << endl;
s1.assign(s2.c_str(), s2.size()+1);
if("abc" == s1)
cout << "success" << endl;
else
cout << "failure" << endl;
を実行した結果が
success
failure
になるんだけど、stringの仕様的にはこれってありなんですかねー?
なんでこうなっちゃうのかはわかるんだけど、
stringの仕様がいまいちわからん。
0262デフォルトの名無しさん
NGNGstd::stringはヌル文字終端ではなく、サイズとデータの組で扱うものなので
(中にヌル文字を含められる)
後者が不一致なのは正しいよ。
0263261
NGNG下が不一致なのは分かるのですが、
上が一致するのは正しいのでしょうか?
というか一致させなければならないのでしょうか?
最近stringクラスを自作していて疑問に思ったもので・・・
0264デフォルトの名無しさん
NGNGstringからassignした場合、size()より大きな長さ指定しても
size()で丸められるからだよ。
0265261
NGNGしかし、ポインタからでもchar_traits::length等で
長さを取得し、丸めることはできると思うのですが・・・
ここら辺は効率、ということなのでしょうか?
0266デフォルトの名無しさん
NGNGポインタからでサイズ指定がある場合は
ヌル文字終端とみなさないでデータブロックとみなすからじゃないかな。
0268デフォルトの名無しさん
NGNGそうでないと「ヌル文字を含むことができる」という仕様なのに
それに適合するデータブロックを設定することができなくなるし。
0270デフォルトの名無しさん
NGNGstringはSTLじゃないよ
0271261
NGNGよく見てますねー(汗
確かにちがいますね。失礼しました。
STLじゃないということで気がついたんですが、
complexクラスの詳しい使い方等知っていらしゃいませんかねー、となたか?
できれば日本語でプリーズ
0272デフォルトの名無しさん
NGNGそれとはもかくcomplexもSTLだっけ?(笑)
でcomplexだが、VCあるならhelpみれば分からん?
0274std::string
NGNG以下のWarningって防ぎようがないんでしょうか?
warning C4251: 'm_strName' : class 'std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' は __export キーワードを使って class 'Test' にエクスポートし
てください。
dllにできないばっかりにMFC(CString)は使いたくないんですが・・・
0275デフォルトの名無しさん
NGNGDLL生成において -MD 指定してる?
0276デフォルトの名無しさん
NGNGみたく、stringが展開される標準のマクロってないんですか?
たとえば、_STRINGにしておけばUnicodeの切り替えが簡単にできるとか
0277std::string
NGNG/MDじゃなくて /MTDになってました。(デバッグ用ライブラリみたいです)。
/MDに変更したら、うまくいきました。
MSVCPRT.LIB マルチスレッド、ダイナミック リンク (MSVCRT.DLL 用インポート ライブラリ) /MD _MT, _DLL
Debug Multithreaded (MTd)
0278デフォルトの名無しさん
NGNGstd::basic_string<_TCHAR>
0279デフォルトの名無しさん
NGNGvector<string>
ってやったんですが、どうしてもWarningが消えないんです。
(warning C4786,VC++6.0)
皆さんはstringの動的配列を使いたいなぁってときはどうしてますか?
-----
#include <windows.h>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
vector<string> vsNames;
return 0;
}
0280デフォルトの名無しさん
NGNGその Warning はまともなソース書いててもSTL使ってる限りどうやっても避けれん。
悪いのはプログラマじゃなくてVC++のほう。
#pragma 使って無理やり消すべし。
#pragma warning(disable:4786)
うろ覚えだから書き方間違ってるかも。
MSDNで #pragma の warning について調べてみろ。
0281デフォルトの名無しさん
NGNGVC++でSTL使うときの基本中の基本。つか検索しろよ。
0282デフォルトの名無しさん
NGNG0283280
NGNGすみませんです。ありがとうございますです。
0284デフォルトの名無しさん
NGNGってできるようになってくれるといいと思わない?
(上のコードちょっと間違えてるかもしれない(特にmem_fun_refの引数)けど、
その辺は見逃して…
0285デフォルトの名無しさん
NGNGすでに何をしてるコードだかわかんないyo!
0286デフォルトの名無しさん
NGNGvector の参照 v を渡したときに、
f(v) の実行 => v.resize(num) の実行
となるような関数オブジェクト f を作りたいんじゃないの。たとえばネストした 2 次元の vector があったときに、
内側の vector に対して、まとめて resize とか reserve したい場合に使える。こんな感じか。
vector<vector<int> > vv;
for_each(vv.begin(), vv.end(), bind2nd(mem_fun_ref(&vector<int>::reserve), 1));
for_each(vv.begin(), vv.end(), boost::bind(&vector<int>::resize, _1, 1));
Borland C++ Compiler 5.5.1 と gcc 2.95.3 で試してみたけど、コンパイルが通ったり通らなかったりだなぁ。
VC6 は void 型のメソッドに対して関数オブジェクト作れないので論外だけど。
0287デフォルトの名無しさん
NGNG>VC6 は void 型のメソッドに対して関数オブジェクト作れないので論外だけど。
無駄にbool型にしたりして急をしのいだりした。
あと、VCのせいではないけどmem_fun系で参照の参照がどうたらこうたらというのも鬱陶しい。
0288デフォルトの名無しさん
NGNGstd::complexなんて思いっきり直感そのままなんだから、
複素数を使いたいんだったら何も悩むこと無いと思うんだけど。
つーか、分からないのに使いたい、というシチュエーションがありえるのか...
#次のスレタイトルは標準C++ライブラリに変更したいね。
0289デフォルトの名無しさん
NGNGboost::bind() とか boost::ref() を使うと幸せになれる。
コレクション v に入ってる要素それぞれについて iter->exec(con); を実行したい、ただし con は参照渡し
という場合のサンプルコード。
for_each(v.begin(), v.end(), bind(&Foo::exec, _1, ref(con));
0290STL消防
NGNG配列を詰める方法どうやるん?
vector<int> ary;
ary.push_back(10);
ary.push_back(20);
ary.push_back(30);
ary.erase(1);
こんなんじゃダメでしょ?
0291デフォルトの名無しさん
NGNGvector<T>::erase() の引数は iterator だから、
ary.erase(ary.begin() + 1);
だろう。vector だと begin() で random access iterator を返してくるので、それに +n して n 番目
の要素を指すイテレータが得られる。
0293STL勉強中
NGNGBorland C++ 5.5.1を使用しているのですが、以下のコードがコンパイ
ルエラーになってしまいます。
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"));
}
エラー E2350 C:\Program Files\Borland\CBuilder5\Include\function.h 327: 参照型へのポインタあるいは参照は定義できない(関数 main() )
エラー E2285 C:\Program Files\Borland\CBuilder5\Include\function.h 338: 'binder2nd<pointer_to_binary_function<const int &,const
char *,void> >::binder2nd(binder2nd<pointer_to_binary_function<const int &,const char *,void> >&)' に一致するものが見つからない
(関数 bind2nd<pointer_to_binary_function<const int &,const char*,void>,char *>(const pointer_to_binary_function<const int &,
const char *,void>&,char * const &) )
『プログラミング言語C++第3版』のP.601に似たようなコードが載っ
ているので、いけそうな気がしたんですが、書き方が悪いのかなあ。
0294名無しさん@Emacs
NGNG何故ダメなのかはちょっと分からないんだけど, foo の引き数を
const int& から int に変えると g++ 2.95.3 ではコンパイル通るよ.
実際,int とかは参照よりも値渡しの方がパフォーマンスいいし,
参照の必要が無いんなら int にしてみては?
# 必要があるんだと・・・どーすりゃいいのかねぇ.
0295デフォルトの名無しさん
NGNGboost::bind(), boost::ref() でいけると思うが。
http://www.boost.org/
0296デフォルトの名無しさん
NGNG0297STL勉強中
NGNG> 何故ダメなのかはちょっと分からないんだけど, foo の引き数を
> const int& から int に変えると g++ 2.95.3 ではコンパイル通るよ.
おお。すばらしい。こちらでも通るようになりました。いろいろ試して
はいたんですが参照とは気がつきませんでした。ありがとうございます。
>>295
教科書にも載っている基本的な部分での問題だったので、気になってい
たのですよ。boostは先ほどダウンロードしましたので、余裕が出来た
ところで英語と格闘してみます。
>>296
いや、それはちょっと(^^;
0298デフォルトの名無しさん
NGNGtransform()を適用したいのですが、可能でしょうか?
0299デフォルトの名無しさん
NGNGつうか、調べればすぐわかることだし、やってみればいいのに。
0300デフォルトの名無しさん
NGNG気のせいですか?
0301デフォルトの名無しさん
NGNG俺は VC6 メインだけど、デバッガ優秀なんで、それほど。
むしろコンパイルエラーが出たときに、エラーメッセージを解読するのが疲れる。
0302名無しさん@Emacs
NGNGtypedef した名前を表示してくれるとカナーリ違うと思うんだけど,それは
望み過ぎだよなぁ,やっぱ.
シンタックスエラーで間違った typedef とかが表示されたら尚更ワケワカンネーヨ
状態になっちまうもんなぁ.
0303302
NGNG0304デフォルトの名無しさん
NGNG疲れる。このブレークポイントはどのテンプレート実体を対象にしたものですか?みたいなダイアログが出てきて少しとまどう。
0305デフォルトの名無しさん
NGNG一度、デバッグするために配列にコピしたこともあるけど、ほとんどは
想像でやってる。
0306デフォルトの名無しさん
NGNGtemplateの最大の欠点だと思う。
でも、しにくいのはコンパイラエラー潰しであって、
ロジックエラーは他と対して変わらないからそんなに気にならない。
コンテナの中身が見難いのはどうしようもないけど。
VC6は便利だけど、templateの実相が甘すぎてtemplate自体が使いにくい。
規格通りのコンパイラがあればいいんだけどねえ。
0307デフォルトの名無しさん
NGNGいや、書き方が悪かった。
transform()の第二引数が、istream_iteratorのケツなんだけど、
それを得る方法がない、の意です。
0308デフォルトの名無しさん
NGNGg++だと最低だね。慣れるまでとてもヨメネー。
0309デフォルトの名無しさん
NGNG引数つきコンストラクタいろいろを犠牲にしていいなら、
typedef std::vector<MyClass> MyVector
↑より↓のが、シンボル短くていいぞ。
class MyVector : public std::vector<MyClass> {};
役に立つ?
0310299
NGNGごめんなちゃ〜い。ちょっと考えて読めばわかりますね。勘違いでちた。
で、回答(試してないけど)ですが、istream_iteratorをデフォルトコンストラクタで作ると、
それがファイル終端になるはずです。記憶違いじゃなければ。
途中で止める方法は、しらない。
0311デフォルトの名無しさん
NGNG.../STLport4.5.1/stlportを指定して最上段に置いたんですが、
コンパイル時に
_site_config.h(51) : fatal error C1189: #error :
"Only multi-threaded runtime library may be linked with STLport!"
cl.exe の実行エラー
なるものが出ます。
STLportの導入って何か他にすべきことがあるんでしょうか・・・。
0312デフォルトの名無しさん
NGNGC/C++ コード生成 使用するランタイムライブラリを
マルチスレッド系にしる!っていわれてんだよ。
0314313
NGNG0315デフォルトの名無しさん
NGNGせめてどうやったかぐらい書くのが礼儀だろ.
0316デフォルトの名無しさん
NGNGそんなんもわからん奴がSTLport使おうとすること自体なんか間違ってると思われ。
いや、STLport使うことで面倒が減るという点において良い効果があることは当然なんだけどね。
0317デフォルトの名無しさん
NGNGシングルスレッドで iostream も要らんのなら
#define _STLP_NO_OWN_IOSTREAMS 1
#define _STLP_NO_THREADS 1
とかもアリ。
0318311
NGNG『マルチスレッド系にしる』とのことでVC++6のヘルプで調べて
プロジェクト→設定→C/C++→カテゴリ→コード生成→マルチスレッド
にしてコンパイルしたところ上記のエラーは消えました。
# VC++6初心者でどこに何があるか判ってなくてすみません。
で今度はリンク時にstl_port_vc6_static.libがないと言われたので、
STLport4.5.1のsrcディレクトリを見るといろいろあったので
NMAKE -f vc6.makとかして出来上がったlibディレクトリを
ツール→オプション→ディレクトリ→ライブラリファイル
に追加しました。これで動きました。
>>317
ありがとございます。
0319デフォルトの名無しさん
NGNGところで Effective STL って訳本出る予定無いんかな?
0320age
NGNG0321長いかも
NGNGアスキーファイルから1行づつデータを取り出して、それをstd::stringに放り込みたいと
思ってます。
で、まず以下のようにしました。
std::ifstream fsHoge("hoge.txt");
while( !fsHoge.eof())
{
string strBuf;
fsHoge >> strBuf;
cout << strBuf.c_str() << std::endl;
}
ですが、これはhoge.txtの中身が
aaa bbb ccc
ddd eee fff 111 222 333
のような場合には意図したようになりません。
char szBuf[1024];
fsHoge.getline(szBuf, 1024);
cout << szBuf << std::endl;
とgetlineを使えば実現できるのですが、1行の長さが1024を超える可能性があるので
不安です。サイズを大きめにとっておけばいいのですが、せっかくstringを使ってるのに
ここでchar[]を使いたくないです。
希望としては、
fsHoge >> strBuf;
としたときに、スペースも文字列として認識する方法とかがあればいいなと思ってます。
何かいい方法ご存じないでしょうか?よろしくお願いします。
0322デフォルトの名無しさん
NGNGstring::getlineはどうよ?
template<class E, class T, class A>
string::basic_istream<E, T>& getline(basic_istream <E, T>& is, basic_string<E, T, A>& str);
0323デフォルトの名無しさん
NGNGwhile (getline(fsHoge, strBuf)) {
cout << strBuf << endl;
}
みたいな。
0324長いかも
NGNGありがとうございました。>>322 >>323
while (getline(fsCurrentMail, strBuf)) {
cout << strBuf.c_str() << endl;
}
これでchar[]の呪縛から逃れられますです。
0325デフォルトの名無しさん
NGNGcout << strBuf.c_str() << endl;
なの?
0326デフォルトの名無しさん
NGNG漏れもそれは気になってた
0327長いかも
NGNG>なぜに
> cout << strBuf.c_str() << endl;
> なの?
あれ?昔stringをそのまま放り込んだらエラーになった経験が・・・
0328長いかも
NGNG> あれ?昔stringをそのまま放り込んだらエラーになった経験が・・・
すみません。
#pragma warning(disable:4786)
を入れる前の話でした。
0329STL勉強中
NGNGboostを試してみました。コンパイラは以前に引き続き、Borland C++ 5.5.1
を使用しています。とりあえず以下のようなコードを書き、1)の部分を
いろいろいじくってテストしてみました。
vector<vector<int> > vv;
vv.resize(4);
1) for_each(vv.begin(), vv.end(), boost::bind(&vector<int>::reserve, _1, 10));
transform(vv.begin(), vv.end(), ostream_iterator<int>(cout, ","),
boost::mem_fn(vector<int>::capacity));
cout << endl;
この状態だと期待通りの動きをしています。次にboostを使わず
2) for_each(vv.begin(), vv.end(), bind2nd(mem_fun_ref(&vector<int>::reserve), 11));
としてみると、コンパイルは通るのですが、reserve()は実行されてい
ないみたいで、結果が
0,0,0,0,
となります。まあ1)で動いているので問題はないのですが。これは
mem_fun_ref()に問題があるのかなと思い、代わりにboost::mem_fn()を
使用してみました。
3) for_each(vv.begin(), vv.end(), bind2nd(boost::mem_fn(&vector<int>::reserve), 12));
するとコンパイルも通らなくなります。std::bind2nd()の方の問題なの
かな?
最後にresize()も試してみました。
4) for_each(vv.begin(), vv.end(), boost::bind(&vector<int>::resize, _1, 10));
> 致命的エラー F1004 mem_fn.cpp 18: コンパイラ内部のエラー(関数 main() )
ぎゃふん。
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNGg++ 3.0.3 だったら以下のコードでキチンと動いたよ
# g++ 2.95.3 はコンパイル通らず
vector<vector<int> > vv;
vv.resize(4);
for_each(vv.begin(), vv.end(), bind2nd(mem_fun_ref(&vector<int>::reserve), 11));
transform(vv.begin(), vv.end(), ostream_iterator<int>(cout, "\n"),
mem_fun_ref(&vector<int>::capacity));
>330
買い
■ このスレッドは過去ログ倉庫に格納されています