【C++】STL(Standard Template Library)相談室 8
レス数が1000を超えています。これ以上書き込みはできません。
0001858
2007/12/24(月) 03:41:59前スレ
【C++】STL(Standard Template Library)相談室 7
http://pc11.2ch.net/test/read.cgi/tech/1185986999/
過去ログ・リンク・書籍紹介は >>2 以降
0002858
2007/12/24(月) 03:42:34http://pc11.2ch.net/test/read.cgi/tech/1160821240/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 ;4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3
http://pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
http://pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/
0003858
2007/12/24(月) 03:43:17入門ページなど
・入門
http://www.jah.ne.jp/~naoyuki/Writings/STL.html
・入門,一覧,使い方
http://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
http://www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
http://www.s34.co.jp/cpptechdoc/reference/stl_samples/
・TIPS集
http://www.nantekotta.com/stl.html
・メルマガ
http://www.kab-studio.biz/Programing/STLiostream/
・解説
http://ja.wikipedia.org/wiki/Standard_Template_Library
http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html
マルチスレッドプログラミングの時には
http://www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html
STLPort
http://www.sgi.com/tech/stl/
http://www.stlport.org/
0004858
2007/12/24(月) 03:43:53STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
http://www.amazon.co.jp/gp/product/4881357786/
STL―標準テンプレートライブラリによるC++プログラミング 第2版
http://www.amazon.co.jp/gp/product/4894714329/
標準C++:STLの基礎知識
http://www.amazon.co.jp/gp/product/4756138047/
標準講座C++―基礎からSTLを利用したプログラミングまで
http://www.amazon.co.jp/gp/product/4881357050/
STLによるコンポーネントデザイン
http://www.amazon.co.jp/gp/product/475613422X/
Effective STL―STLを効果的に使いこなす50の鉄則
http://www.amazon.co.jp/gp/product/4894714108/
0005858
2007/12/24(月) 03:44:36C++相談室 part59
http://pc11.2ch.net/test/read.cgi/tech/1192866305/
Boostを語れゴラァ part5
http://pc11.2ch.net/test/read.cgi/tech/1192662575/
C++0x 2
http://pc11.2ch.net/test/read.cgi/tech/1191842951/
0006デフォルトの名無しさん
2007/12/24(月) 12:31:41スレ立て乙
0007デフォルトの名無しさん
2007/12/24(月) 13:43:05すれたて乙。 新しいすれでも>>858名乗るのか?
0008デフォルトの名無しさん
2007/12/24(月) 16:19:16取り出すファンクタは std の下に用意されていますか?
boost::tuples::get<0> みたいなやつを探しています.
自分で定義してもいいんですが,標準的な方法が
用意されているのであればそちらに従いたいと思います.
0009デフォルトの名無しさん
2007/12/24(月) 16:32:24確か標準には無い。
g++だと、#include <ext/functional> して、
__gnu_cxx::select1stとかselect2ndが使える。
0010デフォルトの名無しさん
2007/12/24(月) 18:36:580011デフォルトの名無しさん
2007/12/24(月) 18:43:240012デフォルトの名無しさん
2007/12/24(月) 19:15:22vector<int> vec;
Foo::Foo() : vec()
{}
こうしてるんだけど、間違ってない?
0013デフォルトの名無しさん
2007/12/24(月) 19:37:340014デフォルトの名無しさん
2007/12/24(月) 19:55:05サンクス
そこが聞きたかったんだけど、vectorは初期化しなくても使えるのは知ってたけど
どのタイミングで、初期化を行ってるの?
vector型のインスタンスが作成される、手前で初期化をにやってると想像するんだけど
0015デフォルトの名無しさん
2007/12/24(月) 19:56:070016デフォルトの名無しさん
2007/12/24(月) 20:08:36なるほど、コンストラクタが呼ばれたら、そこで初期化が行われる仕組みになってるんだ
納得シマスタ
0017デフォルトの名無しさん
2007/12/24(月) 20:12:080018デフォルトの名無しさん
2007/12/24(月) 23:47:240019デフォルトの名無しさん
2007/12/25(火) 00:08:39気持ち悪いです。自殺してください。
0020デフォルトの名無しさん
2007/12/25(火) 00:12:46vectorのオブジェクトを生成するとメモリ割当て子を一つ生成してさらに割当て子を2回コピーしてるようなんですが、
なんでvectorは合計で3つも割当て子のオブジェクトを用意してるんですか?
0021デフォルトの名無しさん
2007/12/25(火) 00:16:250022デフォルトの名無しさん
2007/12/25(火) 00:16:540023デフォルトの名無しさん
2007/12/25(火) 00:19:35002420
2007/12/25(火) 00:31:57もう一度コードを読見直してみます。
0025デフォルトの名無しさん
2007/12/25(火) 00:59:29その実装がどの環境でも同じかどうかなんて保障はないぞ。
別にお前さんは何も間違っているわけでもなく、そういうものだと理解するんだ。
0026デフォルトの名無しさん
2007/12/25(火) 07:45:18そこから仮引数へのコピー、そこからvectorのメンバ変数へのコピーで2回だろうな。
0027デフォルトの名無しさん
2007/12/28(金) 03:26:47〜
vecに対する処理(入れたり、出したり)
〜
if( !vec.empty() )
erase( remove( vec.begin(), vec.end()) );
コンテナの要素が空でない場合、要素を全削除する関数ですが、これをtemplateに
してもらえませんか、宜しくオナガイシマス
0028デフォルトの名無しさん
2007/12/28(金) 03:39:03erase() とか remove() とかの使い方がおかしくてよくわからんけど、
それは無条件で全削除する、つまり vec.clear() と何が違うの?
template にすると言われても何をテンプレート引数にするのか決めないと
どうにでもできてしまうよ。 template<int N> ... とか。
0029デフォルトの名無しさん
2007/12/28(金) 03:44:46サンクスです
vecの型が
vector<double> vecであってもvector<string> vecでも
削除できるようにしたいのですが?
0030デフォルトの名無しさん
2007/12/28(金) 03:47:17erase( remove( vec.begin(), vec.end()), 削除したい特定の要素 );
でした
0031デフォルトの名無しさん
2007/12/28(金) 03:58:36情報小出しの兆候が見られて嫌な感じだな。
いくらかわかったけど、細かい仕様がわからないから何ともできない。
たとえば関数テンプレートにしたいんなら関数の戻り値や引数がわからない。
とりあえず自分で書いた奴みせて。
0032デフォルトの名無しさん
2007/12/28(金) 05:00:55こうですかわかりません
template<typename T>
void erase_it(vector<T>& vec, const T& value)
{
vec.erase( remove(vec.begin(), vec.end(), value), vec.end() );
}
0033デフォルトの名無しさん
2007/12/28(金) 06:49:01しばらく適当にイジってたほうがいいと思うよ
0034デフォルトの名無しさん
2007/12/28(金) 18:45:34夕べは眠くて、質問を書き間違えました
>>コンテナの要素が空でない場合、要素を全削除する関数ですが、
これが間違いで
vector型のコンテナで、特定の要素を削除できる汎用的な(Template)の書き方が
教えて欲しかったのです
ですので、32さんありがとう
0035デフォルトの名無しさん
2007/12/28(金) 19:12:02気がします、連投で申し訳ないけど
コンテナの空チェックで
vector<int> vec;
if(!vec.empty())
vec.clear();
〜空で無い場合の処理
この様な書き方をすると思うのですが、Templateにした場合
この書き方は間違っていますか?
template<typename T>
void empty_it(vector<T>& vec)
{
if(!vec.empty())
vec.clear();
}
0036デフォルトの名無しさん
2007/12/28(金) 19:13:180037デフォルトの名無しさん
2007/12/28(金) 19:14:22空のコンテナを
vec.clear()すると
アクセスバイオレーションになりませんか?
0038デフォルトの名無しさん
2007/12/28(金) 19:16:560039デフォルトの名無しさん
2007/12/28(金) 19:19:50今手元に、コンパイラが無いんで確認できないんですが、
勘違いだったのかなぁ・・・
0040デフォルトの名無しさん
2007/12/28(金) 19:23:39メモリ破壊でもしてたんだろ
0041デフォルトの名無しさん
2007/12/28(金) 19:27:46やはり>>35の処理は不要ってこと?
0042デフォルトの名無しさん
2007/12/28(金) 19:30:51問題ない。不要。
0043デフォルトの名無しさん
2007/12/28(金) 19:33:07ありがとう、幾ら簡単な例ができても、何の役にも立たなくては、意味無いからね
0044デフォルトの名無しさん
2007/12/28(金) 21:04:40GoFでいうとなにパターンですか?
0045デフォルトの名無しさん
2007/12/28(金) 21:08:140046デフォルトの名無しさん
2007/12/29(土) 01:06:280047デフォルトの名無しさん
2007/12/29(土) 01:46:38insert(先頭位置, 挿入数, 挿入する物)
insert(先頭位置, 挿入する物.begin(), 挿入する物.end())
というバリエーションがあるみたいなのですが、どういうバリエーションがあるかは
どうやって知るのでしょうか?manページとかがあるのでしょうか?
0048デフォルトの名無しさん
2007/12/29(土) 01:56:47こことかどう?
http://www.wakhok.ac.jp/~sumi/stl/
0049デフォルトの名無しさん
2007/12/29(土) 02:07:58ありがとうございます!
0050デフォルトの名無しさん
2007/12/29(土) 02:18:00ただ所々間違ってるんだけどw
std::mapのerase(iterator position)がpositionの次のiteratorを返すって書いてあったりする。
0051デフォルトの名無しさん
2007/12/29(土) 11:30:15いまや IntelliSense に頼りっきりになってしまった.
そろそろ趣味グラマで Linux 上でのプログラミングも
しようかと思うんだけど,Emacs でそういう補完とか
やろうと思うとどんな *.el 入れれば便利なんだったっけ?
0052デフォルトの名無しさん
2007/12/29(土) 13:46:27http://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/stdref/classref.htm
0053デフォルトの名無しさん
2007/12/30(日) 16:28:45emacsには標準でついてる
0054デフォルトの名無しさん
2007/12/30(日) 22:31:50int num;
int headdate;
int taildate;
ST_TABLE( ) : num(0), headdate(0), taildate(0){}
}ST_TABLE;
このような、構造体を持つvector型のコンテナから、for_eachを用いて
headdateの最大値を求める、Templateの作り方を教えてもらえませんか
vector<ST_TABLE> containerIndex
containerIndexには、要素が入っていることと仮定して
for_each( containerIndex.begin(), containerIndex.end(), &head );
template<class T>
int head(const vector<ST_TABLE>::iterator T& t) {
ここまでは分かるのですが(間違っているかもしれない。。。。多分間違ってるでしょうorz)
0055デフォルトの名無しさん
2007/12/30(日) 22:35:560056デフォルトの名無しさん
2007/12/30(日) 22:41:54for_each( containerIndex.begin(), containerIndex.end(), head );
template<class T>
int head(const vector<ST_TABLE>::iterator T& t) {
return max_element t->headdate;
t++;
}
0057デフォルトの名無しさん
2007/12/30(日) 22:49:260058デフォルトの名無しさん
2007/12/30(日) 22:50:080059デフォルトの名無しさん
2007/12/30(日) 22:59:05できちゃったけど、オーバーロード使って、でできちゃったww
templateでは、できないものかなorz
0060デフォルトの名無しさん
2007/12/31(月) 00:54:290061デフォルトの名無しさん
2007/12/31(月) 10:52:36があったときにvからwへcopy_ifするとき、wの要素の方が少ないとクラッシュするのですが、
そういうときにもwを拡張しながらcopyするにはどうすればいいですか
たとえば
copy (v.begin(), v.end(), w. begin(), even());
解決方法としてはv.size()であらかじめw.reserveしておくといいのですが、
vは巨大な配列でwは小さいので余計な領域を予約しまくるのが気持ち悪いです
0062デフォルトの名無しさん
2007/12/31(月) 11:10:29copy (v.begin(), v.end(), back_inserter(w), even());
ありがとうございませんでした。
0063デフォルトの名無しさん
2007/12/31(月) 11:40:20w.reserve(w.size() + v.size()) で必要な分のサイズを確保してから、
w.insert(w.begin() + w.size(), v.begin(), v.end()) とやったほうが、
多分(←重要。真相は調べるべき)効率が良い。
0064デフォルトの名無しさん
2007/12/31(月) 12:12:240065デフォルトの名無しさん
2007/12/31(月) 12:36:44vector<int> vec2
vector<int> vec3に
vec1の要素1,2,3,4,5,6,7,8,9,10
vec2の要素4,5,6
とします、vec1とvec2をマージして、重複値を持たないように
vec3の要素1,2,3,4,5,6,7,8,9,10
としたいのですが、↓これだと
merge( vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), back_inserter ( vec3 );
unique( vec3.begin(), vec3.end() );
vec3の要素1,2,3,4,5,6,7,8,9,10,4,5,6
となってしまいます
どうしたらいいですか?
0066デフォルトの名無しさん
2007/12/31(月) 12:47:23vec.erase( remove_if( vec.begin(), vec.end(), cond), vec.end() );
みたいな構成にしないとだめ、じゃなかったっけ。
0067デフォルトの名無しさん
2007/12/31(月) 15:49:19#include <cassert>
#include <pstade/oven/equals.hpp>
#include <pstade/oven/uniqued.hpp>
#include <pstade/oven/merged.hpp>
#include <pstade/oven/initial_values.hpp>
#include <vector>
int main() {
using namespace::pstade::oven;
using namespace std;
vector<int> A = initial_values(1,2,3,4,5,6,7,8,9,10);
vector<int> B = initial_values(4,5,6);
assert( equals(A,A|merged(B)|uniqued) );
}
こんな感じでいちいちeraseだの使わずに書きたい気分
0068デフォルトの名無しさん
2007/12/31(月) 16:45:30あのぉーすみませんが、pstadeってなんっすか?
boostライブラリィの一種?
0069デフォルトの名無しさん
2007/12/31(月) 17:19:440070デフォルトの名無しさん
2007/12/31(月) 17:37:06解答が無かったんで、今自力でtemplate作ったけど、速度がでねぇ〜
参ってるんだよね、コンテナ二つがそれぞれ500件と5000件で先の要件を満たす
ようにすると、PCが1,2秒固まるんだよね
p_stadeさんの作ったC++ライブラリって速度速いの?
template < typename ForwardIterator >
ForwardIterator to_unique( ForwardIterator lhs, ForwardIterator rhs )
{
ForwardIterator result = lhs;
for( ForwardIterator it = lhs; it != rhs; ++it ){
if( std::find( lhs, result, *it ) == result ){
*result++ = *it;
}
}
resulturn result;
}
0071デフォルトの名無しさん
2007/12/31(月) 18:38:000072デフォルトの名無しさん
2007/12/31(月) 18:54:26>>65の件
0073デフォルトの名無しさん
2007/12/31(月) 20:01:07libstdc++でのuniqueの実装はadjacent_findで先頭部分で既にuniqueになってるものを飛ばし
あとはuniqueになっている部分の末尾と比較しながら
uniqueであるなら末尾の次にコピー、そうでないなら無視といった具合に
イテレータが進んでいくだけってシンプルなものだったから、それと比較したらまぁそんなもんかとはおもうけど
2.3秒かかるってのはstd::vectorのreserve()をせずにどんどん突っ込んだとかそういう要因の方がでかそう
0074デフォルトの名無しさん
2008/01/01(火) 18:56:280075デフォルトの名無しさん
2008/01/02(水) 03:41:11>解答が無かったんで、今自力でtemplate作ったけど、速度がでねぇ〜
for文の中でfindしてりゃそりゃ遅いだろうよw
ハッシュつかえば一発じゃん。
0076デフォルトの名無しさん
2008/01/02(水) 10:38:220077デフォルトの名無しさん
2008/01/02(水) 10:46:250078デフォルトの名無しさん
2008/01/02(水) 12:04:260079デフォルトの名無しさん
2008/01/02(水) 12:53:450080デフォルトの名無しさん
2008/01/02(水) 14:21:50つまらん話のおかげでシチューを
火にかけっぱだったのを思い出した。
マジ感謝。
# 正月2日からレトルトってのもアレだが。
0081デフォルトの名無しさん
2008/01/02(水) 21:35:31レトルトかよ!
時間とれる時くらいまともな料理しろって。(実は喰い物作るのって上手なスレッド処理みたいで面白いのだ)
0082デフォルトの名無しさん
2008/01/02(水) 23:21:32分かるw
コンロが複数あると加熱で複数スレッドとか、火入れてる間に別の一品の下ごしらえとか。
慣れてくると俺OSがマルチスレッドに最適化されてくるのが分かる。
0083デフォルトの名無しさん
2008/01/02(水) 23:53:150084デフォルトの名無しさん
2008/01/03(木) 03:33:580085デフォルトの名無しさん
2008/01/03(木) 05:22:000086デフォルトの名無しさん
2008/01/03(木) 08:54:14って自分で書くのは簡単ですが,
標準があればそれを使おうと思います.
0087デフォルトの名無しさん
2008/01/03(木) 09:50:18質問の意味がわかりません。
0088デフォルトの名無しさん
2008/01/03(木) 11:07:20的なやつのことだったら、自作しないと標準の範囲では存在しないはず。
それ以前にid関数もなかったはずだ。
boostは知らんので当該スレで聞いてくれ。
0089デフォルトの名無しさん
2008/01/03(木) 20:01:01結局、期待通りの動作は、実装依存で全てのSTLの振舞いが保障されてないみたいなことが書いてあったな
STLを駆使した、マルチスレッドプログラミングって、かなり精通しないと難しそうな印象を持った
0090デフォルトの名無しさん
2008/01/03(木) 21:33:28改善されると期待してるんだけど,無理かなぁ.
0091デフォルトの名無しさん
2008/01/03(木) 22:09:54その本ではどう動く事を期待してたの?
0092デフォルトの名無しさん
2008/01/03(木) 22:36:22Effective STL本に書いてあるのは
STLのコンテナでマルチスレッドをサポートする基準、ようするに、実装から
最大限望めることは
★複数の読み取りが安全である
★異なるコンテナへの複数の書き込みは安全である
以上で全てと書いてあるよ、ただし。「望むこと」はできるが、常に実現できるとは
限らないことに注意しなければなっらない。こうした内容を保障する実装もあり、保障しない実装もある。
とのことです、漏れ自身、STLを使ってない、マルチスレッドの実装をリファクタリング∩改造したことはあるけど、
STL∩マルチスレッドの経験ないからあんまり良く分かんないけど、なんか考えても難しそうな希ガスる。
0093デフォルトの名無しさん
2008/01/03(木) 22:40:27うわさではよく聞くんだけどさ・・。具体的にこの場合に絶対におかしくなる
ってコードとどのSTL実装かを知ってる人っているのかな?
いまどきのLinuxとかWinでは問題ないとか勝手に思ってるんだけどさ。。
0094デフォルトの名無しさん
2008/01/03(木) 22:43:54囲ってる実装を見て、なんかあぶなそうだなあと思った記憶はある。
0095デフォルトの名無しさん
2008/01/03(木) 22:44:08文字列の参照カウントまわりとか。詳しくはbugzillaをどうぞ。
0096デフォルトの名無しさん
2008/01/03(木) 22:55:23>>いまどきのLinuxとかWinでは問題ないとか勝手に思ってるんだけどさ。。
その本にも、同じようなことが書いてある
マルチスレッドプログラムの作成は難しく、STLの実装が最初から完全な
スレッドセーフであればと願うプログラマーは多いと
また、後先逆になったけど
>>具体的にこの場合に絶対におかしくなる
>>ってコードとどのSTL実装かを知ってる人っているのかな?
具体的なミューテックスを、行う際の完璧な(著者いわく)Lock方法が載ってるよ
0097デフォルトの名無しさん
2008/01/03(木) 22:59:59ビョーン本と、自分の書いた(メイヤーズ先生)MoreEffective C++を
読めとも書いてある
0098デフォルトの名無しさん
2008/01/04(金) 00:14:410099デフォルトの名無しさん
2008/01/04(金) 00:16:52翻訳されてないけど。
0100デフォルトの名無しさん
2008/01/06(日) 20:55:320101デフォルトの名無しさん
2008/01/06(日) 21:10:400102デフォルトの名無しさん
2008/01/06(日) 22:58:340103デフォルトの名無しさん
2008/01/07(月) 02:04:14Boost.Lambdaのconstantは望むものと違う?
0104デフォルトの名無しさん
2008/01/10(木) 23:19:460105デフォルトの名無しさん
2008/01/11(金) 13:33:470106デフォルトの名無しさん
2008/01/11(金) 14:01:47class sample{
public:
vector<int> vector_int;
list<double> list_double;
〜省略〜
}
というようなクラスをnew演算子で動的に生成した場合、delete演算子で解放
する際にはメンバのvectorやlistのメモリも解放されるのでしょうか。
ご教授お願いします
0107デフォルトの名無しさん
2008/01/11(金) 14:11:45される.
安心して使いたまえ.
0108デフォルトの名無しさん
2008/01/11(金) 14:18:33ご教授ありがとうございます。
また質問で恐縮なのですが関連して、メンバを
vector<int> *p_vector_int
とし、コンストラクタ内で動的にメモリ確保したとすると、この場合はデストラクタ内
で解放するように定義しとかなければいけないのでしょうか?
0109別人
2008/01/11(金) 14:42:35そのとおり、でも
sample a;
sample b = a;//もしくはsample b(a);
これでデストラクタが呼ばれると同じポインタを複数回deleteしたりする未定義動作になるから注意してね。
0110デフォルトの名無しさん
2008/01/11(金) 14:49:55コンテナをnewするなんて糞みたいなことはやめたまえ。
0111デフォルトの名無しさん
2008/01/11(金) 15:00:28>>110
ありがとうございます。
確かにコンテナをnewで確保するっていうのも変な話かも知れないです。
動的なメモリ確保・解放っていうのがintやdoubleといったような基本的な
型でしか情報が見つからなかったので、クラスや可変長配列の場合どうなるのか、
モヤモヤしていたんですが、すっきりしました。ありがどうございました。
0112デフォルトの名無しさん
2008/01/11(金) 15:05:27解放忘れが気になるなら,
std::auto_ptr を使うといいよ.
0113デフォルトの名無しさん
2008/01/11(金) 15:06:50調べてみます。ありがとうございます
0114デフォルトの名無しさん
2008/01/11(金) 15:08:250115デフォルトの名無しさん
2008/01/11(金) 15:10:54そこらへんは、自分で判断しますので大丈夫ですよ・・・きっとw
0116デフォルトの名無しさん
2008/01/11(金) 15:19:07boost::shared_ptr (or boost::scoped_ptr)
boost::shared_ptr<std::vector<int> > sp_vector_int;
0117デフォルトの名無しさん
2008/01/11(金) 15:24:57動的確保する為のコンテナを、動的確保なんて「例」だとしても阿呆過ぎる。
0118デフォルトの名無しさん
2008/01/11(金) 15:30:23メモリが圧迫されることがあるので、newするケースもあると思うがなぁ。
0119デフォルトの名無しさん
2008/01/11(金) 15:34:450120デフォルトの名無しさん
2008/01/11(金) 15:49:21だって,boost のビルドからしろって勧めるのも気が引けるじゃないか.
0121デフォルトの名無しさん
2008/01/11(金) 16:03:12いや、なるべくbestの回答をするのが親切だと思う。
0122デフォルトの名無しさん
2008/01/11(金) 16:07:430123デフォルトの名無しさん
2008/01/11(金) 16:13:54thread関連とかasio(まだ無いが)とか。
shared_ptrなんぞバイナリー落としてインストールするだけだ。
0124デフォルトの名無しさん
2008/01/11(金) 17:24:46それを言うならヘッダファイルジャマイカ?
0125デフォルトの名無しさん
2008/01/11(金) 18:09:220126デフォルトの名無しさん
2008/01/11(金) 18:15:350127デフォルトの名無しさん
2008/01/11(金) 18:23:180128デフォルトの名無しさん
2008/01/11(金) 18:31:410129デフォルトの名無しさん
2008/01/11(金) 19:03:45ヘッダもだけどライブラリじゃなくてか?
0130デフォルトの名無しさん
2008/01/11(金) 19:06:44天才が作ってるうえアフォな質問にも丁寧に答えてくれるしな
boostの問題はライブラリによってサポートに差があることかな
0131デフォルトの名無しさん
2008/01/11(金) 19:18:34次期 C++ で導入されるよ
0132デフォルトの名無しさん
2008/01/11(金) 20:05:28shared_ptr weak_ptr bind function mem_fn type_traits...
0133デフォルトの名無しさん
2008/01/11(金) 20:09:01んで、auto_ptr は deprecated になる。
0134デフォルトの名無しさん
2008/01/11(金) 21:01:32まぁ そうですね。clear()呼べば済む話ですもんね
お騒がせしました。
0135デフォルトの名無しさん
2008/01/11(金) 21:06:37カワイソス
strstreamみたいな感じか
0136デフォルトの名無しさん
2008/01/11(金) 21:16:130137デフォルトの名無しさん
2008/01/11(金) 21:30:290138デフォルトの名無しさん
2008/01/11(金) 21:32:590139デフォルトの名無しさん
2008/01/11(金) 22:07:12いやぁ,shared_ptr だけならヘッダファイルだけ
もってくればつかえるとオモタ.
0140デフォルトの名無しさん
2008/01/11(金) 22:08:030141デフォルトの名無しさん
2008/01/11(金) 22:28:420142デフォルトの名無しさん
2008/01/11(金) 23:06:560143デフォルトの名無しさん
2008/01/11(金) 23:09:130144デフォルトの名無しさん
2008/01/11(金) 23:16:190145デフォルトの名無しさん
2008/01/11(金) 23:16:320146デフォルトの名無しさん
2008/01/11(金) 23:24:31汎用的に作れないもんかね。
0147デフォルトの名無しさん
2008/01/12(土) 00:04:47intrusive_ptrではだめなの?
0148デフォルトの名無しさん
2008/01/12(土) 00:13:08使うために色々と必要な事があるからなあ。
0149デフォルトの名無しさん
2008/01/13(日) 20:04:36何か良い方法はありますか?
bool pred(pair<int, int> v)
{
return v.first == 3 && v.second == 'c';
}
int main(int argc, char* argv[])
{
multimap<int, char> m;
m.insert(make_pair(1,'a'));
m.insert(make_pair(2,'b'));
m.insert(make_pair(3,'c')); // 消去したい
m.insert(make_pair(3,'c')); // 消去したい
m.insert(make_pair(3,'d'));
m.insert(make_pair(4,'d'));
m.erase(???);
return 0;
}
環境はVC8です。
0150デフォルトの名無しさん
2008/01/13(日) 20:05:36bool pred(pair<int, int> v)
のところは
bool pred(pair<int, char> v)
の間違いでした。
お願いします。
0151デフォルトの名無しさん
2008/01/13(日) 20:14:100152デフォルトの名無しさん
2008/01/13(日) 20:38:42Effective STL Item9 や JosuttisのSTL本にも載ってるけど
こんな感じだろうか。
bool pred(const pair<int, char>& v)
{
return v.first == 3 && v.second == 'c';
}
for(multimap<int, char>::iterator it = m.begin(); it != m.end(); )
{
if( pred(*it) ) {
m.erase(it++);
}
else {
++it;
}
}
試してはいない。
0153デフォルトの名無しさん
2008/01/13(日) 20:52:44begin()とend()じゃなくて、lower_bound()とupper_bound()の方がいいと思う。
0155デフォルトの名無しさん
2008/01/13(日) 21:39:07折角mapなのに全検索は勿体無くねぇ?
0156149
2008/01/13(日) 21:47:11lower_bound()とupper_bound()
にするのは速度的な問題でしょうか?
しかし、キーを二回余分に渡すのもちょっと面倒ですね。
>>152
一旦キーでマッチしたものを、すべてシーケンスコンテナに入れて
そこからさらに絞り込むっていう方法も考えていたんですが
今、私が書いているコードで使う要素数が多くても3個ほどなので
あまり変わらないような気がしました。
要素が多いとまた変わってくるかもしれません。
0157デフォルトの名無しさん
2008/01/13(日) 22:04:28確かに。multimapだった。
equal_range()でイテレータの組を取ってもいいか。
>>156
全部の要素をlinerで舐めるのは非効率だわ。
上の人たちが言ってるやり方が効率が良い。
0158デフォルトの名無しさん
2008/01/13(日) 22:06:48適用するアルゴリズムだ。
std::mapはデフォルトでキー順に既に要素を挿入した時点で
ソートされているのでまさに効率の良い方法。
Cで言うとbinary_search()な。
0159デフォルトの名無しさん
2008/01/13(日) 22:13:59KeyとValueの両方の条件で削除要素を決定するなら
汎用性を考えた場合、Linerになるけど全部舐める
しかないかもな。まあ、今の場合は削除対象を絞る
条件がKeyが3に固定されてるからいいけど。
0160デフォルトの名無しさん
2008/01/13(日) 23:31:50149の通りの条件なら、Key == 3 の範囲をequal_rangeで得て、
その範囲に対して Value == 'c' を消してまわるのが速そう。平均的には、ね。
総要素数に対してequal_rangeの範囲が無視できるだけ小さいならおk。
実際に行いたい条件が149と違う場合は話が違ってくる。
Keyが単一とは限らないとか。...って、>>159に書いてあるか。
0161デフォルトの名無しさん
2008/01/14(月) 10:47:18mapは連想配列の様に便利に使ってますが
multimapという道具の使い方がいまいち思い浮かばない…。
0162デフォルトの名無しさん
2008/01/14(月) 11:02:35同一得点は存在するからマルチ
0164デフォルトの名無しさん
2008/01/14(月) 11:23:23辞書
0165デフォルトの名無しさん
2008/01/14(月) 11:25:390166デフォルトの名無しさん
2008/01/14(月) 11:48:170167デフォルトの名無しさん
2008/01/14(月) 13:18:360168デフォルトの名無しさん
2008/01/14(月) 13:19:33辞書引け
0169デフォルトの名無しさん
2008/01/14(月) 13:19:400170デフォルトの名無しさん
2008/01/14(月) 13:21:26辞書ならbimapの方がよくね?
0171デフォルトの名無しさん
2008/01/14(月) 13:22:530172デフォルトの名無しさん
2008/01/14(月) 16:46:33この例で、0点のダメ男君が何人いるかと、
その名前の列記とかってどうやって出力するの?
mismatch()とか使うのかな。
foreachループでフラグ立てながらは勘弁
0173デフォルトの名無しさん
2008/01/14(月) 16:59:410174デフォルトの名無しさん
2008/01/15(火) 02:04:41人数だけが知りたい場合は、countがいいかな。もちろんメンバ関数のほうね。
0175172
2008/01/15(火) 11:07:03ありがとうございます。 equal_range、及びcount便利ですね。
説明読んでて、「該当者のいる得点一覧」(無重複の使用キー一覧)の方法に
ぶちあたった。 もうちょい調べてみます。
0176デフォルトの名無しさん
2008/01/17(木) 18:02:56テンプレート関数を作成したいのですが、うまくいきません。
以下のコードはVC++6.0でもBCC5.5でもコンパイルエラーです。
正しい方法を教えてください。
#include <utility>
#include <algorithm>
template <class T, int n>
std::pair<T*, T*> iseq(T a[n])
{
return std::pair<T*, T*>(a, a + n);
}
int main()
{
int x[] = {6, 1, 3, 4, 2};
std::sort(iseq(x).first, iseq(x).second);
return 0;
}
0177デフォルトの名無しさん
2008/01/17(木) 18:07:470178デフォルトの名無しさん
2008/01/17(木) 18:09:45#include <utility>
#include <algorithm>
#include <iostream>
#include <iterator>
template <class T, int n>
std::pair<T*, T*> iseq(T (&a)[n])
{
return std::pair<T*, T*>(a, a + n);
}
int main()
{
int x[] = {6, 1, 3, 4, 2};
std::sort(iseq(x).first, iseq(x).second);
std::copy(x, x + sizeof(x) / sizeof(x[0]), std::ostream_iterator<int>(std::cout, " "));
}
0179デフォルトの名無しさん
2008/01/17(木) 18:13:54VC6はどうか知らんが、VC7.1やVC8、VC9なら行けると思う。
gcc3.4.5でもOKだった。
0180デフォルトの名無しさん
2008/01/17(木) 18:16:29bcc5.5.1と5.8.2でコンパイルできたよ
0181デフォルトの名無しさん
2008/01/17(木) 18:17:410183デフォルトの名無しさん
2008/01/17(木) 18:52:190184デフォルトの名無しさん
2008/01/17(木) 22:40:090185デフォルトの名無しさん
2008/01/17(木) 22:44:49iseq(T (&a)[n])
この部分が解析できないフロントエンドを持つコンパイラ。
0186デフォルトの名無しさん
2008/01/17(木) 23:06:230187デフォルトの名無しさん
2008/01/17(木) 23:47:01T (&a)[n] の仮引数aの型が解らんてこと?
aが配列参照と理解できないってことかな
0188デフォルトの名無しさん
2008/01/17(木) 23:59:290189デフォルトの名無しさん
2008/01/18(金) 00:54:28int (&a)[n] のように型を決め打ちされてしまうとコンパイルが
通らなかったような。
templateの特殊化には対応してんのかな。どっかいろんな細かい
部分が標準と挙動が異なるのでSTLportから見捨てられかけたり
boostへの対応度が低かったりする。
0190デフォルトの名無しさん
2008/01/18(金) 08:37:200191デフォルトの名無しさん
2008/01/18(金) 09:13:16VC9 使おうよ… Express Edition もあるんだから.
0192デフォルトの名無しさん
2008/01/18(金) 09:14:58STLをやboostを使うならVC8がgccとかも含めて一番安定して使えるかも
0193デフォルトの名無しさん
2008/01/18(金) 09:35:46equal_range()でvectorの特定の値を検索したいのですが
vectorの要素はマルチキーなのです。
typedef struct{
int x;
int y;
}DATA;
このような感じの場合。
どのようにすればいいのでしょうか?
やはり自分で作らないと出来ないのでしょうか?
宜しくお願いします。
0194193
2008/01/18(金) 10:30:48第4引数があるんですね・・・。
でもこの引数、ググっても、日本語のページは、4件しかヒットしないや・・・orz
0195デフォルトの名無しさん
2008/01/18(金) 10:31:00それ以外バグが問題でVC8使った方がいい
ってあり得るの?
0196デフォルトの名無しさん
2008/01/18(金) 13:53:30STLはそういう使い方しないもん。
structじゃなくて、classにしとけよ。
operator定義できないから、多分比較関数定義出来ないぞ。
検索する値はint型、比較する対象はvector<DATA>のDATAっしょ?
比較関数は定義できても、呼び出し側の引数は等価な型を与えるから無理。
先に比較用のoperator書かないと。
0197デフォルトの名無しさん
2008/01/18(金) 14:07:070198デフォルトの名無しさん
2008/01/18(金) 14:21:50別にstructでもoperator()は定義できるでしょ。
今はそれはどうでもよくて、strict weak odering条件を満たす
bool operator(const Data&, const Data&);
を定義して、operator(const Data&, const Data&)で
vector<Data>をソートしておいて、eqaul_rangeに同じ
Comparisonであるoperator(const Data&, const Data&)を
渡せばいいんでないのか?
ということを>>193は言ってると思ったんだが。
0199デフォルトの名無しさん
2008/01/18(金) 14:30:05○ bool operator<(const Data&, const Data&);
0200デフォルトの名無しさん
2008/01/18(金) 14:46:28operator<を定義してたらComparison(>>194の言う第4引数)渡さなくていいんじゃ?
0201デフォルトの名無しさん
2008/01/18(金) 15:12:360202デフォルトの名無しさん
2008/01/18(金) 15:18:21クラスのメンバーとして定義するなら、そうだね
>>201
structとclassの違いはデフォルトのアクセスレベルだけでしょ。
0204デフォルトの名無しさん
2008/01/19(土) 14:15:43struct xxx {
xxx();
private:
int n;
};
class xxx {
int n;
public:
xxx();
}
0205デフォルトの名無しさん
2008/01/19(土) 14:40:300206デフォルトの名無しさん
2008/01/19(土) 14:44:14お、ほんとだ。知らなかった。何か理由あるのかね。
0207デフォルトの名無しさん
2008/01/19(土) 14:48:530208デフォルトの名無しさん
2008/01/19(土) 14:49:26仮引数のclassは型名を表すだけで、そこにclass入れようがstruct入れようが組み込み型入れようが構わないんだから。
0209デフォルトの名無しさん
2008/01/19(土) 14:51:530210デフォルトの名無しさん
2008/01/19(土) 14:57:54コンストラクタ定義しなくても、メモリサイズ的に変わったりするの?
0211デフォルトの名無しさん
2008/01/19(土) 14:59:21struct Point3d { double x, y, z; }; とか。
0212デフォルトの名無しさん
2008/01/19(土) 15:01:340213デフォルトの名無しさん
2008/01/19(土) 15:11:54template <template<typename T> struct C> //NG
0214デフォルトの名無しさん
2008/01/19(土) 15:19:24これも書いておかないと片手落ちだ
0215デフォルトの名無しさん
2008/01/19(土) 16:16:28それは常識すぎる。
0216デフォルトの名無しさん
2008/01/20(日) 23:29:14効率の良い方法はないのでしょうか?
vector<int> v;
fwrite(v, sizeof(int), v.size(), fp);
のような感じで一気に書き出せれば凄くうれしいのですが
これではエラーになります。定義されているoperatorがうまくintのポインタの代わりをしてくれるかと思ったのですが
どうやら無理のようです。
これは、一度個数分ループまわしてintに書き出さないとダメなのでしょうか?
0217デフォルトの名無しさん
2008/01/20(日) 23:33:380218デフォルトの名無しさん
2008/01/20(日) 23:39:03好きな方を使え。
次期 C++ だと v.data() で良くなるみたいだが・・・
まだないものは仕方が無い
0219デフォルトの名無しさん
2008/01/21(月) 00:14:53ofstream ofs;
と
copy(v.begin(), v.end(), ostream_iterator<int>(ofs, " "));
とかではダメなんか?
0220デフォルトの名無しさん
2008/01/21(月) 00:43:420221デフォルトの名無しさん
2008/01/21(月) 01:07:58じゃあostreambuf_iterator使えば?
0222デフォルトの名無しさん
2008/01/21(月) 06:41:18保障されているのはvector だけ?
って,list とかでそんなことできるわけないよな.
0223デフォルトの名無しさん
2008/01/21(月) 06:55:510224デフォルトの名無しさん
2008/01/21(月) 08:23:250225デフォルトの名無しさん
2008/01/21(月) 10:31:26std::ofstream fout( "out.bat", ios::binary );
std::copy(
std::istreambuf_iterator<char>( fin ),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>( fout ) );
このコードって超おせーんだけど、なんで??
0226デフォルトの名無しさん
2008/01/21(月) 12:18:26それだとディスク内のin.datにアクセス→ディスク内のout.datにアクセスを何度も繰り返すから、
in.datのデータを一度数キロバイトのバッファに入れてからまとめてout.datに書き込んで
ディスクへのアクセスを減らした方が早いよ。
環境にもよるけど、一度ディスクにアクセスする間にメモリからデータを十万回程度アクセスできる。
読み込みも書き込みもまとめてディスクへアクセスすればシーク時間も節約できる。
0227225
2008/01/21(月) 13:30:36iterator を使うと、fstream へのアクセスが 1 文字ごとに
なっちゃうっていう理解でいいですか?
なんとなく iterator のほうがカッコいいかなって思ったんだけど、
使い物にならんほど遅いので…。
素直に
fstream::read()
fstream::write()
を使えということでFA?
0228デフォルトの名無しさん
2008/01/21(月) 14:20:070229デフォルトの名無しさん
2008/01/21(月) 14:58:03俺には>>225のコードがstreambuf_iteratorを使っているように見えるんだが。
0230デフォルトの名無しさん
2008/01/21(月) 15:10:470231デフォルトの名無しさん
2008/01/21(月) 15:26:30だと思われ。書き出すタイミングも。
streambuf_iteratorを使う(内部的にsgetc, sbumpc, sputcを
使ってる)ということはプログラムレベルでのストリームバッファ
を直接操作してるわけで、ファイルストリームオブジェクトに対して
read、writeを使うと非バッファ操作になるから速くなることは
ないと思える。実測次第だな。
OSのチューニングなりドライバこさえるなりするのも一考。
0232デフォルトの名無しさん
2008/01/21(月) 19:53:04http://itpro.nikkeibp.co.jp/article/COLUMN/20080104/290425/
0233デフォルトの名無しさん
2008/01/21(月) 19:55:100234225
2008/01/21(月) 19:58:24う〜ん・・・
boost::timer t;
for( int i=0; i < 10; ++i ) {
ifstream fin( "in.dat", ios::binary );
ofstream fout( "out.dat", ios::binary );
copy (
istreambuf_iterator<char>( fin ),
istreambuf_iterator<char>(),
ostreambuf_iterator<char>( fout )
);
}
cout << "iterator=" << t.elapsed() << endl;
t.restart();
for( int i=0; i < 10; ++i ) {
ifstream fin( "in.dat", ios::binary );
ofstream fout( "out.dat", ios::binary );
while( !fin.eof() ) {
char buf[BUFSIZ];
fin.read( buf, BUFSIZ );
fout.write( buf, BUFSIZ );
}
}
cout << "read_write=" << t.elapsed() << endl;
のコードでやったら、iterator=2.093, read_write=0.438で、5倍ほど差がつきました。
環境は WinXP + VC8 です。
まぁ、どうしても iterator 使いたいわけじゃないので、おとなしくread() と write() 使います。
0235デフォルトの名無しさん
2008/01/21(月) 20:54:05値の重複を許す二分探索木というのは、どう構成したらいいのかよくわかりません。たとえば、
10
8 12
みたいなところ(10がルートで8と12が左右の子)にもうひとつ10を挿入すると、どういう木になるんでしょうか?
red-black treeでなく、単なる二分探索木の話でよいので教えてください。
0236デフォルトの名無しさん
2008/01/21(月) 21:34:55やっぱりディスクアクセスが頻発するのか。
streambuf_iteratorはstream_iteratorに比べると速いというだけか。
ただ、そのプログラムのread/writeだと正しくファイルがコピーされなかった。
おそらく、fout << fin.rdbuf(); 一行で正しくコピーできると思う。
by VC++ 2008
0237デフォルトの名無しさん
2008/01/21(月) 21:39:20fout.write( buf, BUFSIZ );
がコピーできない原因か。BUFSIZEのゴミまでコピーされてしまう。
0238デフォルトの名無しさん
2008/01/21(月) 21:56:130239225
2008/01/21(月) 22:20:19こんな単純なミスをするとはww
ファイルのサイズがBUFSIZの倍数になってたから
正常に動いてるように見えてたみたい
>>236
書き方は rdbuf() が一番簡単ですね。
さっきのコードで
fout << rdbuf();
と
char buf[BUFSIZ];
fin.read( buf, BUFSIZ );
int n = fin.gcount();
fout.write( buf, n );
でやってみましたが(他の部分は同じ)、
rdbuf=1.375
read_write=0.406
で、速度を気にする場合は read(), write() のほうが早いようです。
簡潔に書きたいときは
rdbuf()
速度が重要な時は
read(), write()
を使う方向でいこうと思います。
0240デフォルトの名無しさん
2008/01/21(月) 22:23:42あほうすぎる話だなw
こんなのDBの研究者が聞いたら鼻で笑っちまうぜ。
挙句の果てVBかよw
0241デフォルトの名無しさん
2008/01/21(月) 22:29:510242デフォルトの名無しさん
2008/01/21(月) 22:30:27そうrdbufだと結構遅かったんだよね。
gcount()があったんだ。それ使ったほうが良いよ。
速いに越したことはない。
thx。色々参考になったよ。
0243デフォルトの名無しさん
2008/01/21(月) 22:32:50DBの検索アルゴリズムはよく知らんが、
アルゴリズムを考えるときに言語使用は関係ないだろ。
それに、どうせ使ってるのはOSのAPIだろうから、VBだろうが、Cだろうが、
呼び出す速度は同じじゃね?
0244デフォルトの名無しさん
2008/01/21(月) 22:40:10そっくりそのままDBに応用しようとは考えなかったんだろうか??
0245デフォルトの名無しさん
2008/01/21(月) 23:05:24そのようなことって可能なのでしょうか?
0246デフォルトの名無しさん
2008/01/21(月) 23:09:31コピーしたときに問題がおきるからだめ
たとえば、
class my_class;
vector<my_class*> v1;
vector<my_class*> v2 = v1;
だと、v1とv2の指してる先が同じになっちゃう。
ポインタが(というか、newが)使いたいなら、boost::shared_ptr 使って
入れろ。
boost::shared_ptr でググって、使い方がわからんなら
STLコンテナにポインタ入れるのはあきらめろ。
0247デフォルトの名無しさん
2008/01/21(月) 23:10:38配列?valarray?
ちなみにコンテナだったら可能だよ。
まあ色々面倒だからスマートポインタ使うか
boostのpointer containerとか。
0248デフォルトの名無しさん
2008/01/21(月) 23:12:24ありがとうございます。
では、早速チャレンジしてみます
0249デフォルトの名無しさん
2008/01/21(月) 23:16:08大抵の事ならポインタ入れずに済ませられると思うんだが。
0250デフォルトの名無しさん
2008/01/21(月) 23:21:32管理したい場合もあるんじゃないかな。
0251デフォルトの名無しさん
2008/01/21(月) 23:35:47とおもったけどスレチガイ?
0252デフォルトの名無しさん
2008/01/21(月) 23:39:15>「OSの基本機能であるファイル名の検索機能」とやらのアルゴリズムを
>そっくりそのままDBに応用しようとは考えなかったんだろうか??
Windows Index Search の機能らしいので
アルゴリズム自体はそっくりそのままDBです
本当にありがとうございました
0253デフォルトの名無しさん
2008/01/21(月) 23:41:04class my_class;
vector<my_class*> v1;
普通に使いまくってますが何がいかんの?
0254デフォルトの名無しさん
2008/01/21(月) 23:43:590255デフォルトの名無しさん
2008/01/22(火) 00:19:1410
10 12
8
multiset の実装と関係あるかどうか知らんけど。
0256デフォルトの名無しさん
2008/01/22(火) 00:35:31http://en.wikipedia.org/wiki/Binary_search_tree#Insertion
ここみると、そんな凝ったことしてないね。
でも、>>255のようにしないとequal_rangeとかまともに実装できない気もする。
どうなんだろ
0257デフォルトの名無しさん
2008/01/22(火) 00:45:390258デフォルトの名無しさん
2008/01/22(火) 00:53:140259デフォルトの名無しさん
2008/01/22(火) 01:00:51どちらかに統一しておけばいいんじゃないの?
>>257
左に入れるとして、同じ値を見たら、そのノードの直接の子供としてinsertするのか(255案)、
孫以下の遠い子供として、leafの子としてinsertするのか(この例だと8のrightとして)、どっち?
std::multisetの場合。
0260デフォルトの名無しさん
2008/01/22(火) 01:06:36newしたオブジェクトを入れるんだったら、
deleteのし忘れ、2重に行ってしまうなどのミスを起こすから
やめとほうがよいというだけのこと。
「気を付ける」なんて言葉は信頼できないので、
やるなら246のいうようにshared_ptrか何か使って、
deleteをコンピュータ任せにするほうがいい。
0262デフォルトの名無しさん
2008/01/22(火) 01:28:48それだと、同じ値を持つノードがツリー上で離れてしまいますよね。
equal_rangeをどうやって実装するのか想像がつかないのですが、簡単に教えてもらえませんか?
戻ってきたイテレータを++するたびにO(logN)のサーチが入る???
0263デフォルトの名無しさん
2008/01/22(火) 01:36:14重複を許そうが許すまいが、二分探索木はそもそもそういうものだろ
隣接した要素が木構造の上では離れた場所に置かれることがある
イテレータをどうやって実装するのが普通かは知らないけど、setとmultisetで事情が変わる訳じゃない
0264デフォルトの名無しさん
2008/01/22(火) 01:55:22まったくもってそうでした。。。。
イテレータも、単にin-orderでtraverseすれば要素同士が離れていても問題なく連続して触ってくれますね。
0265デフォルトの名無しさん
2008/01/24(木) 10:22:330266デフォルトの名無しさん
2008/01/25(金) 08:16:310267デフォルトの名無しさん
2008/01/25(金) 08:26:55Effective STLぐらい買え
0268デフォルトの名無しさん
2008/01/25(金) 10:01:540269デフォルトの名無しさん
2008/01/25(金) 15:47:58string name;
};
std::vector<foo> v;
foo *f = new foo;
f->name = "ABC";
v.push_back( *f );
とやったときの、findでのABCの検索の仕方が全然解りません。
教えて下さい。
0270デフォルトの名無しさん
2008/01/25(金) 16:03:31std::vector<foo>::iterator it = v.begin();
size_t pos = it->name.find("ABC");
あるいは
size_t pos = v[0].name.find("ABC");
0271269
2008/01/25(金) 16:06:52foo *f = new foo; f->name = "ABC"; v.push_back( *f );
の部分が何度も繰り返してる場合です。
for ( i = 0; i <100; i ++ ) {
foo *f = new foo; f->name = IntToStr( i ); v.push_back( *f );
}
とか。。
0272デフォルトの名無しさん
2008/01/25(金) 16:24:35for(it=v.begin(); it != v.end(); it++) {
if(0 == it->name.find("ABC")) {
//hit
}
}
こうかな?
もしvの中に連続して文字列が存在していることを期待してて、
それをまとめてサーチしたいと思っているなら、各stringの中身は
別個に確保されてて繋がってないので無理じゃないかと。
0273269
2008/01/25(金) 16:33:03for ( int i = 0; i < v.size(); i ++ ) {
if ( v[i].name == "もげもげ" ) puts( "一致" );
}
でもいいわけですね。ありがとうございましt。
0274デフォルトの名無しさん
2008/01/25(金) 16:40:20fooにoperator==を加えてnameとconst char*を比較できるようにするか、
find_if()に比較関数を渡すかすれば、
vector<foo>::iterator it = find(v.begin(), v.end(), "ABC");
こんな感じにも書ける。
<速度的な違いはほとんど無いと思うけど
0275デフォルトの名無しさん
2008/01/25(金) 16:48:42文字列の格納先は単一のstringにして
name.append(文字列);
を繰り返してどんどん足していくしかないんじゃ。
で、足すときにnameの何バイト目は何個目の要素か
ってなテーブルを同時に作って、findの結果から調べられる
ようにしておくとか。
0276デフォルトの名無しさん
2008/01/25(金) 18:05:03現在、キー文字列を与えると、それに応じた
文字列を返すSTL::mapのようなコードがあります。
ただ、返す文字列が可変です。例えば、キー"気温" を
与えると”今現在”の気温「5゚C」を文字列で返すと
いった感じです。
現在このコードは ifとelseの連続で構成されたものと
なっておりまして、効率面でも文字列比較を繰り返し
行っており、良いものではありません。
これを実現するのに、できればmapに似た簡単で効率の
いい形で改良できないでしょうか?
0277デフォルトの名無しさん
2008/01/25(金) 18:18:02すぐに思いつくのは文字列から「文字列を返す関数」へのマップだな
"温度"を与えると「温度を計算する関数」が得られるようにする
0278デフォルトの名無しさん
2008/01/25(金) 18:19:08map<string, string(*)(void*)> のような、キー文字列→関数のマップを作ればいいんじゃないかな
0279278
2008/01/25(金) 18:20:310280デフォルトの名無しさん
2008/01/25(金) 19:12:55早速有難う御座います
なるほど関数ポインタをマップですか。 確かに展望良さそうです。
早速コーディング検討したいと思います。 ありがとうございました!
0281デフォルトの名無しさん
2008/01/25(金) 23:18:56今更だが、部分一致ならfind_ifを使う手もある。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
struct foo {
std::string name;
};
struct FooNameIs : public std::binary_function<char *, foo, bool> {
bool operator() (const char * match, const foo & f) const {
return (f.name == match);
}
};
int main() {
std::vector<foo> v;
/* vに色々追加するコード*/
std::vector<foo>::iterator it = std::find_if(v.begin(), v.end(),
std::bind1st(FooNameIs(), "ABC"));
return 0;
}
あと、foo * f = new fooしてv.push_back(*f)してるのは、凄く気になる。
0282デフォルトの名無しさん
2008/01/25(金) 23:21:040283デフォルトの名無しさん
2008/01/26(土) 19:04:000284デフォルトの名無しさん
2008/01/26(土) 19:05:500285デフォルトの名無しさん
2008/01/27(日) 00:03:120286デフォルトの名無しさん
2008/01/27(日) 00:15:380287デフォルトの名無しさん
2008/01/27(日) 00:24:350288デフォルトの名無しさん
2008/01/27(日) 00:27:360289デフォルトの名無しさん
2008/01/27(日) 00:28:100290デフォルトの名無しさん
2008/01/27(日) 00:47:370291デフォルトの名無しさん
2008/01/27(日) 00:49:360292デフォルトの名無しさん
2008/01/27(日) 00:58:58統一してしまうとまずいことがあるよ。
vectorは末尾への要素追加のならし計算時間がO(1)じゃないといけないから、参照カウントによる
copy-on-write最適化ができない。stringにはそういうしばりはないから、COWが可能。まぁ最近
はマルチスレッドの関係でCOWなstringは絶滅危惧種だけど。
他にもあったはずだが、とっさには思いつかない。
0293デフォルトの名無しさん
2008/01/27(日) 01:14:540294デフォルトの名無しさん
2008/01/27(日) 01:16:360295デフォルトの名無しさん
2008/01/27(日) 01:20:070296デフォルトの名無しさん
2008/01/27(日) 01:20:490297デフォルトの名無しさん
2008/01/27(日) 01:25:120298デフォルトの名無しさん
2008/01/27(日) 01:25:430299デフォルトの名無しさん
2008/01/27(日) 01:26:030300デフォルトの名無しさん
2008/01/27(日) 01:27:230301デフォルトの名無しさん
2008/01/27(日) 01:31:02もう文字列終わってるな
0302デフォルトの名無しさん
2008/01/27(日) 01:32:510303デフォルトの名無しさん
2008/01/27(日) 01:36:510304デフォルトの名無しさん
2008/01/27(日) 01:37:18UTF-16 だと決まってるわけでもないわけだが。実際4バイトの環境もあるし。
まあ、次期 C++ だと char16_t (UTF-16) や char32_t (UTF-32) が追加されるわけだが。
0305デフォルトの名無しさん
2008/01/27(日) 01:39:36クロスプラットフォームじゃないじゃんstl。。
0306デフォルトの名無しさん
2008/01/27(日) 01:40:320307デフォルトの名無しさん
2008/01/27(日) 01:40:52UTF-8でもfindは問題ないからそのレベルでいいんだったらwstringを使う意味がない
0308デフォルトの名無しさん
2008/01/27(日) 01:41:38それはビット幅だけじゃなくて中身もUTF-16/UTF-32であることが保証されてるの?
0309デフォルトの名無しさん
2008/01/27(日) 01:42:28sizeがだめでしょ。
0310デフォルトの名無しさん
2008/01/27(日) 01:43:030311デフォルトの名無しさん
2008/01/27(日) 01:44:59sizeは「か」に半濁点とかまで考慮するとUTF-32でもだめ
0312デフォルトの名無しさん
2008/01/27(日) 01:45:47string s = "abc"; // sjis!!。findとかしないで。。
wstring s = _T("abc"); // ウニコード。98とかでビルドしないで。サロゲートやばいかも
どっちも地獄だな。CStringの方がましじゃね?
0313デフォルトの名無しさん
2008/01/27(日) 01:46:11size は配列サイズが取得できれば十分じゃないか?
0314デフォルトの名無しさん
2008/01/27(日) 01:49:270315デフォルトの名無しさん
2008/01/27(日) 01:50:00なんだっけアレ 眠くて思い出せない
0316デフォルトの名無しさん
2008/01/27(日) 01:51:440317デフォルトの名無しさん
2008/01/27(日) 01:52:020318デフォルトの名無しさん
2008/01/27(日) 01:54:11Yes.
0319デフォルトの名無しさん
2008/01/27(日) 01:55:41つか、ウニコード捨てればええだけの話しちゃうの?
ウニコード捨ててもそんなにデメリットないような… … …
0320デフォルトの名無しさん
2008/01/27(日) 01:56:41Utf-16はランダムアクセスはできない文字コードですよと言ってきたんだけど
なんとなく流されて2バイトで便利みたいに扱われたり、たいていsizeは文字数を
返すとか説明されたり。。もう混乱の極み。
Javaとかはlengthは2バイト単位の長さを返す仕様に変わり、文字数の取得は
codePointCountが追加されたりどの言語も苦肉の策を講じてる状態。
stlもなんとかしないといけない状況ではある。
0321デフォルトの名無しさん
2008/01/27(日) 01:58:34日本語だけ扱ってる状況でサロゲートペア関係あるっけ
0322デフォルトの名無しさん
2008/01/27(日) 01:58:420323デフォルトの名無しさん
2008/01/27(日) 01:59:59そうなった時その型はどうするんだ? って話になる。
UTF-32 で合成があった場合とか、64ビット値を返すのか?
0324デフォルトの名無しさん
2008/01/27(日) 02:01:42しとくしかないんじゃないかなあと
0325デフォルトの名無しさん
2008/01/27(日) 02:02:410326デフォルトの名無しさん
2008/01/27(日) 02:04:33JIS2004と愉快な仲間たち。
>323
final はsizeいくつ、って話だよね。
0327デフォルトの名無しさん
2008/01/27(日) 02:05:42サロゲートの文字数は取れない点は同じだけどね
0328デフォルトの名無しさん
2008/01/27(日) 02:07:28でも、ランダムアクセスなんて無理じゃん?
0329デフォルトの名無しさん
2008/01/27(日) 02:09:460330デフォルトの名無しさん
2008/01/27(日) 02:12:03パフォーマンス上そこまで標準に組み込まれることは無いだろう。
まあ、それ用のクラスを string 系列とは別に作ることは可能だろうが、
SJIS とかはまあ無理だな。
0331デフォルトの名無しさん
2008/01/27(日) 02:12:420332デフォルトの名無しさん
2008/01/27(日) 02:14:25なんとも微妙。。
文字とか文字数を意識した扱いをしようとしない限りは平気なのかな・・?
0333デフォルトの名無しさん
2008/01/27(日) 02:15:230334デフォルトの名無しさん
2008/01/27(日) 02:16:120335デフォルトの名無しさん
2008/01/27(日) 02:16:41みたいな不正な文字列を受け付けるべきか、みたいな話はあるよね。
0336デフォルトの名無しさん
2008/01/27(日) 02:17:180337デフォルトの名無しさん
2008/01/27(日) 02:18:12C++で新しい文字列クラスをつくろう 2
http://pc11.2ch.net/test/read.cgi/tech/1167132255/
0338デフォルトの名無しさん
2008/01/27(日) 02:20:06問題なくね?
>>333
確かに文字数指定でサロゲート文字の途中とかになってたら文字が切れちゃう
よねぇ
0339デフォルトの名無しさん
2008/01/27(日) 02:21:080340デフォルトの名無しさん
2008/01/27(日) 02:21:410341デフォルトの名無しさん
2008/01/27(日) 02:24:29と文字数指定の関数に文字の途中などの数を指定しない
を守ってればサロゲートもおけ、でいいのかな?
0342デフォルトの名無しさん
2008/01/27(日) 02:26:180343デフォルトの名無しさん
2008/01/27(日) 02:26:48それを守るためにどれだけのコストが掛かるかって話してるんじゃないのか
0344デフォルトの名無しさん
2008/01/27(日) 02:27:16これを守るのがすげー大変そうだ。
0345デフォルトの名無しさん
2008/01/27(日) 02:27:590346デフォルトの名無しさん
2008/01/27(日) 02:28:550347デフォルトの名無しさん
2008/01/27(日) 02:29:010348デフォルトの名無しさん
2008/01/27(日) 02:32:47文字数ならサロゲートを割ってしまうことはないよ。
サロゲートペア一組で一文字だから。
0349デフォルトの名無しさん
2008/01/27(日) 02:33:580350デフォルトの名無しさん
2008/01/27(日) 02:35:13「か゛」は1文字という扱いでいいのか?
「か゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛゛(略」
みたいなどうしようもない連中はどうしよう?
0351デフォルトの名無しさん
2008/01/27(日) 02:38:26std::string(wstring)の「文字数指定」は、1文字が固定長のコード体系が前提だから、サロゲがあると壊れるよ。
>>350
それペアになってなくない?
0352デフォルトの名無しさん
2008/01/27(日) 02:38:36>サロゲートペア一組で一文字
一組で4バイト(結合文字は6バイトもある)
で、文字数(というより2バイト単位)指定はアウト。
s = サロゲート文字列
s2 = s.substring(0, 5)
とかやったらあぼーんでしょ
0353デフォルトの名無しさん
2008/01/27(日) 02:42:20文字数というのは、キャラクタ数という意味で使った。
0354デフォルトの名無しさん
2008/01/27(日) 02:47:210355デフォルトの名無しさん
2008/01/27(日) 02:48:52合成文字は2キャラクタでしょ。
合成文字をぶった切ると、意味は通じなくなるかもしれないが違法ではない。
0356デフォルトの名無しさん
2008/01/27(日) 02:53:070357デフォルトの名無しさん
2008/01/27(日) 03:00:31wstringはサロゲートに注意して使え。途中で切るなよ。
Win98とかまだやってるカスはCStringでも使ってろ。
LinuxではstringでもEUCとUTF-8は2バイト目が1バイト目とかぶらないからまだ
なんとかなるはずだ。
クロスにしたいなら文字列クラスは当然自前だろ?
が俺の現状の認識
0358デフォルトの名無しさん
2008/01/27(日) 03:02:31ハァ?
0359デフォルトの名無しさん
2008/01/27(日) 03:09:34へ?
0360デフォルトの名無しさん
2008/01/27(日) 03:14:40追加でMac OS XはCFString使っとけ。以上。
0361デフォルトの名無しさん
2008/01/27(日) 04:50:39OS 関係なくてエンコーディングの話だろ?
Windows でも UTF-8 使えば問題ないし、 Linux でも Shift_JIS 使えば問題は出る。
クロスにしたければエンコーディングを OS 任せにしなければ良いだけの話。
たとえば UTF-8 を使うと決めれば std::string でもいけるでしょ。
0362デフォルトの名無しさん
2008/01/27(日) 05:05:46だけの話・・って、実際にUTF-8でやったことないんだろ?試しにやってみなよ。
APIに渡すとき、コンソルに出すときすべてに変換をかます必要あるだろ?
文字リテラルはどうするんだ?ソース内のUTF-8はまだコンパイラのサポートが微妙だぞ。
現実的じゃないんだよ。OSが正式にサポートしてるSJISとかUTF-16以外を
内部エンコーディングにするのは。
0363デフォルトの名無しさん
2008/01/27(日) 05:33:050364デフォルトの名無しさん
2008/01/27(日) 05:48:200365デフォルトの名無しさん
2008/01/27(日) 06:53:550366デフォルトの名無しさん
2008/01/27(日) 06:59:29すべての文字を表現したいなんて無駄の極み
0367デフォルトの名無しさん
2008/01/27(日) 08:26:250368デフォルトの名無しさん
2008/01/27(日) 08:37:31入出力と多言語以外の問題はなし 日本語使うんだったらどれでも同じ
入出力にコンバートするのに手間がかかるかどうかだけ
0369デフォルトの名無しさん
2008/01/27(日) 10:08:290370デフォルトの名無しさん
2008/01/27(日) 12:33:490371デフォルトの名無しさん
2008/01/27(日) 13:24:31つーかPDFでおk
0372デフォルトの名無しさん
2008/01/27(日) 13:25:370373デフォルトの名無しさん
2008/01/27(日) 15:15:28一方ロシアは画像を使った
こっちの方がしっくりくるな。
0374デフォルトの名無しさん
2008/01/27(日) 15:52:02宇宙の星にそれぞれ新しい文字で名前つけてもあまるだろw
0375デフォルトの名無しさん
2008/01/27(日) 16:26:010376デフォルトの名無しさん
2008/01/27(日) 16:37:26path.find("\\");
こんなであぼーんするstringは危険としか言いようがない
0377デフォルトの名無しさん
2008/01/27(日) 16:47:520378デフォルトの名無しさん
2008/01/27(日) 16:55:520379デフォルトの名無しさん
2008/01/27(日) 16:56:200380デフォルトの名無しさん
2008/01/27(日) 17:24:370381デフォルトの名無しさん
2008/01/27(日) 17:28:050382デフォルトの名無しさん
2008/01/27(日) 17:56:59CID(AJ15)のことか? あのコードも印刷以外に使うのは
結構アレなんだけどなー。
0383デフォルトの名無しさん
2008/01/27(日) 18:00:16メンバ関数内で
スコープ解決演算子で
classname::メンバ変数 の値変更するのと
this->メンバ変数 の値変更するのは何が違うの?
0384デフォルトの名無しさん
2008/01/27(日) 18:04:56struct C : public P{ int m;
void f(){ this->m = 0; this->P::m = 1; }
};
みたいな話。
0385デフォルトの名無しさん
2008/01/27(日) 18:07:20findが使えないstringって・・・カスめ
0386デフォルトの名無しさん
2008/01/27(日) 18:09:210387デフォルトの名無しさん
2008/01/27(日) 18:12:41最初の
this->m は C のオブジェクトのメンバ変数m
this->P::m は何でしょうか?
0388デフォルトの名無しさん
2008/01/27(日) 18:14:13まじか?
0389デフォルトの名無しさん
2008/01/27(日) 18:16:16そりゃなるだろwww
0390デフォルトの名無しさん
2008/01/27(日) 18:16:42P の m にきまっちょるだろう
0391デフォルトの名無しさん
2008/01/27(日) 18:22:57マジレスすると「能」の2バイト目の「\」がfindで見つかっちゃったんです。
string s = SJISの日本語;
はやっちゃだめなんです。初心者はみんなやってしまうんですが。
0392デフォルトの名無しさん
2008/01/27(日) 18:23:56>>390
継承したときに変数名かぶった場合コウ書くんですね。
でも、多重に継承した場合、どう書くんだろう?
0393デフォルトの名無しさん
2008/01/27(日) 18:29:120394デフォルトの名無しさん
2008/01/27(日) 18:35:01間の型へ一旦 this をアップキャストすると良い。
0395デフォルトの名無しさん
2008/01/27(日) 18:35:31だから、find とか使わない分には使っていいんだってばよ。
0396デフォルトの名無しさん
2008/01/27(日) 18:35:39P1::P2::Pb::a = 100;
みたいに、継承順を追いかければ指定できたような・・・
0397デフォルトの名無しさん
2008/01/27(日) 18:37:14strchr( hoge, '\\'); ってまずいじゃん。
でも、「char配列にSJIS文字列入れるの禁止」って言うのはどうよ、みたいな。
0398デフォルトの名無しさん
2008/01/27(日) 18:37:360399デフォルトの名無しさん
2008/01/27(日) 18:37:59そうそう。そんな感じ。
0400デフォルトの名無しさん
2008/01/27(日) 18:42:170401デフォルトの名無しさん
2008/01/27(日) 18:44:350402デフォルトの名無しさん
2008/01/27(日) 18:47:46そういえばなんでがんばってfind禁止のダウングレードのstd::string使ってるん
だったっけ?
だれかどこでも動くCString作ってぇぇ
0403デフォルトの名無しさん
2008/01/27(日) 18:49:03>>394
>>396
ありがと。
やっぱC++はスゲーや。
Cのシンプルな文法に慣れきったオレには奥が深いぜ。
0404デフォルトの名無しさん
2008/01/27(日) 18:49:050405デフォルトの名無しさん
2008/01/27(日) 18:52:20どこでもSJIS使うの?
0406デフォルトの名無しさん
2008/01/27(日) 18:52:310407デフォルトの名無しさん
2008/01/27(日) 18:54:02UTF-8 や EUC も使うが。
0408デフォルトの名無しさん
2008/01/27(日) 18:57:060409デフォルトの名無しさん
2008/01/27(日) 18:58:30いや、できればマクロとかでプラットフォームごととか文字コードとか
切り替えられてさ、当たり前だけどfindとかも問題なく動いちゃうやつ。
CStringみたいに楽に使えて、でもUTF-8とか16とかも平気な感じ。
std::ustringみたいに統一しちゃってさ。boostとかかな。
0410デフォルトの名無しさん
2008/01/27(日) 18:59:32ただ、SJISのままだと単純サーチにするしかないので効率は悪い。
0411デフォルトの名無しさん
2008/01/27(日) 19:01:36そりゃWinの場合は内部的には_mbsstr呼ぶとかして高速化しる
0412デフォルトの名無しさん
2008/01/27(日) 19:01:45wstring(char*)を付ければ解決するような気になるけど?
0413デフォルトの名無しさん
2008/01/27(日) 19:01:47普通sunだよな
0414デフォルトの名無しさん
2008/01/27(日) 19:05:17他の環境だとその手の関数あるんだろうか。
0415デフォルトの名無しさん
2008/01/27(日) 19:22:06すればよいのでしょうか?以下のようにしておく必要があるのでしょうか?
他にもっといい方法があるのでしょうか?
#ifdef UNICODE
#define tstring string
else
#define tstring wstring
まだ98でもXPでも動かしたいので・・
0416デフォルトの名無しさん
2008/01/27(日) 19:23:31クロスに作るのが難しいこんな世の中じゃ
0417デフォルトの名無しさん
2008/01/27(日) 19:25:51とりあえず #define よりは typedef のほうがいいだろうな。
0418デフォルトの名無しさん
2008/01/27(日) 19:30:39なにかわからないがよくないことが起こりそうな悪寒
0419デフォルトの名無しさん
2008/01/27(日) 19:41:43…めんどくさいでしょ。
0420デフォルトの名無しさん
2008/01/27(日) 19:45:370421デフォルトの名無しさん
2008/01/27(日) 19:51:06それは TCHAR と _T として既に用意されているだろう。
0422デフォルトの名無しさん
2008/01/27(日) 23:53:01typedef std::basic_string<TCHAR> tstring;
>>362
361のようなことを現実にやれるソフトウェアでは、
多言語対応のため、文字列リテラルの大半はソースコードに含まれないとか、
APIはラッパー層があるから変換も余裕とかそういう次元にいると思う。
0423デフォルトの名無しさん
2008/01/28(月) 00:52:04メッセージ的なものはともかくfind(":")的なパース類もすべてfind(COLON)とか
にして事前にUTF-8で用意しておかなくちゃいけなくなるし、全WinAPIをラップする
のはいよいよ無理だろうに。カレントディレクトリ一つ取るのも
GetCurDir(string& s){
TCHAR t[PATH_MAX];
::GetCurrentDirectory(PATH_MAX, t);
#ifdef UNICODE
Utf-16からUTF-8に変換
#else
SJISからUTF-8に変換
}
的にすべてのラップ関数を用意してあげなきゃいけなくなるし。。
0424デフォルトの名無しさん
2008/01/28(月) 00:57:46他に理由がなければ、ASCII分はそのままソースに書いていいと思った。
0425デフォルトの名無しさん
2008/01/28(月) 00:59:560426デフォルトの名無しさん
2008/01/28(月) 01:02:520427デフォルトの名無しさん
2008/01/28(月) 01:34:22UTF-8からUTF-16に変換はちょっとやだなあ。
全てのAPIをラップする開発コストに加えて、実行時の変換コストまでかかるし。。
やっぱWinはUTF-16でいきたいね。
0428デフォルトの名無しさん
2008/01/28(月) 01:37:110429デフォルトの名無しさん
2008/01/28(月) 09:45:10結局文字コード周りはいまいちなのがわかるだけなんだよなあ。。
0430デフォルトの名無しさん
2008/01/28(月) 14:04:09なんか良スレの悪寒。
0431デフォルトの名無しさん
2008/01/28(月) 15:13:29中国が大体元凶だけどな
0432デフォルトの名無しさん
2008/01/28(月) 15:26:40> API呼ぶたびにUTF-8からUTF-16に変換
Dのことかー!
0433デフォルトの名無しさん
2008/01/28(月) 16:15:550434デフォルトの名無しさん
2008/01/28(月) 16:34:19言語の区別ができない文字コードはUnicodeに限らないんだよ
0435デフォルトの名無しさん
2008/01/28(月) 17:12:12次々と撤回して期待外れだったよな。
0436デフォルトの名無しさん
2008/01/28(月) 17:37:190437デフォルトの名無しさん
2008/01/28(月) 17:44:510438デフォルトの名無しさん
2008/01/28(月) 18:07:33ユニコードって言うんだよね。
0439デフォルトの名無しさん
2008/01/28(月) 18:27:510440デフォルトの名無しさん
2008/01/28(月) 19:13:14しらんかった
0441デフォルトの名無しさん
2008/01/28(月) 19:15:54中国だけじゃないぞ
0442デフォルトの名無しさん
2008/01/28(月) 19:24:34ハングルは現在全く使用されない組み合わせも全部作るように
韓国が強く要求したんだと
それでbatangが異常に膨れている。
韓国死ねよ。
0443デフォルトの名無しさん
2008/01/28(月) 19:30:250444デフォルトの名無しさん
2008/01/28(月) 19:35:52ここをみるかぎり、「あ゛」は単一のコードとして存在しないようだが
0445デフォルトの名無しさん
2008/01/28(月) 19:57:49可変長で6バイトでもよくなったんだから、なんでもいれていいと思う。
0446デフォルトの名無しさん
2008/01/28(月) 19:59:46やあチョーセンジン
0447デフォルトの名無しさん
2008/01/28(月) 20:06:35なんでなかよくできんもんかね。
0448デフォルトの名無しさん
2008/01/28(月) 20:10:36稀つーかあるのか。
0449デフォルトの名無しさん
2008/01/28(月) 20:13:08あと、中国と韓国。
どちらも、主従関係だけどw
0450デフォルトの名無しさん
2008/01/28(月) 20:42:130451デフォルトの名無しさん
2008/01/28(月) 21:41:37隣国っつーよりは、日本とアメリカ・・・は言い過ぎかもしれんが、
そんな感じだったと思うぜ。
0452デフォルトの名無しさん
2008/01/28(月) 21:47:52♪ \\ ♪ 生き〜ているけど チョンは氏ね〜 ♪// ♪
♪ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧ ∧∧ ♪
♪ ∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*) ♪
(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧
♪ ∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)∧ ∧(゚0 ゚*)♪
─♪──(゚0 ゚*)| U(゚0 ゚*)| U(゚0 ゚*)| U(゚0 ゚*)| U(゚0 ゚*)| U(゚0 ゚*)| U
| U.| | | U | || U. | || U. | || U. | || U. | |〜♪
♪ | | U U. | | U U | | U U | | U U | | U U | | U U ♪
U U U U U U U U U U U U
0453デフォルトの名無しさん
2008/01/28(月) 22:06:43こんなのがあったのね。知らんかった
確かにゲームや組み込みではSTLそのまま使うのはキツイわな
0454デフォルトの名無しさん
2008/01/28(月) 22:11:55電脳創世記っていう本にあったんだが、そもそも「CJKその他ヨーロッパの小国死ねよ」
ってやってる連中はアルファベットしかないコードしか使ってなくて、それを日本人が
「文字コード問題は俺たちが解決して業績上げますからメリケン共は口出ししなくても良いよ^^」
って挑発して今の流れになったんだと思う。
0455デフォルトの名無しさん
2008/01/29(火) 02:36:05ゲームがメモリをキツキツに使うからって、数バイト〜数十〜数百バイト単位の
標準ライブラリのメモリ確保までキツキツにしても、あんまり関係ないと思うんだ。
どうせ画像やサウンドデータが1個増えればだけでそこらへんの努力は
吹っ飛ぶもんじゃないの?処理負荷にしてもさ。
0456デフォルトの名無しさん
2008/01/29(火) 02:42:20漢字使用国がそれだけは言っちゃいかんだろ
「じゃお前ら文字数が多すぎるから統合ね」と言われても何も言い返せない
むしろ韓国みたいにもっと初期の段階で分離しろと言い張れば分離できたかも
しれないのに日本人おとなしすぎ
0457デフォルトの名無しさん
2008/01/29(火) 02:55:030458デフォルトの名無しさん
2008/01/29(火) 02:55:330459デフォルトの名無しさん
2008/01/29(火) 02:58:15ほぼ同じ意味の文章なら中国語が一番少ないデータサイズで書ける
0460デフォルトの名無しさん
2008/01/29(火) 03:06:020461デフォルトの名無しさん
2008/01/29(火) 03:47:21アニメの中国語のfansubとか見るとかなが入った日本語と
漢字ばっかりの中国語で文字数そんなに変わらんように見えたけど。
だから画数で言えば中国語は不利。
0462デフォルトの名無しさん
2008/01/29(火) 04:43:57ような気もする。
0463デフォルトの名無しさん
2008/01/29(火) 06:14:49ゲーム機はメインメモリ領域が結構キツイんでないの
0464デフォルトの名無しさん
2008/01/29(火) 06:33:10嘘過ぎる
0465デフォルトの名無しさん
2008/01/29(火) 06:40:300466デフォルトの名無しさん
2008/01/29(火) 06:41:36ちょうどいいのがなかったけど、これとか
http://jp.youtube.com/watch?v=BdXniHjh2WM
0467デフォルトの名無しさん
2008/01/29(火) 07:28:09ってどこへ行こうとしてるんだこのスレは
0468デフォルトの名無しさん
2008/01/29(火) 15:13:48処理系依存では(例えばVC++とか)扱えそうですけど。
0469デフォルトの名無しさん
2008/01/29(火) 16:35:57wstring, wchar_t を問題なく扱えればOKなのか?それなら問題ないよ。
ロカール処理やエンコーディング変換のための十分なサポートがあるか?それなりしかない。
0470デフォルトの名無しさん
2008/01/29(火) 21:06:41コンテナ(というかアロケータ)のメモリ効率は重要だと思うが。
アラインメントやページ境界にかなり気をつかっているらしい。
演算効率についてはちょっと読みきれていないが...
inline展開とか命令キャッシュ効率とか、分岐予測の弱いプロセッサのこととか、
いろいろ書いてある。
でかいボトルネックは取り除いた上でさらにどうがんばるかって話では。
>>463
"Game platform memory metrics"ってところに主要なゲーム機のspecが書いてある。
0471デフォルトの名無しさん
2008/01/29(火) 21:17:44この辺がしっかりしてるからかな
まぁ無理だろうけど、一部位公開してほしいな
0472デフォルトの名無しさん
2008/01/29(火) 23:48:57使えないですか?
0473デフォルトの名無しさん
2008/01/29(火) 23:53:570474デフォルトの名無しさん
2008/01/30(水) 00:12:340475デフォルトの名無しさん
2008/01/30(水) 00:50:000476デフォルトの名無しさん
2008/01/30(水) 01:43:110477デフォルトの名無しさん
2008/01/30(水) 01:59:020478デフォルトの名無しさん
2008/01/30(水) 15:09:310479デフォルトの名無しさん
2008/01/31(木) 12:03:42STL等にセマフォを任せることは出来ないでしょうか?
0480デフォルトの名無しさん
2008/01/31(木) 12:06:110481デフォルトの名無しさん
2008/01/31(木) 12:31:30いまどきの実装であれば、たいていドキュメントにマルチスレッドについて書かれている。
そういう記述が無いとか、書かれた保証では不十分だとか、広い移植性が必要だとか、
ドキュメントを読むのがメンドイとか言うんなら自分でなんとかするしかない。
0482デフォルトの名無しさん
2008/01/31(木) 18:06:11実際配列が連続じゃない実装をしてる環境ってあるんですか?
0483デフォルトの名無しさん
2008/01/31(木) 18:10:370484479
2008/01/31(木) 18:50:24ありがとうございました。 無い事が分かって安心しました。
必死で作って、既に有ったらかなり凹むのでw(勉強にはなるけど)
WinAPIのCreateSemaphore()かmutexで検討したいと思います。
0485デフォルトの名無しさん
2008/01/31(木) 19:52:11しかもヌルターミネータ文字まで入ってたり。
0486デフォルトの名無しさん
2008/01/31(木) 19:54:51ない。というか、次期の規格(C++0x)で連続性が保証されるようになる。
N2461) 21.3.1 basic_string general requirements [string.require]
3 The char-like objects in a basic_string object shall be stored contiguously.
That is, for any basic_string object s, the identity &*(s.begin() + n) == &*s.begin() + n
shall hold for all values of n such that 0 <= n < s.size().
0487デフォルトの名無しさん
2008/01/31(木) 19:58:43つなぎ合わせる事を想定してるな。
0488デフォルトの名無しさん
2008/01/31(木) 20:01:320489デフォルトの名無しさん
2008/01/31(木) 20:02:470490デフォルトの名無しさん
2008/01/31(木) 20:04:030491デフォルトの名無しさん
2008/01/31(木) 20:06:10何か言われてんのかな。
0492デフォルトの名無しさん
2008/01/31(木) 21:13:41例えばどんな場合?
0493デフォルトの名無しさん
2008/01/31(木) 21:15:33どんな場合って・・・何するにしてもスレッドセーフを要求する
仕様なんてないはずだけども。
0494デフォルトの名無しさん
2008/01/31(木) 21:17:020495デフォルトの名無しさん
2008/01/31(木) 21:21:14beginthread一回でも呼ぶプロセスではstlは一行も使えないってことに
なりそうな。
たぶん皆、同一インスタンスに複数スレッドでアクセスしなければ平気
くらいな解釈で使ってるんだよね
0496デフォルトの名無しさん
2008/01/31(木) 22:41:350497デフォルトの名無しさん
2008/01/31(木) 23:19:440498デフォルトの名無しさん
2008/01/31(木) 23:26:590499デフォルトの名無しさん
2008/01/31(木) 23:30:230500デフォルトの名無しさん
2008/01/31(木) 23:39:350501デフォルトの名無しさん
2008/01/31(木) 23:41:250502デフォルトの名無しさん
2008/01/31(木) 23:41:370503デフォルトの名無しさん
2008/01/31(木) 23:48:23その場合、32bitを示す型は何だろう?
0504デフォルトの名無しさん
2008/01/31(木) 23:52:060505デフォルトの名無しさん
2008/01/31(木) 23:52:21ILP64 でググれ。
0506デフォルトの名無しさん
2008/02/01(金) 00:09:020507デフォルトの名無しさん
2008/02/01(金) 00:16:41まさか、int 64bitでlong 32bitと言ってる?
0508デフォルトの名無しさん
2008/02/01(金) 00:17:560509デフォルトの名無しさん
2008/02/01(金) 00:24:17I16/LP32はDOSで経験があるし(w
0510デフォルトの名無しさん
2008/02/01(金) 00:25:160511デフォルトの名無しさん
2008/02/01(金) 00:29:144G超えのファイルなんかザラだろうが。
0512デフォルトの名無しさん
2008/02/01(金) 00:31:190513デフォルトの名無しさん
2008/02/01(金) 00:34:470514デフォルトの名無しさん
2008/02/01(金) 00:37:090515デフォルトの名無しさん
2008/02/01(金) 00:37:340516デフォルトの名無しさん
2008/02/01(金) 00:42:240517デフォルトの名無しさん
2008/02/01(金) 00:44:20C99にあるんですよlong long。
>>516
そうします。
0518デフォルトの名無しさん
2008/02/01(金) 00:47:190519デフォルトの名無しさん
2008/02/01(金) 00:50:58VC++ .NET 2003からはlong longも使えるぞ。
0520デフォルトの名無しさん
2008/02/01(金) 00:51:200521デフォルトの名無しさん
2008/02/01(金) 00:53:43別に知っとるが、_int64 の方が短くて分かりやすくていいじゃン
0522デフォルトの名無しさん
2008/02/01(金) 00:55:01これでtypedefしとけば字数的にはint未満だ。何かとぶつかりそうだけどな。
0523デフォルトの名無しさん
2008/02/01(金) 00:55:520524デフォルトの名無しさん
2008/02/01(金) 00:55:540525デフォルトの名無しさん
2008/02/01(金) 00:56:53なげーよ。
0526デフォルトの名無しさん
2008/02/01(金) 00:59:03そこで i8 とか定義しとけば何も付けなくて大丈夫。
0527デフォルトの名無しさん
2008/02/01(金) 02:14:27intN_tな連中。
0528デフォルトの名無しさん
2008/02/01(金) 02:18:410529デフォルトの名無しさん
2008/02/01(金) 02:30:240530デフォルトの名無しさん
2008/02/01(金) 02:47:05最新のドラフトに cstdint と stdint.h が載ってた。次の改訂 (C++0x) で入るみたいだね。
0531デフォルトの名無しさん
2008/02/01(金) 06:38:05それともC99で使えてもC++0xではサポートされない機能もあり?
0532デフォルトの名無しさん
2008/02/01(金) 07:22:07配列個数に変数使うとか
そういうのは C++0x で無視
0533デフォルトの名無しさん
2008/02/01(金) 07:24:480534デフォルトの名無しさん
2008/02/01(金) 07:54:320535デフォルトの名無しさん
2008/02/01(金) 08:29:10kwsk
0536デフォルトの名無しさん
2008/02/01(金) 09:01:100537デフォルトの名無しさん
2008/02/01(金) 13:51:10の糖衣構文にしてくれるだけでいいのに。
0538デフォルトの名無しさん
2008/02/01(金) 16:33:280539デフォルトの名無しさん
2008/02/01(金) 16:49:23STLPort はインストーラ(make)が VS2008 にまだ対応していない。
手動でインストールするなら可能らしい。STLport VS2008 でググレ。俺はまだ試していないので、試したら結果を教えてくれ。
0540デフォルトの名無しさん
2008/02/01(金) 17:54:00iostream使うとC2487がいっぱい出るよ
0541デフォルトの名無しさん
2008/02/01(金) 18:14:050542デフォルトの名無しさん
2008/02/02(土) 01:05:39std::vector で何が不満なのさ?
0543デフォルトの名無しさん
2008/02/02(土) 01:06:580544デフォルトの名無しさん
2008/02/02(土) 01:09:310545デフォルトの名無しさん
2008/02/02(土) 01:21:27と
double v[i];
なら下の方が綺麗だろう。
2次元配列とかなるともうキモいったらありゃしない。
0546デフォルトの名無しさん
2008/02/02(土) 03:43:090547デフォルトの名無しさん
2008/02/02(土) 04:00:520548デフォルトの名無しさん
2008/02/02(土) 07:03:42(i) これは正常。むしろ性情。
0549デフォルトの名無しさん
2008/02/02(土) 07:29:170550デフォルトの名無しさん
2008/02/02(土) 08:16:48╋
/\
0551デフォルトの名無しさん
2008/02/02(土) 11:50:57FORTRAN か BASIC ばっかつかってるからそうなるんだ。
0552デフォルトの名無しさん
2008/02/02(土) 12:08:05double v[i][j];
より
std::vector< std::vector<double> > v(i, std::vector<double>(j));
や
std::vector< std::vector<double> > v(i);
std::for_each(v.begin(), v.end(), std::bind2nd(std::mem_fun_ref(&std::vector<double>::resize), j));
の方が美しいと感じるようだ。
0553デフォルトの名無しさん
2008/02/02(土) 12:21:140554デフォルトの名無しさん
2008/02/02(土) 12:29:59typedefしろよ
0555デフォルトの名無しさん
2008/02/02(土) 12:30:330556デフォルトの名無しさん
2008/02/02(土) 12:35:530557デフォルトの名無しさん
2008/02/02(土) 12:50:03typedef vector<double> vector_double;
…
こんなのがtypedefs.hに延々ならんでるソースを見せられたときは会社やめようかと思った。
結局1年しか勤めなかったけど・・
0558デフォルトの名無しさん
2008/02/02(土) 13:15:32なにがあかんねん
0559デフォルトの名無しさん
2008/02/02(土) 13:17:39いみないやん
0560デフォルトの名無しさん
2008/02/02(土) 13:18:26#define VALUE_100 100
て定義する様なもの
0561デフォルトの名無しさん
2008/02/02(土) 14:29:30そのレベルだと好みが分かれそうだなあ
vector<string> string_list
とかはありがちだけど。intとはな。。
0562デフォルトの名無しさん
2008/02/02(土) 14:32:110563デフォルトの名無しさん
2008/02/02(土) 14:36:40そういう問題じゃない。
・typedef名に意味付けがない
↓のようなコメントと通じるものがある
a += 100; // aに100を足す
・字数がほとんど変わらず、打鍵数減少につながらない
…ところで、あなたは list<string>をどのようにtypedefするの?
0564デフォルトの名無しさん
2008/02/02(土) 14:39:410565デフォルトの名無しさん
2008/02/02(土) 14:48:34typedefされた型しか使わないというのは、
互換性を重視するときは有利になる。
0566デフォルトの名無しさん
2008/02/02(土) 14:51:03具体的にどんな移植性の問題が typedef によって解決されるんでしょうか?
0567デフォルトの名無しさん
2008/02/02(土) 14:54:21typedefはそういう用途に使えることは否定しないけど、
vectorもintも標準の一部だから、互換性の点でもtypedef vector<int> vector_int;とする意味は無いんじゃないの。
0568デフォルトの名無しさん
2008/02/02(土) 14:55:54typedefが移植性のためにあるようなものなのにな。
なぜなにの子供か?
0569デフォルトの名無しさん
2008/02/02(土) 14:56:04typedef vector<long> vector_int;
に置き換えて「すっきり解決」とか、そういう話か?
0570デフォルトの名無しさん
2008/02/02(土) 15:01:040571デフォルトの名無しさん
2008/02/02(土) 15:03:500572デフォルトの名無しさん
2008/02/02(土) 15:05:240573デフォルトの名無しさん
2008/02/02(土) 15:31:240574デフォルトの名無しさん
2008/02/02(土) 17:22:02課せられれば、vector_int みたいなものは生まれるし、それでもよいと思うぞ。
だから >>557 がどうこう言う程の問題ではないと思われるが。
こういうのは出たての若いのによくいる 自分は社内でも皆よりよく分かってる と
思いこんでる井の中の蛙ってこった。
0575デフォルトの名無しさん
2008/02/02(土) 17:31:060576デフォルトの名無しさん
2008/02/02(土) 17:34:44そんな命題を甘んじて受けるほど奴隷ではありません。
0577デフォルトの名無しさん
2008/02/02(土) 17:35:12その通り、会社の方針なら勤めてる以上は従わざるを得ないのは言うまでもない。
そこで、無能だったり考え方の一致しなかったりする上司の下で働く羽目になった場合に取り得る行動は、
我慢して働きつづけるか、さっさと辞めるかの二者択一で、>>557は後者を選んだだけだろ。
別に非難されるようなことではない。
0578デフォルトの名無しさん
2008/02/02(土) 17:36:14それは無能なプログラマが無能な会社に変わっただけで、>>557の判断には影響ないだろw
0579デフォルトの名無しさん
2008/02/02(土) 17:39:09それで問題が発生したとき責任取って解決できるのなら
それでも良いんじゃね? いざとなったら逃げるのはただの口だけ君。
0580デフォルトの名無しさん
2008/02/02(土) 17:43:00vector<T>をtypedefすることもあるんじゃないかな?
0581デフォルトの名無しさん
2008/02/02(土) 17:43:44会社の命令に背いて問題を起こすなんて選択肢はもとからないよ
常識があれば、「従う」と「去る」の二択しか取れない
0582デフォルトの名無しさん
2008/02/02(土) 17:43:510583デフォルトの名無しさん
2008/02/02(土) 17:48:52このケースでvector<int>は必要なかったとしても、
list<string>はtypedefしたほうがいい。
とすれば、必要あるなしの境界はどこで切る?
こういう皆が使って判断の微妙な境界線は、
「一律typedef」が安全。
0584デフォルトの名無しさん
2008/02/02(土) 17:53:28目指して作られてるはずなのに、ソースはtypedefだらけ。
それを異常と感じないほうがおかしい。
0585デフォルトの名無しさん
2008/02/02(土) 17:55:260586デフォルトの名無しさん
2008/02/02(土) 18:03:040587デフォルトの名無しさん
2008/02/02(土) 18:04:36抽象化するためにtypedefが必要だったりするし、STLなんかtypedefだらけだけど?
0588デフォルトの名無しさん
2008/02/02(土) 18:12:31まぁね。 ドラマのまねっこで「僕はそんなことはできません」なんて
楯突いてその後その人間同士が上手く行くことなんてまぁないからね。
ドラマはご都合主義だから上手くいくけどさw
0589デフォルトの名無しさん
2008/02/02(土) 18:17:26自分も会社の一員だけどね。そういうこだわりのない人間が集まってるから駄目な会社になったとも言える。
0590デフォルトの名無しさん
2008/02/02(土) 18:17:50仕事ってオブジェクト(?)をもっと理解した方がいいよ。
逆に考えて、君がお客で 奴隷とかいうのが車屋の店員だったとする。
君は赤色の車を注文した。 しかし店員は「いやいまのトレンドは白です。
そこは譲れません」 と言ってるのと大して変わらん。
0592デフォルトの名無しさん
2008/02/02(土) 18:24:24授業単元:コンピュータ理論
課題:本字の流れをvectorとlistを使って表しなさい。但しtypedefは使わないものとする。
0593デフォルトの名無しさん
2008/02/02(土) 18:27:27それで商売になるならそれでいいし、ならないなら別のことをするだけだ
意に反して赤い車を売らされることはない。もちろん妥協して赤い車を売ってもいい
0594デフォルトの名無しさん
2008/02/02(土) 18:33:44それは違うだろ
0595デフォルトの名無しさん
2008/02/02(土) 18:43:17おまえ尾崎豊の歌大好きだろ?w
0596デフォルトの名無しさん
2008/02/02(土) 18:59:03ほとんど聴いたことすらないww
0597デフォルトの名無しさん
2008/02/02(土) 19:31:330598デフォルトの名無しさん
2008/02/02(土) 19:42:18いきなり奴隷なんて言葉を使い出す輩とは
あまり議論もしたくないな、おれは。
どこぞのウィルス流してつかまったヤツを想起してしまうよ。
0599デフォルトの名無しさん
2008/02/02(土) 19:49:14それは抽象化とはいわん。単なる簡略化。
型の違いを意識の外に放り出してしまえるのが本来の抽象化。
現実はその逆。
0600デフォルトの名無しさん
2008/02/02(土) 19:49:59動かすには、全員が力合わせて同じ方向に綱引かないと成功なんか
ないよね。 俺は反対に引きたい とか関係ねーよ。
社会の歯車とかTVで憶えた訳分からん言葉に流されるべからず。
0601デフォルトの名無しさん
2008/02/02(土) 19:54:16std::binary_functionの中とかでやってるtypedefはどう考えても抽象化のためだろ?
0602デフォルトの名無しさん
2008/02/02(土) 19:56:43本心は別だろ?w
マが鬱になる原因はそういうところが始まりなんだよ?
0603デフォルトの名無しさん
2008/02/02(土) 19:58:08本当は「会社として金を儲けるにはどうすりゃいい」というのに従うべきなんだけどな。
車売って利益上げるのが商売なんだから。
>586
色々。主に抽象化と手抜き。一例として
template<template<class>class trail_t>
struct Policy {
typedef trail_t<Policy<trail_t> > Trail;
// (snip)
};
template<class policy_t> // Policyの派生型を取り込むことを想定
class S {
typedef policy_t Policy;
typedef policy_t::Trail Trail;
// Trailをバンバン活用
};
といった感じで手が抜ける。
0604デフォルトの名無しさん
2008/02/02(土) 19:58:17使ったこと無いから知らん
それにここまでの話の流れじゃはそういうとこじゃないだろ
0605デフォルトの名無しさん
2008/02/02(土) 19:59:30typedefs.hの方が賢いと思う。
0606デフォルトの名無しさん
2008/02/02(土) 19:59:50それにここまでの話の流れじゃそういうとこじゃないだろ
↑typedef乱用のところな
0607デフォルトの名無しさん
2008/02/02(土) 20:00:42使ったことないのね。了解。
0608603
2008/02/02(土) 20:01:430609デフォルトの名無しさん
2008/02/02(土) 20:19:10本心は当然別よ。 本来人の考えが一致するなんて奇蹟ぐらいの考えで丁度いいよ。
映画あらしのよるに で上手く分かりやすく描かれてるよ。羊と狼が友情築くアニメ風のやつ。
0610デフォルトの名無しさん
2008/02/02(土) 20:37:170611デフォルトの名無しさん
2008/02/02(土) 21:14:32intじゃなくて複素数入れたくなった時に
vector_int
じゃカコワルイだろ
0612デフォルトの名無しさん
2008/02/02(土) 21:18:35>600を実現するためにどれだけの苦労が必要かがわかる。
あくまでマネージャー視点だけど、プログラマ側からするとマネージャーの資質を
測るのに良いヒントになるよ。
ついでに「デスマーチ」もドゾー。現実は厳しいということを教えてくれる古典的名著。
0613デフォルトの名無しさん
2008/02/02(土) 21:19:560614デフォルトの名無しさん
2008/02/02(土) 21:20:00そんときはリファクタリングじゃね?名前総取っ替えだろうね。
0615デフォルトの名無しさん
2008/02/02(土) 21:21:41他のtypedefの使いかたでも良いよ。
0616デフォルトの名無しさん
2008/02/02(土) 21:27:10typedef int Code;
typedef std::vector<Code> CodeList;
とか
typedef std::vector<Code> CodeSequence;
とかにしたほうが良いんじゃないのって言うのが良識のあるプログラマの意見じゃないかな
0617デフォルトの名無しさん
2008/02/02(土) 21:29:190618デフォルトの名無しさん
2008/02/02(土) 21:35:250619デフォルトの名無しさん
2008/02/02(土) 21:40:050620デフォルトの名無しさん
2008/02/02(土) 21:48:46Policyは非常に強力なコンセプトだと思うんだがね。
本当はもっと制約の少ないMix-in機能が欲しいけどね。
Policy同士で相互依存があると破綻しがちだから、けっこう設計が面倒。
0621デフォルトの名無しさん
2008/02/02(土) 21:49:24あぁ、早速それ乗って近くの本屋にEffectiveSTL買いに行く予定だよ
0622デフォルトの名無しさん
2008/02/02(土) 22:12:32アレキサンドレスクの受け売りですか?
0623デフォルトの名無しさん
2008/02/02(土) 22:20:19ちゃんと返事くれるんだな。できる人は違うわ。
0624デフォルトの名無しさん
2008/02/02(土) 22:20:59相互依存のあるPolicyなんて思い浮かばないんだけど
具体的にどんなの?
0625デフォルトの名無しさん
2008/02/02(土) 22:23:260626デフォルトの名無しさん
2008/02/02(土) 22:23:56単にデカいクラスのモジュール化をするときに使ったりしてる。
本当は包含とかでも何とかなるんだけどねぇ。
委譲関数書かなくて良いのが素敵なんで何となくポリシー使ってる。
0627デフォルトの名無しさん
2008/02/02(土) 22:26:16いや適当
0628デフォルトの名無しさん
2008/02/02(土) 22:27:48もちろんきっちり設計してから組めば相互依存はほとんど無くすことができるんだけど、
トライ&エラーで設計するときはそんなこと言ってられないからね。
ルーズに始めるときは、たいてい相互依存バリバリだったりする…………
リファクタリングするときも相互依存した状態を経由するから、そういうときも不便。
0629デフォルトの名無しさん
2008/02/02(土) 22:32:020630デフォルトの名無しさん
2008/02/02(土) 22:43:00直交に分離するのは理想だけど、神様でもなければ一発でそんなに上手く行くわきゃ無いよな。
0631デフォルトの名無しさん
2008/02/05(火) 08:39:38コピーしてsortする方法だと、std::pair<T1, T2>が大きい時にコストがかかるのでイヤーン。
mapの要素へのポインタをvectorに格納してsortしたいんだけどうまくいかない。
std::vector<const std::pair<T1, T2>*>みたいの。
エロい人サンプルコード書いてくだちい。
0632デフォルトの名無しさん
2008/02/05(火) 09:21:28{
return &obj;
}
map<int, int> m;
m[0] = 3;
vector<const pair<const int, int>*> vec;
transform(m.begin(), m.end(), back_inserter(vec), addressof);
こんな感じ?
0633デフォルトの名無しさん
2008/02/05(火) 20:54:58でもソートも書いて欲しいよママン
0634デフォルトの名無しさん
2008/02/05(火) 22:28:39そんな難しくもなさそうな気もするけど、まずはうまくいかなかったコードを書いてみれば?
0635デフォルトの名無しさん
2008/02/05(火) 22:39:37を渡せば終わる話だからなー
0636デフォルトの名無しさん
2008/02/05(火) 22:44:010637デフォルトの名無しさん
2008/02/05(火) 23:10:39typedef map<int, string> Mymap;
struct Mycomp {
bool operator()(const pair<const int, string>* p1,
const pair<const int, string>* p2) {
return p1->second < p2->second;
}
};
int main()
{
Mymap m;
//いろいろ挿入
vector<pair<const int, string>* > vec;
for(Mymap::iterator i = m.begin(); i != m.end(); ++i) {
vec.push_back(&(*i));
}
sort(vec.begin(), vec.end(), Mycomp());
}
0638デフォルトの名無しさん
2008/02/05(火) 23:15:320639デフォルトの名無しさん
2008/02/06(水) 00:02:14それなんてstd::set?
0640デフォルトの名無しさん
2008/02/06(水) 00:15:23pairのsecondだけでソートってできるんだっけ?
0641デフォルトの名無しさん
2008/02/06(水) 00:18:180642デフォルトの名無しさん
2008/02/09(土) 11:47:37vector<int> v;
v.reserve (100000);
ぐらいの領域を使った後
v.clear ();
cout << "capacity = " << v.catacity() << "\n";
capacityが100000を返してくるのですが、どうやって領域を開放したらいいのでしょうか?
v自体はまだ使うので消したくありません。
0643デフォルトの名無しさん
2008/02/09(土) 11:54:070644642
2008/02/09(土) 12:01:01できた。ありがとう! お前まじ天才
さしつかえなければ、何をどうやって勉強すればお前みたいになれるのか教えてください。
0645デフォルトの名無しさん
2008/02/09(土) 12:03:27つ"Effective STL"
0646642
2008/02/09(土) 12:08:50これを読んで俺も天才になる
0647デフォルトの名無しさん
2008/02/09(土) 12:31:420648デフォルトの名無しさん
2008/02/09(土) 13:05:160649デフォルトの名無しさん
2008/02/09(土) 13:29:090650デフォルトの名無しさん
2008/02/09(土) 16:10:300651デフォルトの名無しさん
2008/02/09(土) 17:58:50じょてぃす買った俺が通りますよ。
じょてぃすは絶版になるべきではなかった。
0652デフォルトの名無しさん
2008/02/09(土) 18:19:14原書を読み漁ったおれもいますよ。平易な英語だから無問題。
0653デフォルトの名無しさん
2008/02/09(土) 19:24:520654デフォルトの名無しさん
2008/02/09(土) 19:50:38TemplateならあるがSTLの本なんて書いてたっけ?
0655デフォルトの名無しさん
2008/02/09(土) 20:56:210656デフォルトの名無しさん
2008/02/10(日) 02:11:510657デフォルトの名無しさん
2008/02/11(月) 07:54:08stringの場合は明示的にメモリ解放する手段て無いのでしょうか?
0658657
2008/02/11(月) 08:06:11直後の状態である程度のバッファが確保されてるだけでした。
0659デフォルトの名無しさん
2008/02/14(木) 09:50:34やっぱ、
>std::vector <std::string>
ですか?
0660デフォルトの名無しさん
2008/02/14(木) 09:53:14うん。 TStringList という名前だけ見ると、どちらかといえば std::list<std::string> かと。
0661デフォルトの名無しさん
2008/02/14(木) 10:03:11実は、vectorしか使ったことないのです。listとvectorの違いを知りたいです。
0662デフォルトの名無しさん
2008/02/14(木) 10:06:33記述は大差ないみたいですね。
実行効率とメモリの違いみたいな。
ttp://ml.tietew.jp/cppll/cppll_novice/article/269
0663デフォルトの名無しさん
2008/02/14(木) 13:05:030664デフォルトの名無しさん
2008/02/14(木) 17:07:51ランダムアクセス可能。
メモリが連続している。
list
ランダムアクセスできない。
当該要素のerase以外で参照・イテレータが無効化されない。(個人的にはこれが一番重要)
任意位置への挿入・削除が定数時間。
独特な操作(spliceなど)がある。
選択する上で気をつけるのはこんなとこか?
0665デフォルトの名無しさん
2008/02/14(木) 17:20:05選択って意味では、
vector と list を間違えるより、
vector と map(←これもまだ使ったこと無いw) を間違えたら大変な気がしました。
0666デフォルトの名無しさん
2008/02/14(木) 18:24:340667デフォルトの名無しさん
2008/02/14(木) 19:46:00連続性が重要ならlistもmapも同じくらい散々な目に遭うし、一応コンパイルが通ればいいだけなら
vectorでもmapでも問題ない。
0668デフォルトの名無しさん
2008/02/14(木) 21:59:150669デフォルトの名無しさん
2008/02/14(木) 22:17:35標準ではないがstd::slistってのがある。
0670デフォルトの名無しさん
2008/02/14(木) 22:56:57std::listだって線形リンクリストでしょ。双方向であるというだけで。
0671デフォルトの名無しさん
2008/02/15(金) 01:50:440672デフォルトの名無しさん
2008/02/15(金) 01:53:080673デフォルトの名無しさん
2008/02/15(金) 01:53:10よく考えたら reverse_iterator 使えるもんね。
0674デフォルトの名無しさん
2008/02/15(金) 02:14:36言ってた気がする
0675デフォルトの名無しさん
2008/02/15(金) 02:36:37言ってた気がする
0676デフォルトの名無しさん
2008/02/15(金) 02:41:250677デフォルトの名無しさん
2008/02/15(金) 03:13:20dequeメチャメチャ速いやん
0678デフォルトの名無しさん
2008/02/15(金) 03:35:200679デフォルトの名無しさん
2008/02/15(金) 07:49:19listはvectorに比べてアロケーションの多さと断片化が弱点になりそうだよね
0680666
2008/02/15(金) 08:45:44というより、実はネットで拾ったライブラリがmap使ってて、初期化宣言見ただけで”えっ”と思ってもう理解するの必須。
vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね?
何度も文献とかで確認しましたが、結局怖くて1つ1つイテレーター参照してますが。
ところで、map使うとプライマリキーみたいなのが必須ですよね?
キーがいる場合にはピッタリですが、開発途中でやっぱキーいらね、とかなったら、
とりあえず連番で埋めとけば良いわけですかね。
その時点でvectorかlistに差し替えかな。
>>668
線形リスト勉強しました。その頃C++どころかC初心者だったため、氏にました。
で、STLって何て便利なんだろう(これで使い方さえもう少し簡単であれば)って思ってまつ。
0681デフォルトの名無しさん
2008/02/15(金) 08:46:35>666
は間違いで、665です。
0682デフォルトの名無しさん
2008/02/15(金) 09:04:18データベースみたいな複雑なものじゃなくてただの写像ですよ。
電話帳みたいな何かと何かの対応表だと思えばいい。
パフォーマンスに関してはそれを理解してからでいいと思う。
>vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね?
多分大丈夫だけどやる必要ないならやらないに越したものはない。
>その時点でvectorかlistに差し替えかな。
パフォーマンス以前に用途が違うのでそのとおり。
>で、STLって何て便利なんだろう(これで使い方さえもう少し簡単であれば)って思ってまつ。
便利さを追求した結果こうなったんだろう。
ただしその上で、できるだけ簡単にはなってると思う。
0683デフォルトの名無しさん
2008/02/15(金) 09:56:51>>vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね?
多分じゃなくて大丈夫だけど、memcpy()などを自分で使うのはお勧めしない。潜在的なバグの原因になりかねない。
APIに渡すなどのように、必要に迫られたときに限定した方がいい。
0684デフォルトの名無しさん
2008/02/15(金) 10:18:400685デフォルトの名無しさん
2008/02/15(金) 10:38:330686デフォルトの名無しさん
2008/02/15(金) 10:39:27車輪の再開発とか言われたら嫌だから、既にあるものをなるべく使いたいです。
0687デフォルトの名無しさん
2008/02/15(金) 10:40:46に詳しい人いる?
0688デフォルトの名無しさん
2008/02/15(金) 10:42:54どんなことがやりたいの?
0689686
2008/02/15(金) 10:55:33CommaTextの入出力、iniファイルの1行処理のためのValues/Namesプロパティ、IndexOf、ファイル入出力メソッド、要素文字連結 etc..
0690デフォルトの名無しさん
2008/02/15(金) 11:11:00ここにそれなりに詳しく書かれてるよ
http://ja.wikipedia.org/wiki/%E8%B5%A4%E9%BB%92%E6%9C%A8
0691デフォルトの名無しさん
2008/02/15(金) 11:29:40組み合わせて使えばできそうな気がする。
boost.lambda
boost.string_algo
boost.tokenizer
ファイル入出力はfstreamとalgorithm使えばよし。
0692デフォルトの名無しさん
2008/02/15(金) 12:48:59を
typedef deque<int> vector_int;
に書き換えただけで、うちのソフトの体感速度が上がったw
処理速度アップ!ってバージョンアップ唄えるお( ^ω^)
0693デフォルトの名無しさん
2008/02/15(金) 13:02:15>typedef deque<int> vector_int;
kwsk
何が違うのか教えれ!
0694デフォルトの名無しさん
2008/02/15(金) 13:09:150695デフォルトの名無しさん
2008/02/15(金) 13:11:540696デフォルトの名無しさん
2008/02/15(金) 13:13:34確保すべきメモリ量が事前によく分からないなら、
vector より deque の方が圧倒的に効率的。
0697デフォルトの名無しさん
2008/02/15(金) 14:07:45std::dequeにしたら速くなるのかな
でもスマポのコピーは時間かかりそうだな...
0698デフォルトの名無しさん
2008/02/15(金) 14:11:040699デフォルトの名無しさん
2008/02/15(金) 14:16:410700デフォルトの名無しさん
2008/02/15(金) 14:18:420701デフォルトの名無しさん
2008/02/15(金) 14:20:57順番は、mapに登録した順番になっててくれますか?
0702デフォルトの名無しさん
2008/02/15(金) 14:23:46入れた順番は失われる
0703デフォルトの名無しさん
2008/02/15(金) 14:24:29Sort Criterionによる
0704699
2008/02/15(金) 14:27:50kwsk
ググっても出ません。
0705デフォルトの名無しさん
2008/02/15(金) 14:30:43m["foo"] = 0;
m["bar"] = 1;
と、
map<string, int> m;
m["bar"] = 1;
m["foo"] = 0;
で異なる挙動になるようにしたいって事だろ?
標準のmapではどうやっても不可能だと思う
0706699
2008/02/15(金) 14:35:07つまり、並び順が保障されるのは、vectorとdequeだけですかぁ。
0707デフォルトの名無しさん
2008/02/15(金) 14:37:310708デフォルトの名無しさん
2008/02/15(金) 14:42:34テンプレートパラメータかオブジェクトととして渡す
ソート基準による。
0709699
2008/02/15(金) 14:47:40vectorのヘルプ見てると、pos番目の要素をとるには[pos]ではなくて、at(pos)を使えと書いてありますね。
atを使わずに[]を使ってると、dequeに置き換えが出来なくなるわけでしょうか?
0710デフォルトの名無しさん
2008/02/15(金) 14:48:47違いはそれだけ
dequeにもoperator[]はあるから、その心配は要らない
0711デフォルトの名無しさん
2008/02/15(金) 16:19:32「Associative Containerじゃ駄目なんですか。じゃあSequenceにします」
が簡単に出来る場面というのが想像できない
0712デフォルトの名無しさん
2008/02/15(金) 16:29:560713デフォルトの名無しさん
2008/02/15(金) 17:07:05>>676のリンク先にも書いてあるけど、vectorとdequeのメンバ関数の違いは
・vectorにだけある……capacity() reserve()
・dequeにだけある……push_front() pop_front()
だけ。
いずれもメモリの連続性に関わるもので、前者が「あらかじめ確保しておく」系(dequeには要らない)、
後者が「先頭要素を出し入れする」系(vectorには高コスト過ぎ)。
0714695
2008/02/15(金) 17:11:30STLってキモカワイイね。
0715デフォルトの名無しさん
2008/02/15(金) 17:31:490716デフォルトの名無しさん
2008/02/15(金) 17:40:480717デフォルトの名無しさん
2008/02/15(金) 17:46:290718デフォルトの名無しさん
2008/02/15(金) 17:54:59vector(笑)
0719デフォルトの名無しさん
2008/02/15(金) 18:11:05コンテナとして使われてることを見ればわかるね。メモリ構造の違い
によってvectorは要素を削除した場合に絶対にメモリを解放しないが
dequeはチャンクの集まりだから不要なチャンクは解放されることが多い。
(これはstandardでは求められていないらしいが)
また、reallocateの際、vectorは全ての要素を移動する必要があるが
dequeは必ずしもそうはならない。同じ要素へのアクセスではvectorの
ほうが理論的には高速。dequeはメモリ構造上indirect accessとなるから。
このくらいしか気にしてないけど、結局は要素数と実測で決めることにしてる。
0720デフォルトの名無しさん
2008/02/15(金) 23:04:47次期C++ではinsert(iterator, value)の意味が変わって、
同順の要素の間で好きな場所に値を挿入できるようになる。
それまではstd::map<Key, std::deque<T> >でも使うしかないね。
0721デフォルトの名無しさん
2008/02/15(金) 23:27:40へぇ。知らなかった。
これか。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#233
0722デフォルトの名無しさん
2008/02/16(土) 00:04:14STLを専ら使うだけ?
0723デフォルトの名無しさん
2008/02/16(土) 00:18:21それはboostスレで。
0724デフォルトの名無しさん
2008/02/16(土) 12:16:370725デフォルトの名無しさん
2008/02/16(土) 12:27:05欲しければ立てれば?
0726デフォルトの名無しさん
2008/02/16(土) 12:42:44TMPと言ったって大概はSTL、Boostの範疇だし
0727デフォルトの名無しさん
2008/02/16(土) 12:45:39、^':::::::::::::::::::::::^vィ 、ヽ l / ,
l..:.::::::::::::::::::::::::::::イ = =
|.:::::::::::::::::::::::::::::: | ニ= 724そ -=
|:r¬‐--─勹:::::| ニ= な れ =ニ
|:} __ 、._ `}f'〉n_ =- ら で -=
、、 l | /, , ,ヘ}´`'`` `´` |ノ:::|.| ヽ ニ .:. も ニ
.ヽ ´´, ,ゝ|、 、, l|ヽ:ヽヽ } ´r ヽ`
.ヽ げ き 724 ニ. /|{/ :ヽ -=- ./| |.|:::::| | | ´/小ヽ`
= て っ な =ニ /:.:.::ヽ、 \二/ :| |.|:::::| | /
ニ く. と ら -= ヽ、:.:::::::ヽ、._、 _,ノ/.:::::| | /|
= れ.盛 -= ヽ、:::::::::\、__/::.z:::::.:| |' :|
ニ る り =ニ | |:::::::::::::::::::::::::::::::::::.|'.:Y′ト、
/, : 上 ヽ、 | |::::::::::::::::::::::::::::::::::::_:::::_::| '゙, .\
/ ヽ、 | |:::::::::::::::::::::::::::::::::::.|:::::::|.ト、 \
/ / 小 \ r¬|ノ::::::::::::::::::::::::::::::::::::::::::::::::| \
0728デフォルトの名無しさん
2008/02/16(土) 12:46:16http://pc11.2ch.net/test/read.cgi/tech/1203133502/
0729デフォルトの名無しさん
2008/02/16(土) 14:03:50甘いな
0730デフォルトの名無しさん
2008/02/16(土) 18:04:090731デフォルトの名無しさん
2008/02/16(土) 18:10:33char_traits とか。
0732デフォルトの名無しさん
2008/02/16(土) 20:53:060733デフォルトの名無しさん
2008/02/16(土) 22:54:480734デフォルトの名無しさん
2008/02/16(土) 22:55:470735デフォルトの名無しさん
2008/02/16(土) 23:00:210736デフォルトの名無しさん
2008/02/17(日) 13:45:21大丈夫ですか?
0737デフォルトの名無しさん
2008/02/17(日) 13:49:270738デフォルトの名無しさん
2008/02/17(日) 14:49:070739デフォルトの名無しさん
2008/02/17(日) 15:05:58http://msdn2.microsoft.com/ja-jp/library/c9ceah3b(VS.80).aspx
0740デフォルトの名無しさん
2008/02/18(月) 14:53:30ある文字を指定個数分返してくれるメソッド。
0741デフォルトの名無しさん
2008/02/18(月) 15:08:120742デフォルトの名無しさん
2008/02/18(月) 15:09:32あやうくfor文で回すところですた。
0743デフォルトの名無しさん
2008/02/18(月) 18:28:13STLの中でメタプログラミングの要素があるのは
iterator_traitsとiterator_tagを使ったディスパッチくらいかな。
0744デフォルトの名無しさん
2008/02/18(月) 18:33:37関数テンプレートのオーバーロードを利用した
ランダムアクセスとその他の振り分けか。
でもほとんど使ったことないなあ。
0745デフォルトの名無しさん
2008/02/18(月) 19:36:190746デフォルトの名無しさん
2008/02/18(月) 19:43:450747745
2008/02/18(月) 19:44:020748デフォルトの名無しさん
2008/02/18(月) 19:46:410749デフォルトの名無しさん
2008/02/18(月) 20:07:40std::vector なら v.insert(v.begin() + 5, value);
とかかな。要素数が最低5個は存在してないとマズイから。
v.size()で要素数調べる必要はあるか。
>>746
そういう意味では使うこともあるなあ。
本では読んだけど自分で書いたことはないな。
0750745
2008/02/19(火) 08:35:45あ、イテレーターって足し算できるんですね。
勉強になりました。
0751デフォルトの名無しさん
2008/02/19(火) 11:13:440752745
2008/02/19(火) 11:15:48(dequeは無理と)
0753デフォルトの名無しさん
2008/02/19(火) 11:35:470754745
2008/02/19(火) 11:42:150755デフォルトの名無しさん
2008/02/19(火) 11:46:41こいつらでは、インクリメントやデクリメントを繰り返す必要がある。
そんなときはstd::advanceなんていう関数が既に用意されている、もちろんO(N)。
vectorは、要素のメモリアドレスの連続が保障されているので、
組込の配列やmallocなんかで確保したメモリと同じように使えるという点が決定的にほかと違う。
例えばC用のAPIに渡すバッファなんかにも使える。
0756745
2008/02/19(火) 11:53:08その通りなんですが、上レス読むと、やっぱふつーはイテレーター使えって逝われてるじゃん。
0757デフォルトの名無しさん
2008/02/19(火) 12:00:24std::vector<int> v;
if (v.begin() + 5 > v.end()) v.resize(5);
を実行したら、VS2008 では Debug Assertion Failed! で落ちた。
v.end() を越えるような vector::itrator::opearator+() の結果に対して、
_SCL_SECURE_VALIDATE_RANGEマクロが範囲外を検出して例外を起こしている。
言いたいことはわかるが、融通利かせてほしい。
0758デフォルトの名無しさん
2008/02/19(火) 12:03:22vector<int>って直書きしないとちょっと恐いな。
0759デフォルトの名無しさん
2008/02/19(火) 12:05:37そうだから、vectorで要素へのポインタを使うのはchar*な引数に渡すなんて使い方くらいだね。
0760デフォルトの名無しさん
2008/02/19(火) 12:06:050761デフォルトの名無しさん
2008/02/19(火) 12:13:51組み込み配列だって要素数超える足し算は未定義動作なんだぜ。 assert() が
入ってる分ありがたいぐらいだ。
0762デフォルトの名無しさん
2008/02/19(火) 12:32:11イテレータをインクリメントするコストはコンテナによって違うと思うのですが、
STL解説サイトなどで、そのことについて触れているのをみかけません。
速度を知りたければ、実装毎にテストして計るしかないのでしょうか?
0763デフォルトの名無しさん
2008/02/19(火) 13:08:30実際の速度(具体的な処理時間)を知りたいのならそれでいいんじゃね?
ソースやアセンブル結果を見て見当をつけても良いけど。
0764デフォルトの名無しさん
2008/02/19(火) 13:08:44std::map<std::string,int> mp;
mp["key000"]=0;
とすると、「stringに>演算子がない」ってエラーが出るんだが、これって標準C++準拠の正しいエラーなのかな?
それともVC++2005のstringの方がおかしいのかな?
ネットで検索した時に普通にstd::stringをキーにしてるソースあったんで、問題ない書き方だとは思うんだが。
0765デフォルトの名無しさん
2008/02/19(火) 13:13:37折角ソースがあるんだから読めばいいんじゃね?
0766デフォルトの名無しさん
2008/02/19(火) 13:18:50標準準拠である確信は無いけど、g++-4.2.3では普通に使えた
0767デフォルトの名無しさん
2008/02/19(火) 13:31:04VS2005でその二行を今書いているコードにペーストしてビルドしたけど、普通に通ったよ。
0768デフォルトの名無しさん
2008/02/19(火) 13:32:00エラーメッセージを変に略さずに、そのまま晒したり Google に放り込むと、
なにか余計なことをしているのが見つかるかもしれない。
0769デフォルトの名無しさん
2008/02/19(火) 13:38:220770デフォルトの名無しさん
2008/02/19(火) 13:38:42#include "stdafx.h"
#include <map>
#include <string> ←これをコメントアウトすると、「stringに>演算子がない」ってエラーが出る
int _tmain(int argc, _TCHAR* argv[])
{
std::map<std::string,int> mp;
mp["key000"]=0;
return 0;
}
0771764
2008/02/19(火) 13:45:41#include <string>が抜けてただけでした。
お騒がせして申し訳ないです。
0772762
2008/02/19(火) 14:07:09どうもです。
ソース見て見当つけるの難しいですね(if文のコストとポインタ代入のコストの比率がどのぐらいになるのかとかさっぱりです)。
c++の制御文や演算のコストについて、本などでほとんど目にしないのですが、皆さんはどうやって勉強されました?
0773デフォルトの名無しさん
2008/02/19(火) 14:20:26環境によって違うんだから、ある程度一般化せざるをえない本なんかで「勉強」するのは
無理だろ。
速度が要るプログラム組むときに、いろんなコードに対応するアセンブリを見て経験的に
身に付けるのがいいんじゃね?
環境が変われば結果が変わるということにも気をつけないといけない。
0774762
2008/02/19(火) 14:47:14なるほど。
経験的に身につけていくしかないですか。
速度見積もるのに技術がいる上、環境で変わることを考えると、
速度はあまり気にせず、プロファイリングしてからボトルネックとなっている部分だけ考えるのがいいんでしょうね。
0775デフォルトの名無しさん
2008/02/19(火) 14:55:080776デフォルトの名無しさん
2008/02/19(火) 15:00:480777デフォルトの名無しさん
2008/02/19(火) 16:31:26iteratorなんか使うと最適化してくれないし。
0778デフォルトの名無しさん
2008/02/19(火) 16:34:19まあ、こういう細かい部分を気にするのは悪いことじゃないよね。
でもそれはC++の勉強ではなくて、ターゲット環境のしくみを先に勉強した方が良いよ。
CPUがC++で作ったコードをどう処理するのか、とかさ。
昔みたいにクロック数を数えれば分かるような簡単な時代じゃないけど、
その疑問に答えるためには、結局そのあたりの知識が必要だから。
0779デフォルトの名無しさん
2008/02/19(火) 17:38:290780デフォルトの名無しさん
2008/02/19(火) 17:59:00やっぱり、本物の数値演算には valarray は使い物になりませんか?
0781デフォルトの名無しさん
2008/02/19(火) 18:00:280782デフォルトの名無しさん
2008/02/19(火) 19:57:54理論的な計算量のオーダーだけは気にしておいた方がいい。
O(N^2)の処理をやっている場所やO(N)の処理を繰り返す場所があったら
適切なコンテナやアルゴリズムを選定することを考えるべき。
結果的にはmapやsetを使うよりvectorを毎回検索、ソートした方が
速いというケースはあるけど、チューニングする以前のエイヤッと決める段階では、
理論的に速いアルゴリズムを選んでおいた方が無難。
0783デフォルトの名無しさん
2008/02/19(火) 21:41:57つーか、C++自体が使い物にならなったりする。
ヌパコン屋はFortranしか本気でコンパイラを使ってない。
0784デフォルトの名無しさん
2008/02/19(火) 21:42:40×使ってない
○作ってない
0785デフォルトの名無しさん
2008/02/19(火) 21:45:54並列化コンパイラの作りやすい Fortran を作りたがるのかもね。
言語仕様も単純で作りやすいし。
0786デフォルトの名無しさん
2008/02/19(火) 22:00:50vectorのイテレータが有効なイテレータかどうか調べる方法を教えてください。
0787デフォルトの名無しさん
2008/02/19(火) 22:04:23ポインタが有効なポインタかどうか調べる方法を教えてください。
と同じく、ありません。
0789デフォルトの名無しさん
2008/02/19(火) 22:34:26大小比較演算子使えるなら簡単になる。
当然、親となる配列が固定されていないと無理だが。
でも、こういうことしていいのかは微妙。
有効に見えるけど、指してる所が違うとかありうるし。
0790786
2008/02/19(火) 22:40:03こんな感じでやっていたのですがこれでいいのか不安でした。
0791デフォルトの名無しさん
2008/02/19(火) 22:42:01それで一応どこか有効な要素は指してるかもしれないが、
「元々指していた箇所から決して動いていない」
ということまでは保証してくれない。
0792デフォルトの名無しさん
2008/02/19(火) 23:00:47そのコードを実行してよい事前条件が、まさに itr が有効なイテレータであることなので
0793デフォルトの名無しさん
2008/02/19(火) 23:43:39reallocateされた場合どうすんのよ?
0794デフォルトの名無しさん
2008/02/19(火) 23:55:310795デフォルトの名無しさん
2008/02/20(水) 00:12:26セントルイス・カージナルス対アトランタ・ブレーブスだった。
0796デフォルトの名無しさん
2008/02/20(水) 09:16:18>vec.begin() < itr && itr < vec.end()
自分もこれに関する情報欲しい。
良い記述があれば教えてキボン!
0797デフォルトの名無しさん
2008/02/20(水) 09:26:21プログラムを考え直した方がよいような
0798デフォルトの名無しさん
2008/02/20(水) 09:35:170799デフォルトの名無しさん
2008/02/20(水) 09:36:58で対象をproxyにしてis_valid()でも持たせたら?
0800デフォルトの名無しさん
2008/02/20(水) 09:44:220801デフォルトの名無しさん
2008/02/20(水) 10:16:450802デフォルトの名無しさん
2008/02/20(水) 10:25:13本当に「取得した直後」なら、i != vec.end()でいいのでは。
0803デフォルトの名無しさん
2008/02/20(水) 10:35:54絶対あってる?保障してくれる?
0804デフォルトの名無しさん
2008/02/20(水) 11:09:57どんな手段で取得した直後を想定しているの?
0805デフォルトの名無しさん
2008/02/20(水) 11:10:480806デフォルトの名無しさん
2008/02/20(水) 11:12:200808デフォルトの名無しさん
2008/02/20(水) 11:16:06本人からすると、ここで質問することだって調べる気でしょ。
そういう破壊的なことするのは良くないお( ^ω^)
0809デフォルトの名無しさん
2008/02/20(水) 11:20:42>>745に書いてあるのは「取得したあとにやりたいこと」。
質問は「どんな手段で取得した直後を想定しているのか」だ。
0810803
2008/02/20(水) 11:30:31ですから、
vector::insertするためにはイテレーターが要りますよね?
で、item[6] としてイテレーターを取得したときに、そのイテレーターは有効なのか無効なのか、という判定。
0811デフォルトの名無しさん
2008/02/20(水) 11:51:08イテレータを取得する前に検査すべき。
例えば、std::vector<int> foo(5); std::vector<int>::iterator it = foo + 6;の結果は鼻から悪魔。
0812デフォルトの名無しさん
2008/02/20(水) 11:54:57item[6] ではイテレータを取得できないと思うよ
item.begin() + 6 のことか?
itemの6番目の要素が存在するなら、当然有効だし、
存在しないなら、何が返ってこようかくるまいが item.begin() + 6 を実行した時点でアウト
0813デフォルトの名無しさん
2008/02/20(水) 11:58:27よくわからんが、こういうことか?
void foo(vector<int>& v, int index) {
vector::iterator iter = v.begin() + index; // この iter は有効か判断したい.
v.insert(iter, 5);
}
ならば、こう書けば良い
void foo1(vector<int>& v, int index) {
if (v.size() < index) v.resize(index); // iterが必ず有効になるように、事前にvectorを拡大する.
vector::iterator iter = v.begin() + index;
v.insert(iter, 5);
}
void foo2(vector<int>& v, int index) {
if (v.size() < index) throw std::invalid_argument("index が大き杉"); // 範囲外なら例外を投げる.
vector::iterator iter = v.begin() + index;
v.insert(iter, 5);
}
0814デフォルトの名無しさん
2008/02/20(水) 12:15:16作ること自体が違法だったり、作った後に無効になったりするのなら分かるんだが・
0815810
2008/02/20(水) 12:20:17やりたいことは、
ある行の後に1行追加したい、
だから、foo1でできるのはできます。
でも、ある行の後に1行追加するメソッドくらい、std::vectorとかが標準で持ってて欲しいと思うお。
0816デフォルトの名無しさん
2008/02/20(水) 12:33:35却下だな。
- 勝手に resize() するなら、途中の要素を何で埋めるか指定しないといけない。
- 挿入位置は iterator で指定するのが標準コンテナの流儀なのに、この場合だけ
インデックスで指定するのはおかしい。
- vector のメンバにしてもユーザーが実装しても効率などは変わらない。
標準で持っていたほうがいい理由が何も思いつかない。
0817デフォルトの名無しさん
2008/02/20(水) 12:35:35作った直後のイテレータは、コンテナの中身を指しているか、end()と等値か、だよな。
だからこっちは「本当に作った直後なら、!= vector.end()との比較でいい」って言ってるのに、
この質問者、「自分の訊きたいこと」と「自分の訊いていること」を一致させられないんだよ。
0818デフォルトの名無しさん
2008/02/20(水) 12:57:08結果的に再取得したほうが良かったりして。
0819786
2008/02/20(水) 13:51:57実際はイテレータじゃなくてただのインデックスでした。
0<=index<vec.size()
で十分でした。
イテレータの場合は持ってる間vectorを変更しないようにしています。
0820デフォルトの名無しさん
2008/02/20(水) 13:53:280821デフォルトの名無しさん
2008/02/20(水) 14:18:16う゛ーう゛ー
0822デフォルトの名無しさん
2008/02/20(水) 14:20:360823デフォルトの名無しさん
2008/02/20(水) 16:22:140824デフォルトの名無しさん
2008/02/20(水) 16:30:10vector にはいらないけどさ
0825デフォルトの名無しさん
2008/02/20(水) 16:37:03list本体が破棄された場合と、イテレータ先がeraseされた
時だけでしょうか?
0826デフォルトの名無しさん
2008/02/20(水) 16:46:18後から加わった上位概念(イテレータ)を使わずとも、下位概念のやり方で各要素を見ていける、
だから「必須ではない」・・・という意味では、無くてもいいかもね。
実際には、stringやlistがbegin() end()してる中、vectorだけ&vec[0]とか使ってポインタでいじるのは
えらく不自然だから、vectorもイテレータで扱ってしまうけれども。
0827デフォルトの名無しさん
2008/02/20(水) 18:04:53合ってる(要素を消す関数はerase()以外にもあるけど)。あと標準には
list1.splice(list2);
するとlist2へのイテレータが全部無効になる、と書いてあるけど、
実際にはほぼ間違いなくlist1への有効なイテレータになる。
これは標準の方が訂正される可能性が高い。
0828デフォルトの名無しさん
2008/02/20(水) 19:40:59返答ありがとうございます。
listに要素追加したときイテレータを保存しておいて、
それを別なコンテナでインデックス化するってな使い方を
しても大丈夫そうですね。
spliceの
>実際にはほぼ間違いなく
ってところはちと怖いので、使用は避けときます。
0829デフォルトの名無しさん
2008/02/20(水) 21:01:56最新のドラフトだと 「移動した要素を指し続ける」 と書いてあるね。
0830デフォルトの名無しさん
2008/02/20(水) 21:36:58Section: 23.2.3.4 [list.ops] Status: WP Submitter: Brian Parker Date: 2000-07-14
void splice(iterator position, list<T, Allocator>& x);
invalidates all iterators and references to list x.
This is unnecessary and defeats an important feature of splice. In fact, the SGI STL guarantees that iterators to x remain valid after splice.
WPってWorking Paperってなってるけど一度却下されてるんだよね。
で、最新のドラフトだとC++0xで修正されることは決定?
WP The proposed resolution has not been accepted as a Technical Corrigendum, but the full WG21 committee has voted to apply the Defect Report's Proposed Resolution to the working paper.
0831デフォルトの名無しさん
2008/02/20(水) 21:44:2423.2.3.4 list operations
void splice(const_iterator position, list<T, Allocator>&& x);
4 Effects: Inserts the contents of x before position and x becomes empty.
Pointers and references to the moved elements of x now refer to those same elements
but as members of *this.
Iterators referring to the moved elements will continue to refer to their elements, ← ここ
but they now behave as iterators into *this, not into x.
0832デフォルトの名無しさん
2008/02/20(水) 21:49:020833デフォルトの名無しさん
2008/02/20(水) 21:53:24Working Draftか。
そうなりそうだね。
0834デフォルトの名無しさん
2008/02/20(水) 22:02:47list の splice は,標準ライブラリへの move の本格導入以前から,
auto_ptr と並ぶ標準ライブラリにおける move の代名詞だったような?
現行の規格が不必要に制限が強すぎた
(iterator の stability を保証しなかった) だけで,
move 導入とは直接関係ないんじゃないですかね?
>>831の splice の第2引数が右辺値参照型に変更されたのも
単に一時変数を渡すことができるようにしただけでしょうし.
0835デフォルトの名無しさん
2008/02/20(水) 22:05:17これが一番インパクトでかいかな。
0836デフォルトの名無しさん
2008/02/20(水) 22:07:390837デフォルトの名無しさん
2008/02/20(水) 22:07:54const Widget operator+(Widget, Widget)
とかしてたものが
Widget&& operator+(Widget, Widget)
になるのか。
0838デフォルトの名無しさん
2008/02/20(水) 22:08:37そのせいで左辺値参照でいい状況でもムーブが発生するのが微妙だな。
0839デフォルトの名無しさん
2008/02/20(水) 22:26:14>>837
Widget の実装と operator+ の機能によりますけれど
値で返すのと参照で返すのでは基本的に意味が違ってしまうのでは?
で, move の恩恵を受けたければ Widget を move 可能にした上で
Widget operator+(Widget, Widget)
となるのが一般的かと思います.
>>838
>そのせいで左辺値参照でいい状況でもムーブが発生するのが微妙だな。
その微妙になる具体例ってどんなのがありますかね?
0840デフォルトの名無しさん
2008/02/20(水) 22:37:12右辺値参照の場合
1. l2 -> x のムーブ
2. x のノードを l1 に付け替える
左辺値参照の場合
1. l2 のノードを l1 に付け替える
0841デフォルトの名無しさん
2008/02/20(水) 22:42:46戻り値をWidgetにしてしまうと代入できてしまうので
constをつけてるんだけど、
@const Widget operator+(const Widget&, const Widget&);
AWidget&& operator+(const Widget&, const Widget&);
現在は@のようにしてるけど、C++0xからはAでいいかなと思った。
どちらも
Widget w1, w2, w3;
if( (w1 = w2) = w3 )
のようなケアレスミスをコンパイルエラーにしてくれると思ったけど、
Aだと (w1 = w2) = w3 はOKになってしまうか。右辺値参照に左辺値
は代入できるか。
0842デフォルトの名無しさん
2008/02/20(水) 22:44:44と書いた場合、const Widget はムーブできるのか?
0843デフォルトの名無しさん
2008/02/20(水) 22:44:56>838 じゃないけど。
値渡しにした段階でコピーが発生しちゃうから、
Widget&& operator+(Widget&&, Widget&&);
Widget&& operator+(Widget&&, const Widget&);
Widget&& operator+(const Widget&, Widget&&);
Widget operator+(const Widget&, const Widget&);
頑張るんならこうなるんじゃないの?
std::string の operator+() はこうなってるが。
あと、微妙ってのは左辺値参照なら単純にアドレス渡すだけで済んだものが、ムーブ処理が発生しちゃうのが嫌ってことなんじゃないかと。
で、↑はそのためにオーバーロードしてるけど。
0844デフォルトの名無しさん
2008/02/20(水) 22:46:52引数のl2は右辺値という前提だよね。そうするとmoveの分だけ効率が
悪くなるということかな。
0845デフォルトの名無しさん
2008/02/20(水) 22:51:32ん?メイヤーズの本で推奨されてたから従ってる。
>>843
ドラフト見たところでは、例えば
Widget&& operator+(Widget&& lhs, const Widget&& rhs);
の場合、両方の実引数にWidgetの一時オブジェクトを
渡すとlhsとrhsは右辺値になって、両方に左辺値を渡すとlhsとrhsは
左辺値になるという理解でいい?
0846デフォルトの名無しさん
2008/02/20(水) 22:55:53現行の list の splice の意味からすると,
splice という名前に前者の操作を overload させると混乱するのでは?
前者は最新の working draft に従えば,例えば
l1.splice(it,decltype(l2)(move_iterator(l2.begin()),move_iterator(l2.end())));
と書けると思いますけれど,これではダメなのですか?
あと,「左辺値参照の場合……」「右辺値参照の場合……」という書き方を
されていますけれど, l2 の型が右辺値参照型か左辺値参照型か,ということですか?
もしそうだとすると,l2 はそのままでは常に左辺値として扱われるので,
void splice(iterator, list<T,A>&);
と
void splice(iterator, list<T,A>&&);
があった場合には, l2 が右辺値参照型か左辺値参照型かに関わらず
常に前者が呼ばれると思います.
0847デフォルトの名無しさん
2008/02/20(水) 23:00:250848デフォルトの名無しさん
2008/02/20(水) 23:03:20一時オブジェクトに対するメンバ関数呼び出しの overload は
右辺値参照型の *this への拡張が対応するかと思います.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm
例えば,右辺値に対して Widget::operator=(const Widget&) を禁止したければ
class Widget{
Widget& operator=(const Widget&) & { ... }
Widget& operator=(const Widget&) && = delete;
...
}
上記のようになるかと思います.従って Effective C++ にある>>845の記述は
C++0x では deprecated になるかと思います.
0849デフォルトの名無しさん
2008/02/20(水) 23:06:33move はそのソース (move 元) に対して破壊的操作を行うことになるので
戻り値に対して const を指定しているとその戻り値に対して
move を行うことはできなくなると思います.
Widget& Widget::operator=(const Wideget&); // copy assignment
と
Widget& Widget::operator=(Wideget&&&); // move assignment
があった場合,>>842の operator+ の戻り値に対しては
オーバーロードの優先順位を解決した結果, copy assignment が呼ばれるかと.
0850デフォルトの名無しさん
2008/02/20(水) 23:06:55for(i=0; i < num; i++){
foo += v[i];
}
みたいなの。
vectorの先頭をポインタに渡してポインタ経由でアクセス
>>>>>>vectorを[]でアクセス>>>vector をiteratorでアクセス=dequeをiteratorでアクセス
>>>>>>>(越えられない壁)>>>>>>dequeを[]でアクセス
dequeがあればvectorはいらない子みたいなカキコがあったけど、やっぱvectorはやればデキる子だよ。
0851デフォルトの名無しさん
2008/02/20(水) 23:15:29ありがとうございます.微妙な具体例が理解できました.
これを気にするならば overload 頑張るしかないですね.
0852デフォルトの名無しさん
2008/02/20(水) 23:18:07沢山あると大変だね。
0853デフォルトの名無しさん
2008/02/20(水) 23:27:12引数が一時オブジェクトで,その一時オブジェクトのバッファが
結合後の文字列を保持できる余裕がある場合に,
バッファの再確保を回避できる最適化を積極的に活用できる
というのもあるかと思います.
0854デフォルトの名無しさん
2008/02/20(水) 23:34:05元々 splice は move (破壊的コピー) を行うという意味づけであり
右辺値と左辺値を区別する必要はなく,
void splice(iterator, list<T,A>&);
と
void splice(iterator, list<T,A>&&);
をオーバーロードする必要もないと自分は思います
(し,おっしゃるとおり working draft も今のところそうなっています)
0855デフォルトの名無しさん
2008/02/20(水) 23:35:07vectorアクセスするのにiterator経由より[]の方が速いって謎すぎる。
何らかの理由で最適化に失敗してるか、assertが効いてるんじゃ?
0856デフォルトの名無しさん
2008/02/20(水) 23:48:29最適化オプション何もなしだお
0857デフォルトの名無しさん
2008/02/20(水) 23:49:40ちなみに、倍速くらい
ポインタにすると[]のさらに倍
ちなみにdequeの[]はvectorの[]の4倍遅い
0858デフォルトの名無しさん
2008/02/20(水) 23:50:030859デフォルトの名無しさん
2008/02/20(水) 23:50:180860デフォルトの名無しさん
2008/02/20(水) 23:54:000861デフォルトの名無しさん
2008/02/20(水) 23:57:15最適化しない場合の影響を調べるのでもない限りは。
0862デフォルトの名無しさん
2008/02/21(木) 00:05:39展開される。実際、gcc3.4.6 -O2ではそう。
0863デフォルトの名無しさん
2008/02/21(木) 00:24:53ブロック間でindirect accessが発生するから、要素へのアクセス
とiteratorの操作はvectorより遅くなるというのが一般論。
0864デフォルトの名無しさん
2008/02/21(木) 00:35:31ほほう。結局、
void splice(iterator pos, list<T,A>&& l2);
この場合、l2に右辺値(一時オブジェクト)を渡そうが
左辺値を渡そうが、l2は常に左辺値として扱われるという
ことだよね?この仕様変更のメリットとしては、右辺値も
渡せるということかね。
0865デフォルトの名無しさん
2008/02/21(木) 00:47:02splice の定義内では,明示的にキャストをかけるか
std::move を使うかしないと l2 は左辺値として扱われると思います.
>この仕様変更のメリットとしては、右辺値も渡せるということかね。
自分はそう理解していたので>>834のように書きました.
右辺値が渡せるので>>846に書いたような
l1.splice(it,decltype(l2)(move_iterator(l2.begin()),move_iterator(l2.end())));
みたいなコードも通るようになります.
0866デフォルトの名無しさん
2008/02/21(木) 00:50:32後半は漏れの理解不足で分からんけど、アリガトン。
0867デフォルトの名無しさん
2008/02/21(木) 00:55:32すいません.
l1.splice(it,list<int>(l2.begin(),l2.end()));
みたいなコードも通るようになるといいたかったんです.
といいますか>>846のとかこれの場合は insert で良いですね……orz
0868デフォルトの名無しさん
2008/02/21(木) 01:37:08いえいえ。
move_iteratorとか見たことなかったので漏れの理解不足というより
知識不足だった。範囲指定のコンストラクタで一時オブジェクト
をそのまま渡すことができると。
それが、l1.insert(it, l2.begin(), l2.end());で可能だったという
こっですね。
0869デフォルトの名無しさん
2008/02/21(木) 10:09:34>vector::iterator iter = v.begin() + index;
やっぱ、イテレーターとるときってbegin()で取るのが正しいのか。
>vector::iterator iter = &v[index];
ってのはダメ?
ってか、おk、だったとしてもvectorとdequeでしか通用しないBADな書き方?
0870デフォルトの名無しさん
2008/02/21(木) 10:21:31全てのSTL実装でコンパイルが通る保証はない。
0871デフォルトの名無しさん
2008/02/21(木) 10:27:49つまり、書き方という問題じゃなくて、使ってるSTLの実装上たまたまコンパイルエラーが出ないだけなんだね。
すげー賢くなったお( ^ω^)
0872871
2008/02/21(木) 10:30:40実行時エラーじゃなくて、コンパイルエラーなのは好感( ^ω^)
0873デフォルトの名無しさん
2008/02/21(木) 12:52:05ただ、end相当の&v[v.size()]は未定義だから、&v[0] + v.size()を使えって話があった気もする。
0874デフォルトの名無しさん
2008/02/21(木) 12:58:440875デフォルトの名無しさん
2008/02/21(木) 13:01:28これはvectorに限らずあらゆるコンテナで可能だろ
0876デフォルトの名無しさん
2008/02/21(木) 13:08:380877デフォルトの名無しさん
2008/02/21(木) 13:09:09dequeでコンパイルエラー出たけど、気のせい?
もうテストコード消しちゃったお。
0878デフォルトの名無しさん
2008/02/21(木) 13:11:06釣りですか?
0879デフォルトの名無しさん
2008/02/21(木) 13:17:540880デフォルトの名無しさん
2008/02/21(木) 13:37:04operator[]を持っていて、value_typeがintであるような、あらゆるコンテナのインスタンスについて可能、と言いたかった
0881デフォルトの名無しさん
2008/02/21(木) 13:55:22vectorのポインタの場合は、配列の要素を指すポインタの如く、
ポインタ演算を使用してそのvectorインスタンスの保持する他の要素も参照できると言えばいいか。
0882デフォルトの名無しさん
2008/02/21(木) 13:58:460883デフォルトの名無しさん
2008/02/21(木) 14:03:08で、これは?
0884デフォルトの名無しさん
2008/02/21(木) 15:09:32指してる先にアクセスしなきゃ大丈夫でしょ。
0885デフォルトの名無しさん
2008/02/21(木) 15:30:22使用することは規格で認められていた記憶がある。
これが正しければ &v[v.size()] は有効だと思う。
0886デフォルトの名無しさん
2008/02/21(木) 15:30:54ダウト。
0887デフォルトの名無しさん
2008/02/21(木) 15:31:470888デフォルトの名無しさん
2008/02/21(木) 15:56:50その式は右から評価するからアウト
0889デフォルトの名無しさん
2008/02/21(木) 16:01:43vectorのoperator []は多重定義された関数なのだから、それとは別に規定があるはず。
と思ってX 3014見てみたが、23.1.1 列の中で参照されている表68に
a[n]は*(a.begin() + n)と書かれているがそれ以上は何もない。
もちろん、atはn >= a.size()のときにout_of_rangeを送出と書いてあるけど。
0890デフォルトの名無しさん
2008/02/21(木) 16:23:53v[v.size()]の時点で鼻から悪魔確定だろ
0891デフォルトの名無しさん
2008/02/21(木) 16:27:30なんで?
0892デフォルトの名無しさん
2008/02/21(木) 16:29:38なんで?
0893デフォルトの名無しさん
2008/02/21(木) 16:36:28a.begin() + n は dereferenceable ではないので
これを dereference した時点で規格としては undefined behavior,
でよいのでは?
0894デフォルトの名無しさん
2008/02/21(木) 16:48:510895デフォルトの名無しさん
2008/02/21(木) 16:51:250896デフォルトの名無しさん
2008/02/21(木) 17:25:46No
アドレス演算子&はオペランドが[ ]演算子の結果の場合、単項&演算子と
[ ]演算子が暗黙に意味する単項*演算子は評価されず、&演算子を削除し
[ ]演算子を+演算子に変更した場合と同じ結果となる。
つまり、&v[v.size()] は v + v.size() に評価されるのであって、
&(*(v + v.size)) とは評価されない。
0897デフォルトの名無しさん
2008/02/21(木) 17:27:38C言語もあまり詳しくないだろ?K&Rにも、>>885が正しいことは書いてある。
かつ、C++でも同じ。
0898デフォルトの名無しさん
2008/02/21(木) 17:44:24それはポインタについてじゃないのか
>>889も言ってるが、vectorの[]や、vectorのイテレータの+と*は単なる関数かもしれない訳で、
ポインタについての規定がそのままあてはまるとする理由はないだろ
0899デフォルトの名無しさん
2008/02/21(木) 18:01:340900デフォルトの名無しさん
2008/02/21(木) 18:47:36そのとおりだ。ポインタの話しと思ってた。
0901デフォルトの名無しさん
2008/02/21(木) 18:52:150902デフォルトの名無しさん
2008/02/21(木) 22:31:04ごめんなさい
0903デフォルトの名無しさん
2008/02/21(木) 22:33:11僕もです。
0904デフォルトの名無しさん
2008/02/21(木) 23:01:290905デフォルトの名無しさん
2008/02/22(金) 00:39:140906デフォルトの名無しさん
2008/02/22(金) 08:41:26複数ファイルイメージみたいなのをバッファに持っておきたいばあいは、
みなさんどうされてます?
void*?char*?
やっぱ、vector <char*>みたいな感じ?
0907906
2008/02/22(金) 08:54:20vector <string>の方が良いかなぁ?
0908906
2008/02/22(金) 09:30:490909デフォルトの名無しさん
2008/02/22(金) 10:05:33テキストファイルである保証があるなら兎も角、普通はvector<string>はつかわんだろ。
つーか、ファイルの内容によって違うものを一般化されても困る。
0910906
2008/02/22(金) 10:06:37TMemoryStremaみたいなのが欲しいんです。
0911デフォルトの名無しさん
2008/02/22(金) 10:08:23なにをやりたいか判ればもっと適当な方法もあるかもしれないけど。
0912デフォルトの名無しさん
2008/02/22(金) 10:08:310913906
2008/02/22(金) 10:27:17おk。
ファイルのロードとか要りますよね。
出来上がったクラスが標準だったり、ネットに転がってて欲しい。
0914デフォルトの名無しさん
2008/02/22(金) 10:40:03STLの使い方を提示されたんだから、後は自分で勝手に実装すればいいだろ。
0915デフォルトの名無しさん
2008/02/22(金) 10:46:030916デフォルトの名無しさん
2008/02/22(金) 10:55:170917デフォルトの名無しさん
2008/02/22(金) 11:00:59あのさ、先日からC++BuilderのVCLを移したいみたいだけどさ
STLはVCLと範疇が違うんだから、ファイルロードだのなんだのは
自分でやってくれるかな。
0918デフォルトの名無しさん
2008/02/22(金) 13:53:18>vector<vector<char> >
をカプセル化した便利なクラスだけでも教えてorz
0919デフォルトの名無しさん
2008/02/22(金) 13:54:320920デフォルトの名無しさん
2008/02/22(金) 13:57:18namespace oven = pstade::oven;
std::size_t n;
std::vector<std::vector<char> > v;
v.reserve(n);
for (std::size_t i = 0; i < n; ++i)
{
std::ifstream is(...);
v.push_back(oven::file_range<char>(...) | oven::copied);
}
0921デフォルトの名無しさん
2008/02/22(金) 14:00:540922デフォルトの名無しさん
2008/02/22(金) 14:56:030923デフォルトの名無しさん
2008/02/22(金) 15:03:550924デフォルトの名無しさん
2008/02/22(金) 15:06:510925デフォルトの名無しさん
2008/02/22(金) 15:12:43構造体まわりはSTLで完璧ですが。
で、文字列まわりは何使えば良いですか?
ってstringしか無いじゃん。
あー、ハイパーなstringのソース落ちてないかなぁ。
0926デフォルトの名無しさん
2008/02/22(金) 15:17:240927デフォルトの名無しさん
2008/02/22(金) 15:18:47何もしないデータの塊にはstruct使ってます。
変ですか?
0928デフォルトの名無しさん
2008/02/22(金) 15:21:17試してみましたが、やっぱ、.c_str() 付けないとコンパイル通りませんね。
これくらい標準にして欲しいお。
0929デフォルトの名無しさん
2008/02/22(金) 15:36:000930デフォルトの名無しさん
2008/02/22(金) 15:42:260931デフォルトの名無しさん
2008/02/22(金) 15:57:450932デフォルトの名無しさん
2008/02/22(金) 16:13:44boostでよければboost.string_algoに色々あるしSTLにこだわる必要はないだろ。
boost.string_algoなら>>922はboost::algorithm::ilexicographical_compare。
ところでstricmp/strcmpiって標準だっけ?
0933デフォルトの名無しさん
2008/02/22(金) 16:49:51==
で比較できましたっけ?
0934デフォルトの名無しさん
2008/02/22(金) 16:55:530935デフォルトの名無しさん
2008/02/22(金) 17:53:15stricmpもstrcmpiもstrcasecmpも標準Cには存在しない。
最近のPOSIXにはstrcasecmpがあるけど、locale依存なので
画面に表示する文字列をソートするくらいしか使い道がない。
0936デフォルトの名無しさん
2008/02/22(金) 18:08:08なるほど。d
0937デフォルトの名無しさん
2008/02/22(金) 20:58:330938デフォルトの名無しさん
2008/02/23(土) 00:16:230939デフォルトの名無しさん
2008/02/23(土) 00:18:060940デフォルトの名無しさん
2008/02/23(土) 00:50:55強いて言うならC++標準。
つまんないことにこだわらんでも良いよ。
0941デフォルトの名無しさん
2008/02/23(土) 00:51:020942デフォルトの名無しさん
2008/02/24(日) 11:20:20assert(string_map[1].empry());
assert(string_map[100].empry());
assert(string_map.size() == 2);
つまり、存在しないキーを operator[] で指定すると
そのキーが自動的に挿入されて値はデフォルトコンストラクタ
で作成されてしまうということですか?
うむむ、例外になってくれればいいのだが。
std::vector でも operator[] は例外を出さないから
それに対応した動作ということなんでしょうか?
0943デフォルトの名無しさん
2008/02/24(日) 11:45:26string_map[1] = "foo";
ってやったときに存在しないキーを指定すると自動的に追加されてほしいからじゃね?
0944デフォルトの名無しさん
2008/02/24(日) 11:53:02存在するかどうかも含めて問い合わせるにはfindを使う
0945デフォルトの名無しさん
2008/02/24(日) 13:17:17次の規格の改訂では、存在しないキーに対して例外を投げる at() が追加されるよ。
0946デフォルトの名無しさん
2008/02/24(日) 13:58:040947デフォルトの名無しさん
2008/02/24(日) 14:42:270948デフォルトの名無しさん
2008/02/24(日) 14:42:470949デフォルトの名無しさん
2008/02/24(日) 14:43:470950デフォルトの名無しさん
2008/02/24(日) 14:47:46何で無かったんだ? って機能が色々追加されてるみたいだね。
0951デフォルトの名無しさん
2008/02/24(日) 14:48:120952デフォルトの名無しさん
2008/02/24(日) 14:54:320953デフォルトの名無しさん
2008/02/24(日) 14:55:440954デフォルトの名無しさん
2008/02/24(日) 14:57:210955デフォルトの名無しさん
2008/02/24(日) 14:59:55struct ST{
int n;
};
vector<ST> v;
set<ST> s;
int main(){
ST x={0};
v.push_back(x);
vector<ST>::iterator itv=v.begin();
itv->n++;
s.insert(x);
set<ST>::iterator its=s.begin();
its->n++;
}
のようにすると、its->n++;の行で
error: increment of data-member ‘ST::n’ in read-only structure
と出るのですがvectorで出来てsetで出来ないのはなぜでしょうか?
0956デフォルトの名無しさん
2008/02/24(日) 15:03:570957デフォルトの名無しさん
2008/02/24(日) 15:04:240958デフォルトの名無しさん
2008/02/24(日) 15:04:44set は常にソートされた並びを保っている必要があるから。
0959955
2008/02/24(日) 15:17:04iterator経由で勝手に中身を変えられたら困るということは、
setとmapだけの例外扱いなのですか?
イテレータタグというのは初見なのでちょっと調べてみます。
0960デフォルトの名無しさん
2008/02/24(日) 15:28:500961デフォルトの名無しさん
2008/02/24(日) 15:28:54map の場合は value_type である pair の first がソートキーなので、これは
書き換えられないように const が付いてる。 second は順序に関係ないので
書き換えてもいい。
0963デフォルトの名無しさん
2008/02/24(日) 15:43:020964デフォルトの名無しさん
2008/02/24(日) 16:01:240965デフォルトの名無しさん
2008/02/25(月) 14:04:12ofstreamって、bad()とかfail()とか使いにくい。
0966デフォルトの名無しさん
2008/02/25(月) 14:18:47ってやっとけばいちいちチェックしなくても例外吐いてくれると思う
それが使いやすいかどうかはわからんが…
0968デフォルトの名無しさん
2008/02/25(月) 16:54:000969デフォルトの名無しさん
2008/02/25(月) 17:08:090970デフォルトの名無しさん
2008/02/25(月) 17:24:02>file_range
ずっと見てても分からないんですが、file_rangeって何ですか?
0971デフォルトの名無しさん
2008/02/25(月) 17:29:120972デフォルトの名無しさん
2008/02/25(月) 17:30:410973デフォルトの名無しさん
2008/02/25(月) 18:12:11複数のファイルを混在させずに簡単にロードしてしまうクラスが欲しいのですが、どんな実装になりますか?
0974デフォルトの名無しさん
2008/02/25(月) 18:13:10コンストラクタで開いたら後はただのRange。
http://p-stade.svn.sourceforge.net/viewvc/p-stade/trunk/pstade/libs/oven/test/file_range.cpp?revision=1481&view=markup
http://p-stade.sourceforge.net/oven/doc/html/oven/ranges.html#oven.ranges.file_range
Range自体はここでも見て。
http://www.kmonos.net/alang/boost/classes/range.html
0975デフォルトの名無しさん
2008/02/25(月) 18:16:01boostなんですね。STLに昇格するまで待ってようかなぁ。
ちょっと気後れしてしまうorz
0976デフォルトの名無しさん
2008/02/26(火) 08:54:040977デフォルトの名無しさん
2008/02/26(火) 08:59:15ローデータ、テーブルデータ、ファイルを混在、簡単に、ロード
これだけ曖昧な言葉を並んでるとさすがに意味がわからん。
0978デフォルトの名無しさん
2008/02/26(火) 11:28:42ファイルの種類が増えるたび書き換えするのは面倒なので、
ポケットみたいにどんどんファイル(ファイル名)を入れていくとその中でメモリになってる、みたいな。
0979デフォルトの名無しさん
2008/02/26(火) 12:01:54// ちょっとエスパーにチャレンジしてみたい気分になった
// こうですか?
#include <vector>
#include <map>
#include <string>
#include <istream>
#include <iterator>
#include <fstream>
#include <cstddef>
#include <exception>
#include <iostream>
typedef std::vector<char> memory_type;
class pocket {
std::map<std::string, memory_type> naka;
public:
void ireru(std::string const& filename) {
std::ifstream file(filename.c_str());
file.exceptions(std::ios::badbit | std::ios::failbit);
naka[filename].assign(std::istreambuf_iterator<char>(file)
, std::istreambuf_iterator<char>());
}
};
int main(int argc, char* argv[]) {
try {
pocket pocket;
for (int i = 1; i < argc; ++i) { pocket.ireru(argv[i]); }
return EXIT_SUCCESS;
}
catch (std::exception const& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE; }
}
0980デフォルトの名無しさん
2008/02/26(火) 12:18:030981デフォルトの名無しさん
2008/02/26(火) 12:25:500982978
2008/02/26(火) 12:58:13そのまま使ってみます。
でも、ireruメソッドはメソッド名変えるけど。
class pocketもclass memoryPocketの方が良いかなぁ?
0983デフォルトの名無しさん
2008/02/26(火) 14:12:220984デフォルトの名無しさん
2008/02/26(火) 14:15:270985デフォルトの名無しさん
2008/02/26(火) 14:24:08マジで邪魔。
0986デフォルトの名無しさん
2008/02/26(火) 14:29:55おま、ふよー
0987デフォルトの名無しさん
2008/02/26(火) 15:16:46おまえだって大したことはないだろ
0988デフォルトの名無しさん
2008/02/26(火) 16:42:300989デフォルトの名無しさん
2008/02/26(火) 18:44:25なんでこのスレ見てるんだろう。
0990デフォルトの名無しさん
2008/02/26(火) 19:03:060991デフォルトの名無しさん
2008/02/26(火) 20:47:500992デフォルトの名無しさん
2008/02/26(火) 21:41:380993デフォルトの名無しさん
2008/02/26(火) 23:55:52http://pc11.2ch.net/test/read.cgi/tech/1200044614/
0994デフォルトの名無しさん
2008/02/27(水) 01:16:160995デフォルトの名無しさん
2008/02/27(水) 01:17:380996デフォルトの名無しさん
2008/02/27(水) 01:25:47こっちが二ヶ月で 1000 。
あっちが一月半で 800 。
あわせると、だいたい一月でちょうど 1000 か。
0997デフォルトの名無しさん
2008/02/27(水) 02:03:52http://pc11.2ch.net/test/read.cgi/tech/1204045410/
0998デフォルトの名無しさん
2008/02/27(水) 02:04:35http://pc11.2ch.net/test/read.cgi/tech/1185986999/
【C++】STL(Standard Template Library)相談室 6
http://pc11.2ch.net/test/read.cgi/tech/1160821240/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 ;4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3
http://pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
http://pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/
0999デフォルトの名無しさん
2008/02/27(水) 02:07:031000デフォルトの名無しさん
2008/02/27(水) 02:08:40http://pc11.2ch.net/test/read.cgi/tech/1204045410/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。