[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 04/29 14:24 / Filesize : 158 KB / Number-of Response : 773
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】STL(Standard Template Library)相談室 10



1 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:01:17 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 9
pc11.2ch.net/test/read.cgi/tech/1204045410/

過去ログ・リンク・書籍紹介は >>2 以降

369 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:14:42 ]
二重ループのかわりにstd::find_ifを使ってみようぜ!
あと上で言ってる人もいるけどsortするならむしろstd::vectorのかわりにstd::setを使おうぜ
Itemがidをもつぐらいなら用途にあってる可能性高いし


370 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:20:36 ]
VBでもデータ構造を変えれば劇的に速くなるな。

371 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:27:41 ]
>>369
ちょっとよく分かりませんが、勉強してみます。
今はVBのコードをC++にツラツラ置き換える作業だけをやってます。

VBの配列 → std::vector
VBのString → std::string

という置き換えで、今のところこれ以上のSTLの知識はありません。
アルゴリズムを下手に変えると、新たにバグが混入することになるので。

372 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:33:36 ]
VB6と一緒に心中してくれよ。こっちくんな。

373 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:40:28 ]
移植させてもらえるだけでも素晴らしいことだと思わないか。

374 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:44:24 ]
つうか既にバグ混入しててワロタ
>for( i= 1; i< 0xFFFF; i++ ){

375 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 16:03:45 ]
findを使って作ってみました

enum { N = 600, ID_MAX = 0xffff };

template<typename ID> struct Compare {
Compare(ID i) : m_i(i) {}
template<typename T> bool operator()(T const& i) { return i.id == m_i; }
private:
ID m_i;
};

template<typename ID, typename Container>
ID find_uniq_id(Container const& m) {
typename Container::const_iterator m_end = m.end();
for (ID new_id = 1; new_id <= ID_MAX; ++new_id) {
if (std::find_if(m.begin(), m.end(), Compare<ID>(new_id)) == m_end)
return new_id;
}
throw std::domain_error("new_id must not be beyond ID_MAX");
}


376 名前:375 mailto:sage [2008/11/08(土) 17:05:13 ]
id_typeとget_idを特殊化することによってより流用できるようにしてみました
参照の参照が怖いのと面倒臭いのが難点だと思いました

template<typename T> struct id_type { typedef typename T::id_t type; };
template<typename T>
typename id_type<T>::type get_id(T const& x) { return x.id; }
template<typename T>
struct Comparator {
typedef typename id_type<T>::type ID;
typedef bool result_type;
Comparator(ID i) : m_i(i) {}
bool operator()(T const& i) const {
return get_id<T>(i) == m_i; }
private:
ID m_i;
};
template<typename ID, typename Container>
ID find_uniq_id(Container const& m) {
typename Container::const_iterator m_end = m.end();
for (ID new_id = 1; new_id <= ID_MAX; ++new_id) {
if (std::find_if(m.begin(), m.end()
, Comparator<typename Container::value_type>(new_id)) == m_end)
return new_id;
}
throw std::domain_error("new_id must not be beyond ID_MAX");
}

377 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 17:39:34 ]
これはひどい



378 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 18:08:48 ]
なんというオナニー

379 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:37:20 ]
数値を文字列にするには
ostringstream を使用する方法がメジャー?

380 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:39:59 ]
>>379
たぶん sprintf を使う人のほうが多い。
snprintf が C++ 標準に入ればさらに増えるかもしれない。

結果を string で使うことや安全性を考えれば ostringstream のほうが良いとは思うけど。

381 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:54:15 ]
sprintfはchar確保するの面倒だとおもうけど
利用者が多いのは何か理由があるの?

382 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:55:45 ]
>>381 C からの移行組。

383 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:10:24 ]
Exceptional C++ Style でstringstreamはsprintfに比べて
だいたい10倍くらい遅いと書かれていた。

384 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:30:02 ]
速度的な点もあるけど
printf系というのは非常に多くの言語で(Win32にはAPIもある)用意されていて
細部の違いはともかく、知っている人が多い、使い方を覚えて無駄にならない、
というのもある。

C++だけの世界だけで見れば型安全性の無さ等非難される面も多いし
「C++らしくない」という良くわからない理由で嫌う人も。
また、(よく知らない人に多いが)セキュリティ等の面で問題があると言い張る人も居る。

385 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:54:57 ]
書式の設定がめんどくさい上に、長くなってしまう気がするんだが俺の書き方悪いのかな

386 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 04:07:58 ]
>>385
stream のことなら、たぶんそんなもん。

そういえば C++0x でもこの点は特に改善されたような話を聞かないな。
boost の io state saver ぐらいは入ってもよさそうなもんだと思うけど。

387 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 10:57:41 ]
>>379
boost::lexical_cast を使うがよい
結局 stringstream 使ってるんだけどな



388 名前:デフォルトの名無しさん [2008/11/09(日) 11:53:14 ]
>>381
char確保しなくてもいいよ。

std::string str;
int a = 123;

str.resize(256,0);
sprintf((char*)str.c_str(), "%d", a);
str = str.substr(0, str.find('\0'));


389 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:04:57 ]
stringにconst_castか…

390 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:06:07 ]
c_strの間違いw

391 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:23:41 ]
>>388
c_str() の戻り値に無理やり書き込んでも反映されるとは限らんよ
っていうかconst外して書き込むなんて無茶苦茶にもほどがある

392 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:24:08 ]
#include <vector>
#include <cstdio>
#include <iostream>

int main(int, char *[])
{
std::vector<char> buf(0xff, 0);
int n=10000;
std::sprintf(&buf.front(), "%d", n);
std::cout << static_cast<const char*>(&buf.front()) << std::endl;
return 0;
}

なるへそ

393 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:27:03 ]
printf系はセキュリティ面で問題あると思ってたが

問題ないの?

394 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:29:46 ]
const外し
か、漢だ!

395 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:30:56 ]
nの型がintでlog10(n)が100や200にもなるアーキテクチャがあれば教えて欲しいものだ

396 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:41:02 ]
string使おうがvector使おうが
スタック上に領域確保してれば
char配列となんら変わらん

397 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:46:24 ]
>>396
大概はそうだが、規格には反するな



398 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:07:49 ]
>>393
使い方の問題。
ユーザー入力をフォーマット文字列に使おうとする大バカと
最大文字数の指定方法を知らないバカがそう言ってるだけ。

399 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:18:32 ]
>>398
具体的に何の関数を言ってるかわからんけど、
すくなくともsprintfはあぶない

400 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:28:49 ]
一般的にやるべきでないとされていることを「だって出来るじゃん」の一言でやってしまう・・・

くせぇーっ! DQN以下の臭いがぷんぷんしやがるぜぇーっ!

401 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:31:44 ]
>>399
具体的にどこが危ないのか教えてよ

「使い方を間違えたら危ない」というレベルの話なら
「listen()を使う全てのプログラムは危ない」というのと同じになっちゃうから

402 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:39:40 ]
>>401
え?最大文字数を指定できないじゃん

それが危険だと思えないならまぁ好きにするといいよ

403 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:42:38 ]
sprintfで100byteのバッファしか取っていないのに、
100文字以上有るかもしれないユーザ入力を与えるとかね。

404 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:44:11 ]
VCのsprintf_s使ってます(^^)

405 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:46:22 ]
ハア?

char buff[100]
sprintf(buff, "%.80s", user_input);

これのどこが危ないって?

406 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:47:28 ]
まさしく>>398の最下行に書いてあるバカが言ってるとしか思えないんですけど。

407 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:48:08 ]
C++ で何で sprintf なんて使ってるのん?
しかも STL スレで・・・。
ostringstream か boost::format を使っとけ。



408 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:00:20 ]
>>405
そういうことを分かって使う分にはいいけど、
実際に使う人間が必ずしも分かっているとは限らないし、
分かっていても、うっかりやってしまう危険性があるよね。

409 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:04:25 ]
つうかそんな単純なケースならいいけど、
色々出力したりロケールが絡むと出力結果の予想がしんどいだろ

410 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:08:01 ]
そんなレベルなら、「vectorで[]は使わないほうが良い。at()を使え。」と同じじゃないの。

特に>>399はわざわざ>>398に対して言ってるんだから
もっとちゃんとした危険性を指摘してくれても良さそうなもんだけど。

そりゃ、切捨て前提という仕様は良くないとか
全部生かすつもりならsnprintfの方が楽だとか言うのはその通りだけど
それとセキュリティ的な問題は全く別だから。

柔軟性だって例えば
std::vecotr<char> buff;
buff.resize(???);
sprintf(&buff[0], "%.*s", buff.size()-1, str);
のような使い方である程度確保できるし。

>>409
「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。

411 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:13:43 ]
>>410
> 「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。
この一行が>>409の話とは全く別の話なのは、そういうジョークなの?

412 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:14:33 ]
ostreamが状態を持ってるのもしんどい

413 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:14:53 ]
あ、別にユーザー文字列をそのまま配列に落とす場合に限らないよ。

そもそも(1箇所での)ユーザー入力なんて、普通は1つなんだから
例えば
sprintf(filename, "file-%.80s%d.dat", input, num);
のような形式でも、充分に最大値は予想できるし。
あ、「intが512bitの環境を考慮すると面倒」というのはその通りか。

414 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:17:55 ]
使い難さが有るということは、ミスり易いってことじゃね?
ミスってもセキュリティ的な問題が出ないライブラリならいいんだけど。

415 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:19:43 ]
いわゆる、バグというものは、ミスることによって起こるんだから。
十分予想出来るとかで大丈夫じゃないか、なんていい方出来るだったら、
世の中の全てのソフトウェアにはバグが無いってことも言えてしまう。

416 名前:409 mailto:sage [2008/11/09(日) 14:19:58 ]
>>410

いやだから
出力結果の予想が困難→バッファ長の予想が困難
セキュリティ的にあぶなくね?
という話し

気をつけて使え
って話しなら
そうですね
としか言えないけど

みなミスりがちだからsnprintfとかVC++のセキュア関数とか
あるんじゃないの?

417 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:32:40 ]
いやだから
全然>>398への反論になってない。
「使い方を知らないのが問題」なだけでは
「セキュリティ的に問題がある」ということにはならないから。
まあ、416の言いたいことはもっともだし
他にもっと良い選択肢があるならそちらを使うべきなのは確か。
でも残念ながら標準ではない。


ただ、自分が「使い方を知らないバカ」だという自己紹介はもういいよ。
>>398の最下行を無視して>>402と反論するような人が>>399みたいに書くわけだから。



418 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:35:28 ]
あ、それと、「最大値の見積もりを間違える」点についてだけど

別に用意したバッファの95%以上まで使わなければいけない、というような決まりはないから。
多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。
例えば>>405のようにね。

419 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:37:36 ]
>多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。
ええええー

420 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:38:20 ]
最大量がきっちり分かってる状況じゃないかそれでいけるのは

421 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:41:24 ]
は?
当然過ぎて困りますが
ユーザー入力の部分の最大量は>>405のように制限して
その上で他の部分の見積もりが多少違っていても大丈夫なように
ということですけど。

422 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:42:37 ]
ユーザー入力の部分の最大値を制限するのは
当然というか大前提だと思っていましたが、皆さんは違うのですか。
認識の違いですね。

423 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:44:22 ]
つまり、%fは使うなってことですね、判ります。

424 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:48:54 ]
あー、sprintfは使い方が難しくセキュリティ的な問題を起こしやすいので使うべきではない。
とすると、

同じように、
使い方が難しくセキュリティ的な問題を起こしやすいものは使うべきではない
ということになりますね。

つまり、
C++をやめましょう、と。
Javaあたりがよろしいでしょうか。
実際、世間の潮流もそういう流れになってますしね。

425 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:49:50 ]
>>423
%.fを使ってください

426 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:52:52 ]
>>425
sprintf(buf, "%10.0f", 1e100);

427 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:02:23 ]
snprintf()なら、
snprintf(s, sizeof(s), …
ってやっとけば安全だけど、
sprintf()は人間が数えないといけないじゃん。

>>405 見たいな単純なやつだったらどっちでもいいってことになるかもしれんけど、
書式が複雑になってくると、ミスる可能性がでてくるよ。

てか単純にsnprintf()のほうが楽ジャン。sprintf()で人間がバッファサイズ数えるなんて非合理。



428 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:04:36 ]
いつまで STL スレで sprintf の話をやってんだよ。
そんな型安全じゃない C の糞遺物なんぞ C++ で使うな。

429 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:05:04 ]
だよな!

430 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:07:32 ]
>>426
printf("%.2u", -1);
の時に必ず2桁に収まると思う人は居ませんね。
これと同様に最大桁数が見積もれる点は変わらないと思いますが。
いや、最大桁数はbit数に依存するので環境依存ですけど。

>>427
だからsnprintfはC++においては非標準だって。
それに「sprintfはセキュリティ的に問題がある」という意味にはならないよ。
「C++はセキュリティ的に問題がある」というのと同様。

431 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:07:47 ]
ところで型安全って何ですか?

432 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:10:57 ]
snprintfってC99からなんだっけ…
0xでは標準になるのかなぁ

433 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:12:10 ]
なりません

434 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:13:40 ]
相変わらず話題の質が下がると賑わうな。

435 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:20:11 ]
>>432
ドラフト N2798 の 17.1 [library.general] p9 より
> This library also makes available the facilities of the C99 standard library,
> suitably adjusted to ensure static type safety.

436 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:23:46 ]
_scprintfで数えたらいい

437 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:28:25 ]
>>430
doubleの最大桁数を常に見込んでバッファを確保するとでも?
%fを使わずに、素直に%gを使えば済むじゃん。
そういう使いこなしを必要とするからsprintf()は難しいと言うなら判るが、
使いこなしてもいないのに語ろうとするな。



438 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:33:24 ]
結論:ostrstream or boost::lexical_cast or boost::format or boost::egg::to_string

439 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:00:48 ]
結論:いままで聞いた話を総合すると、一番スマートなのはこれ。

std::string str;
int a = 123;
str.resize(12);
sprintf_s((char*)str.c_str(), str.size()-1, "%d", a);
str.resize(str.find('\0'));

ストリームとかで中間バッファを使うのはメモリの無駄だし、sprintfの書式指定能力の高さは最強。

440 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:02:21 ]
>>439
その場合だとstr.size()は0が返るよ。
あと規格は大切にね。

441 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:03:16 ]
>>その場合だとstr.size()は0が返るよ。
ごめん勘違いした。

でもその書き方は受け入れられない。

442 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:05:42 ]
c_str()を出力バッファに使う男の人って

443 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:06:48 ]
もはやSTLじゃねーなw

444 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:13:28 ]
vectorを使えばかろうじてSTLに関する話題の範疇に入…らないか

445 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:17:17 ]
>>439
× (char*)str.c_str()
○ &str[0]

あと、せっかくだから sprintf_s() の戻り値使えよ。

446 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:30:07 ]
>>445
規格ではstd::stringのメモリ上の連続性は保証されていない。
std::vectorと混同するな

447 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:33:39 ]
どうせ大丈夫なんだから別に良いじゃん




448 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:35:47 ]
仕事で一緒にならないなら別にいいよ

449 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:38:17 ]
>>446
C++0x で連続性は保証されるようになるし、
現状のどの実装でも連続性は成り立っている。

450 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:41:45 ]
>>446
www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530
まぁ現時点で保証が無いというのは確かなんだけどね。

451 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 17:38:58 ]
size_t count = _sctprintf(_T("%d"), 777) + 1;
std::vector<TCHAR> buffer(count);
_stprintf_s(&buffer[0], count, _T("%d"), 777);


452 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 17:52:09 ]
TCHAR(笑)

453 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 18:42:07 ]
>>449
そういう話をしたいのなら実装依存スレへ逝け

454 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 18:43:16 ]
>>451
そういう話をしたいのなら実装依存スレへ逝け

455 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 19:54:23 ]
STLのlistを利用したプログラムを実行中、
"list iterators incompatible" という例外が発生しました。これはどういったエラーでしょうか?
開発環境はVisualStudio2005 AcademicEditionです。

456 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:01:13 ]
ソース晒せ

457 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:06:15 ]
transformの使い方に関して質問があります。環境はGCCです。
目的は、stringの中身をすべて小文字に変換したいのです。

#include <string>
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <iostream>

string aa = "AbCdEfG";
transform(aa.begin(),aa.end(),aa.begin(),tolower)

で、aaの中身をすべて小文字に変換できません。
理由はわかりますでしょうか?



458 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:10:50 ]
>>457
とりあえずコンパイルエラーだろ。
エラーの意味がわからんということならエラーメッセージ晒せ。

459 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:14:20 ]
俺の環境では全部小文字になるが・・・。

460 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:20:44 ]
使用したソース

#include <string>
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
string aa = "AbCdEfG";
transform(aa.begin(),aa.end(),aa.begin(),tolower);
}

以下がコンパイルエラー

test.cpp: In function 'int main()':
test.cpp:9: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits\
<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> \
> >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded f\
unction type>)'


よろしくどうぞおねがいします。

461 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:23:26 ]
>456
ttp://www.hsjp.net/upload/src/up51891.txt
本来の拡張子は.hppです。ごちゃごちゃしててすみません。
103行目のupdate_etc()関数が怪しいと思っているのですが…

462 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:24:53 ]
Effective STL に乗ってたネタかな

463 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:32:13 ]
>>457
たぶん、こういう関数オブジェクトを作ってそれを渡せばいいよ。
struct my_tolower : std::unary_function<char, char>
{
char operator ()(char c) const
{
return std::tolower(c);
}
};

464 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:54:01 ]
transform(aa.begin(), aa.end(), aa.begin(), static_cast<int(*)(int)>(tolower));
通った

typeof(aa)::value_type : char
tolower : int(*)(int)
でtolowerをchar(*)(char)と型推論しようとして失敗してる

なので正確にキャストして与えてやればおk?

465 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:57:12 ]
>>461
まずはデバッガのバックトレースを見たりブレークポイントつかったりしてあたりつければいいよ
segvだろうが、unhandled exceptionだろうがどこで発生したか分かるから


466 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:00:18 ]
>>464
>>460の最後の行の中にunresolved overloaded function typeってのがあるでしょ。
C++では、tolowerが多重定義されているのだが、
それではテンプレート引数の型が決定できないということでエラーになる。
だから、>>464のようにキャストが必要になる。>>463みたいに他の方法も考えられる。

467 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:06:27 ]
>>466
>>464
>>460
ありがとうございます。
なるほどよく分かりました!




468 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:21:38 ]
>465
ありがとうございます。とりあえずどこで投げてるのか絞り込んでみます。

ただ、list iterators incompatibleというのがどういう状態を指すのか、よくわからないのです。

469 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:37:51 ]
vcのstlのincludeディレクトリにて"list iterators incompatible"で全文検索するとか

470 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 22:01:54 ]
>469
そういう方法もあるのですね
listの中を覗いてみます。
ありがとうございます

471 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 11:38:03 ]
dequeにpush_backで要素を挿入していくのは、予め配列をサイズ決め打ちで宣言して代入していくのより遅いですか?

472 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:13:18 ]
>>471
速度は実測が基本。

一般的に、 push_back() を繰り返す場合、配列要素のメモリ確保回数が増えるので
遅くなる可能性が高くて、それでも push_back() ならコピーコンストラクタが使われるので
要素の型によっては代入に比べて速い可能性もある。

473 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 20:00:12 ]
気になるけど図るのが面倒臭いなら、reserveしておけば精神的に気が和らぐ。

474 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:12:15 ]
vectorならreserveは必須だと思う
dequeってどうだろう

475 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:21:59 ]
dequeはある一定の長さのブロックが不連続に確保されるそうだから
reserveしたらシステムからメモリを持ってくる時間は稼げるけどvector
と違ってメモリの再配置は起きにくいんだよね

476 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 23:24:27 ]
それは実装によるんでは。

477 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 23:32:37 ]
実装によるのはもちろんだが一般的な実装の話ね



478 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 01:13:27 ]
dequeのpush_backが(償却じゃなくて正真正銘の)定数時間であることは規格で要求されてたはず
だから一概に実装に依るとも言えない

479 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 07:48:57 ]
dequeはpush_back/push_frontで既存要素のコピーが起こりえないのがありがたい
まあ最初から要素数が判ってるならvector一択だけど

480 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:37:08 ]
STLのことは良く分からないけど、
list,stack,queue,vector,dequeで空のクラスSampleのポインタを、
10万個格納、(1個delete&削除・1個格納)*10万回、
空になるまでdelete&要素削除 してみた。
vectorは予め追加要素の2倍reserve()した。
要素の追加削除はvector,stack以外『古い物から削除』、前から取り出して後ろから追加でやった。
stack、queueはそれぞれコンテナdequeを利用。

list 68.11 秒
vector 20.344 秒
stack 27.5 秒
deque 9.468 秒
queue 9.438 秒

queueが速すぎてワロタ
dequeは操作する方向次第でstackとほぼ同等
queue,stack,dequeはこの場合、実質同じモノだし

queue,stackのコンテナを変えたら悲惨な結果になった
PCが悲鳴を上げたのでこれ以上のテスト回数は勘弁

481 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:41:18 ]
あぁ、次はboost::circular_bufferだ…

482 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:58:12 ]
>481
>480と同条件、上限20万個として計測してみた。
平均5.5秒くらいだった

483 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 23:21:57 ]
ひょっとしてlistってあんまり使わない方が良い?

484 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 23:51:07 ]
むしろ連結リストのくせに良い数字が出てると思うがね

485 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:18:06 ]
リンクリストより配列のほうがキャッシュに引っかかりやすいからいいぞってMSも言いている。
msdn.microsoft.com/ja-jp/library/eye126ky.aspx

486 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:33:54 ]
>>483
状況次第
listのほうが向いてる使い方もあるしね

487 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:54:30 ]
途中(先頭末尾以外)の要素の削除はlistじゃないとやってられんやろー



488 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:55:31 ]
あとリストの連結やリストの分割もあるか

あれ?そんなことできたっけ・・・?

489 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:01:03 ]
とりあえずただデータを突っ込んで置きたい(出し入れ順番とかどうでも良い)場合には、
リストは不向きってことか

490 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:14:52 ]
昔はやたらとリンクリストを使うのがいいとされていたが、
今のご時世でも初心者にリンクリストを教えたがる間抜けが後を絶たない。
普通にstd::vectorを使えるように仕込んでおけば、std::listを使うのも苦労はないだろうに。

491 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:15:39 ]
>>487
途中の削除もdequeは結構速い。
listは削除してもイテレータが無効にならないのが利点かな。

492 名前:1/2 mailto:sage [2008/11/14(金) 15:46:52 ]
listを使っていてよく分からない事態に遭遇したので質問します。
長くなってしまったので申し訳ありませんが分割投稿します。

環境:VC++2005 / XP

typedef struct globalArray
{
  int type;
  char name[100];
  float variable[5][5];
} globalVar;

typedef struct nodeDat
{
  CShaderNode *nodeKind;
  globalVar varDat[5]; // 上の構造体(globalVar)
  int dataNum;
  float power;
} nodeData;

typedef struct _data
{
  nodeData mainNode; // 上の構造体(nodeData)
  nodeData blendNode; // 上の構造体(nodeData)
  nodeData subNode; // 上の構造体(nodeData)

  int materialNum;
  dxMaterial *matrials[MAX_MATNUMBER];
} dataBlock;

493 名前:2/2 mailto:sage [2008/11/14(金) 15:47:25 ]

上のような構造体が有りまして、一番下のdataBlockをリストとして扱っているのですが、

dataBlock tmp;
/* 〜 データ作成処理 〜 */
/* 〜 挿入先探索 〜 */
insert(itr,tmp);

とデータを挿入してリストを覗くと途中までしか正しくデータが入っていません。
データ作成過程で"",NULL,0.0fと全て初期値を用いてデータを初期化しているのですが、
data[0]->mainNode.varDat[0].variable
以降のデータが未初期化のまま生成されています。

構造体を入れ子にする前は正しく動いていたのですが、
listを扱う際は構造体を入れ子で扱うとNG等の制約があるのでしょうか。
ご教授お願いいたします。

494 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 15:53:19 ]
それだけだと推測しかできん
・初期化の部分が不完全か
・未初期化というのが勘違いか
・リスト操作がバグってるか
のいずれかしかないが、心当たりがないなら何か見逃してるんだろう
そのようなNG的制約は無いので大丈夫

495 名前:492 mailto:sage [2008/11/14(金) 16:04:13 ]
返信ありがとう御座います。

(※(int)はキャストではなく型を説明上明示するために便宜的につけた物です。紛らわしくてすみません。)

例えば仮データ(tmp)で、
(int)materialNumを0で初期化したのがリストのデータでは
(int)materialNumが-33686019になってしまっているので、
>・リスト操作がバグってる
のでしょうかね……

ありがとうございます。制約は無いときいて安心しました。
もう少し追ってみます。

496 名前:492 mailto:sage [2008/11/14(金) 16:30:43 ]
連投失礼いたします。
色々弄ってみたところ、構造体のメンバの記述順を入れ替えると正確に入るデータと入らないデータが出てきました。
詳しく調べたところ、連結しようとしている構造体は180byteで、リストで正しく入るのは96byteの領域まででした。
数字的にこれって多分仕様ですよねぇ……

497 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 18:55:54 ]
-33686019ってことは0xfdだろ?
ちゃんとdeep-copyせんと。



498 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 19:59:55 ]
dataBlock tmpA;
/* 〜 データ作成処理 〜 */
dataBlock tmpB;
tmpB = tmpA;

ってやって、tmpAとtmpBは同じ内容の独立したオブジェクトになる?

499 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 20:04:28 ]
誰にもわかりません

500 名前:492 mailto:sage [2008/11/14(金) 21:01:27 ]
返信ありがとう御座います。
>>498さんのを実行してみたところ、同内容の独立したオブジェクトに成りました。

deep-copyなのですが、
/* 〜データ作成処理〜 */
を抜けた後、tmpに全ての値がきちんと入っていることを確認し、
data.insert(itr,tmp);
でインサートを行っているのですがコピーに関してはlist側で処理されている様で、
こちら側からコピー処理を定義することが出来るのでしょうか。

501 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 21:50:22 ]
>>500
コピー演算子をオーバーロード。

502 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 00:35:09 ]
その場合はコピーコンストラクタじゃ?

503 名前:492 mailto:sage [2008/11/15(土) 01:20:38 ]
すみません、何かもう全く関係ないところが原因っぽいです。
構造体のメモリ領域と他のクラスのメモリ領域が被ってる……

504 名前:デフォルトの名無しさん [2008/11/15(土) 03:13:32 ]
あるIDを割り当てるクラスを作成しようと思っています
インターフェースとしてはこんなかんじで
class IDAllocator{
uint32_t T AllocID();
void FreeID(uint32_t id);
};
クライアントコードに対して、一意なIDを割り当てるのですが、
IDを使い終わった後は返却し、後ほど再利用できる様にしたいです。

IDを割り当てる際に、現在使われてないIDの内、最小の数値のIDを返す仕様にしたいのですが、
STL的にかっちょいい実装方法を教えてください

今のところ割り当て済みのIDをvectorに記録しておいて、0から1ずつ増やしてvectorに無いIDがあれば
それを使うというどう考えても効率の悪いやり方でやっています


505 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 03:44:37 ]
使い終わって返却されたIDをpriority_queueに記録し、再利用するときはそこから取り出す

506 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 03:48:12 ]
priority_queueが空なら新たに生成する→新しいIDは最も大きい数値になる ってことか

507 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 09:29:56 ]
インテレータの有効性をチェックする方法はない?
何も代入されてないときなど、別の変数でフラグ保持するのは面倒だと思うので



508 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 09:59:37 ]
とりあえずend()でも入れとけとか、
有効/無効状態をチェックするなとか、
そもそもインテレータって何とか。

509 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 14:38:28 ]
そんなあなたにboost::optional

510 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:05:27 ]
>488
splice 使えばできるはず。

511 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:53:37 ]
これっておかしくない?
ttp://www.geocities.jp/ky_webid/cpp/library/008.html

512 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:57:21 ]
>>511
どこがどうおかしいと思うのか書けやカス

513 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 11:21:20 ]
とりあえずテンプレートクラスはクラステンプレート

514 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:11:13 ]
enumの値か?

515 名前:デフォルトの名無しさん [2008/11/16(日) 12:14:51 ]
それは別に間違ってなくね

516 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:16:41 ]
MIRROR_X

517 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:24:52 ]
問題ないだろ
MIRROR_X = SCALE | ROTATE
を意図して書いてあるならな。



518 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:35:10 ]
はー?

519 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:50:45 ]
enum bitset
二大不要物(笑)

520 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:54:39 ]
enumを不要とか言うやつは素人

521 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:04:54 ]
enum要らないとか言う奴はただのバカかTMPしない人だろ

522 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:08:23 ]
>C言語であれば、ANDやOR等の演算を使って管理しますが、C++ではbitsetが利用できます。
この辺りで馬鹿を晒している。このサイトも勿論、私のダメサイトリストに載っている。

523 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:10:34 ]
じゃぁbitsetってなんに使うの?


524 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:13:37 ]
ビット単位のフラグの管理をせざるを得ないときに使うかなぁ。ま、そのときが来たら考えるよ。

525 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:16:23 ]
>>522
上級者のあなたがおすすめするサイトを教えてください

526 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:20:55 ]
>>523
>>519

527 名前:522 mailto:sage [2008/11/16(日) 13:23:15 ]
残念ながら今のところ、初心者に安心してお勧めでキルサイトは見つけていない。
したがって、申し訳ないが期待には応えられない。

ちなみに、私のダメサイトリストは正しくは、「初心者にはお勧めできない(≒ダメ)サイトリスト」だ。
中級者辺りが読む分には、(自力で確認できるノウハウもあるだろうから)まぁ、悪くないかもしれない。



528 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:34:14 ]
enumは型安全じゃないのが気に要らないな

529 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:35:07 ]
C++のenumは、|=するだけでキャストが必要な糞仕様

530 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:44:26 ]
俺は#define派
enumだとアセンブラソースから使えないから

531 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:54:37 ]
>>529
そもそもビットフラグで使うとは限らないわけで…

532 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 14:08:21 ]
>>519

unionに失礼だろw

533 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 16:05:41 ]
それは128ビットとかに使うぞ

534 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 09:37:02 ]
お前らみんな、unionさんに謝れ!

535 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:37:45 ]
アマチュアの俺からすると分からんのだけど、unionって実際の業務で使われてるの?
enumなんかは割りと使ってるんだけど

536 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:48:34 ]
>>535
使うこともあるよ。Cでbitsetもどきを実装するときとか。

537 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 17:54:37 ]
大きな数値から上位ビットと下位ビット分けたり



538 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:04:00 ]
・建前
unionは環境に激しく依存するから、使わない方がいい。

・本音
いまどきビッグエンディアンとか無いだろw

539 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:11:15 ]
オレも、エンディアン、ビット幅、signedの右シフト、除算の符号は実装決めうちで作ってる

540 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:14:14 ]
>>538
サーバ系では未だにSunが頑張っているから無視できないのよね。

541 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:33:05 ]
うにおんは組み込みCで以前使ってた事がある
おそらく今でも使ってる

542 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:45:55 ]
1の補数はもう絶滅でいいだろ

543 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:50:13 ]
引き算どうすんだよw

544 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:59:06 ]
負数の表現方法のことだろ。

545 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 19:17:14 ]
それは2の補数

546 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 19:19:57 ]
ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE

547 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 22:16:38 ]
よその言語だとASCIIにIEEE754も決め打ちと化しているものもあるよな。



548 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:10:13 ]
未だにIBMのサーバでEBCDICとかあるから油断できない

549 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:51:08 ]
>>538
俺はエンディアン入れ替えたいからunion使ってる。
union {
double a;
char b[8];
}

550 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:54:30 ]
つーかネットワークバイトオーダはbigだし
画像処理でもエンディアン入れ替えなんてよくやるでしょ

全部littleで済むと思ってる人ってどういう世界に生きてるんだ?

551 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:08:27 ]
意識する場面なんてほとんどないな

552 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:11:46 ]
>>550
そういうときに、必ずエンディアン変換を挟むコードを書いてしまう(あるいは書かない)
というのがエンディアン決め打ちのコーディングだと思う。

553 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:14:19 ]
#ifdefるだろjk

554 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:41:30 ]
いや、自動判断する。
例えばtiffはヘッダのIかMかで判断できるし、実行環境がどっちなのかはint foo = 0とでもして& fooをchar *にキャストして取り出せば判る。

555 名前:554 mailto:sage [2008/11/18(火) 00:51:28 ]
s/int foo = 0/int foo = 1/

まぁ、unionは使わないけれど。

556 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:53:15 ]
スレから脱線するが、標準の方法でエンディアンをコンパイル時に知る方法ってある?
実行時ならできるんだが

557 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:58:32 ]
boost/detail/endian.hppとかを見る限り、標準では無さそうだね



558 名前:デフォルトの名無しさん mailto:わざとだが sage [2008/11/18(火) 01:50:26 ]
>>556
コンパイル環境のエンディアンを?
それとも、ターゲット環境?

559 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 01:58:09 ]
>>556
VxWorksなら_BYTE_ORDERのdefine見れば分かるが他はしらん。

560 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 13:28:05 ]
>>554
PDP-11位だしな変態なの

561 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 14:44:19 ]
>>560
お前はSun、IBM、MIPSを敵に回した。

562 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:25:22 ]
vectorについてですが
array.reserve(array.size());
でぴったりのサイズに変わるかと思ったのですが変わりません。

大きなデータを扱ったりする場合、ぴったりのサイズで作り直した方が
メモリが節約できるかと思うのですが、なぜうまくいかないのでしょうか。
何かいい方法はないでしょうか?

563 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:28:10 ]
vector<T>(array).swap(array);

564 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:32:01 ]
reserveは拡大する方向にしか働かないのでは

565 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:36:13 ]
>>>562
§23.2.4.2.2
void reserve(size_type n);
2 Effects: A directive that informs a vector of a planned change in size, so that it can manage the storage
allocation accordingly. After reserve(), capacity() is greater or equal to the argument of
reserve if reallocation happens; and equal to the previous value of capacity() otherwise. Reallocation
happens at this point if and only if the current capacity is less than the argument of reserve().
3 Complexity: It does not change the size of the sequence and takes at most linear time in the size of the
sequence.

greater or qrual と書いてあるから等しいかもしくは大きいとなるので
ぴったりのsize()になる保証はない。

566 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:37:52 ]
おっと

equal to the previous value of capacity() otherwise.

ともあるから、縮小しようとしてもcapacity()は変化しない事になる。
詰まるところ>>563のようにスワップ技法に頼るしかない。

567 名前:562 mailto:sage [2008/11/20(木) 11:20:10 ]
>>563-566
出来ました。ありがとうございます。
サイズの縮小は出来ないんですね。勉強になりました



568 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:13:58 ]
今までイテレータが指してるコンテナのことをイテランドと呼んでたんですが
そんなの聞いたことないって言われました

ぐぐってもほとんど出てこないので不安になってきたんですが(「イテランド」だとゼロ…)
普通に使いますよね?

569 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:17:07 ]
はつみみです

570 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:18:50 ]
ぐぐった時点で気づいてるだろwwww俺は聞いたこと無いな
iterandにしたら多少出てくるけど、まぁスズメの涙ね

571 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:24:17 ]
あーやっぱり?
iterandは1000件くらい引っかかるから、わざわざカタカナにしないだけで
あっちでは普通の言葉かもしれないと思ってたんですが

じゃあ皆さんはイテレータが指してるコンテナのことはなんて呼んでるんでしょう
「イテレータが指してるコンテナ」ですか?

572 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:24:23 ]
イテレータが指してるコンテナ?

vector<int>::iterator it;
だと
vectorが「イテランド」になんの?


573 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:27:10 ]
例えば
vector<int> v;
vector<int>::iterator it = v.begin();

なら、itはvのイテレータで、vはitのイテランドです

574 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:38:03 ]
iterateeとか言ってみる。

575 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:09:59 ]
Pythonではiterable

576 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:40:26 ]
>>575
それは意味が全然違う

577 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:50:39 ]
iterable はまんまイテレータ(とみなせるもの)。



578 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:37:36 ]
itのコンテナ 程度にしか言わないな

579 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:54:20 ]
イテランドがまあ、何を指している言葉かは
 オペレータ⇔オペランド
からの類推でわかるけどさ。

それより世間一般ではイテレータなんだろうが、
俺はついついイタレータと読み書きしてしまう今日この頃。

580 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:15:51 ]
>>579
おいたが過ぎますぞ

581 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:24:11 ]
いてまうどー

582 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:52:19 ]
とりあえず、イテランドがあんまり一般的な言葉じゃないことはよくわかりました
内輪以外では使うのを控えることにします
ありがとうございました

583 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 02:05:31 ]
あんまりという表現なのか・・・w

584 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 02:41:16 ]
つうかどこでその言葉を習ったんだろ

585 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 15:27:41 ]
イテランドでぐぐるとこのスレが引っかかるなw

586 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 15:47:04 ]
イテランドたんのアニメ化が決定したそうです。

587 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 16:56:13 ]
とある言語の被反復構造(イテランド)



588 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:09:09 ]
パパ〜遊園地いきたーい
よーし家族みんなでイテランドにでもいくか〜

589 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:16:39 ]
井手ランド

590 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:32:30 ]
とある要素の列挙目録(イテレータ)

591 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:46:29 ]
イテランドたんの要素数は103000ですね、わかります。

592 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 18:29:32 ]
変数 X が std::list 型で変数 I がその reverse_iterator だとすると

X.erase( I.base() );

で I が示す要素の隣を消去するので I はまだ使えますよね。
VC8 で I を使うと assert で止まるんですけど。

593 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 18:55:16 ]
その1行だけ示されてもなあ。

594 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:24:06 ]
デバッガで追えばいいじゃん……

595 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:29:51 ]
string strに入っている文字列のi番目から後ろをstr2に代入するにはどうすればいいですか?

596 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:56:15 ]
str2 = str.substr(i);

597 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:57:28 ]
substr



598 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 20:06:38 ]
>>592
使えない

599 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 20:25:38 ]
595です。ありがとうございました。あとstringを==で比較するときに小文字と大文字を区別しな方法はありますか?
一度変換しないとだめでしょうか?

600 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:06:58 ]
stringはそもそも「大文字と小文字」っていう概念が無いと思う

601 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:10:43 ]
大文字だの小文字だのは真面目にやり出すと大変だぞ
ロケールの問題とか

602 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:19:34 ]
>>598
std::list の reverse_iterator の場合は1つ後の要素を消去したとき無効になるんですね。

603 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:23:31 ]
stringは複雑なんですね・・・わかりました

604 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:30:16 ]
複雑なのはstringではなく、真の国際化です

605 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:51:06 ]
"ガ"と"ガ"を==で比較してtrueにできないからstd::stringはクソ

606 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:54:04 ]
CLでいうところのequalpを手前で実装しろクソ

607 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:58:17 ]
@と`を同じ文字と解釈するべき環境とかあるからな



608 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:59:34 ]
7bit ASCII内での大文字小文字無視なら、char_traits自作でやる実装を何かの本で見た。

609 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:03:38 ]
typedef pair<double,string> HOGE;



void func(??){

HOGE p;
p.first = data;
p.second = chordname;
pairs.push_back(p);

}


int main(){
deque<HOGE> pairs;

for(){
func();
}

}



mainで作ったdequeにfunc関数で値を入れたいんですがどうしたらいいですか?
もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。

610 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:04:09 ]
引数

611 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:11:52 ]
引数なのはわかるんですが・・・



void func(deque<HOGE> &pairs){

}


main(){

func(pairs);

}

こうですかね?

612 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:15:07 ]
>もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。

むちゃくちゃだ。


613 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:20:12 ]
えっと具体的にどうおかしいですか?


614 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:22:48 ]
頭がおかしい

615 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:35:40 ]
mainのスコープを抜ける=プログラムが終わる

プログラムが終わった後にdequeが初期化されるって、
atexit内で初期化したいのか

616 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 23:14:48 ]
>>615
ちょっと表現を間違えました。

617 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 23:44:46 ]
えっとそれで611で大丈夫ですかね?



618 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:42:48 ]
private な vector<int> hoge を外部から走査して数値を得たい

const int *mage = &hoge;

のような方法でするのかな?と思ったんですが
セオリーな方法はどんな書き方なんでしょうか

619 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:45:27 ]
参照せずに値じゃね?

620 名前:618 mailto:sage [2008/11/23(日) 00:45:59 ]
いやいまいちお前がなにいってんのかわかんないけど

621 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:47:43 ]
hogeをスキャンして数値を返すメソッドを公開すればいいじゃない

622 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:52:10 ]
プレイベートなデータなので、捜査には礼状が必要です。

623 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:53:45 ]
vectorの中身は連続性が保証されている、
つまりprivateなvectorの、先頭アドレスを返すような関数作って
それをconst int * で受け取り(もちろんサイズも)、
そのconst int * を走査するのかな?と思ったけど

書き方がわかんないから>>618になってしまった
ゴメンナサイ(´・ω・`)

624 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:58:23 ]
beginとendのペアを返す

625 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:02:01 ]
>>621に一票

626 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:09:49 ]
>>621
スキャンって・・・?
丸ごとコピーしてそれを返す?
内部でiterator保持して呼び出す毎に進める?

現場の人じゃないから、その手の語彙力ないんだわ(´・ω・`)


ちなみに具体的にはintではなく
x,y座標が入ってるpair<int,int>で
これを取得してGUIでリアルタイムに線を引きたい
という状況です

627 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:23:53 ]
現場の人とか関係ねーw
>>618の走査 == >>621のスキャン
だろOKJK

それから情報後出しって嫌われるの知らないかね
いいから黙ってソースコードべたっと貼れ



628 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:27:26 ]
では俺はコールバックを提案しよう。

629 名前:618 mailto:sage [2008/11/23(日) 02:19:18 ]
>>627
GUIライブラリ使ってる上に携帯厨なんです(ノ∀`)

typedef std::pair<int,int> Pos
class Hoge{
public:
 const Pos *getPosArray(int *arraySize);

private:
 std::vector<Pos> p;
};

const Pos *Hoge::getPosArray(int *arraySize){
 *arraySize = p.size();

 return *arraySize ? &p[0] : 0;
}

こうしてみた
コーディングスタイル云々は勘弁してつかーさい

630 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 02:28:25 ]
const std::vector<Pos>& ppp() const { return p; } でいいじゃん


631 名前:デフォルトの名無しさん [2008/11/23(日) 14:43:29 ]

int function(string &buff){


}

main(){

string buff:

function(buff);
}


mainで宣言したstringに関数で値を入れるには、これであってます?

632 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:45:30 ]
>>631
いいよ。

633 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:50:04 ]
ありがとうございます。

functionでの代入時は


buff ="mozi";
みたいな感じでいいですか?

634 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:51:30 ]
俺ルールだと、関数で値を入れる場合はポインタ渡しにして、
単に値を渡すだけなら参照にしてるな。

635 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:56:47 ]
>>633
それでいいよ。

値を渡すだけでも、返してもらうときでも参照でいいよ。
const のあるなしで区別すればOK

636 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:57:54 ]
>>634
M$ なんかが当初そういう方針だった気がするな。
NULL チェックが必要になるから個人的には微妙なんだが・・・。

637 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 16:31:25 ]
>>635
賛成。


それとは別に、俺は std::string 程度なら値を返すようにしたい。
function().length() したいだけだったり、function() で代入したものを他の関数に渡したいだけだったりした時に、わざわざローカル変数を作らなければならないから。
また、ローカル変数に代入すべき場合のうちで初期化後に変更しないものに const を付けられなくなるから。

オーバーロードして両方のバージョンを用意すればいいだけだけど。



638 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:27:34 ]
>>635 こうしろと?
int& function(string &buff){




639 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:28:40 ]
>>638
いや、引数の話だよ。

640 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:58:24 ]
>>635
int function(int&, double& )とかした場合
function( 1, 0.1) は使えないだろ
こんな使い方禁止?

641 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:05:30 ]
>>640
直前のカキコとか見れよ。

引数で値を返してもらいたいとき、constなしの参照つかえって意味だから、
そういう使い方は意味ないだろ。


642 名前:デフォルトの名無しさん [2008/11/24(月) 19:24:39 ]
istreamから数バイトずつ読み取って意味解釈していくような
プログラムを作っているのですが、

istream input;
short header1;
input.read(&header1, sizeof(header1));
short header2;
input.read(&header2, sizeof(header2));

こんな感じでしか書けないのでしょうか?

short header1 = input.read(sizeof(header1));
short header2 = input.read(sizeof(header2));

などと書ければよいのですが・・


643 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 19:27:10 ]
>>642
read<short>(input) とかいう関数でも作れば良いんじゃない?

644 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 20:13:34 ]
>>642
short header1, header2;
if(input >> header1 >> header2) {
// ...
}

645 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 20:26:01 ]
>>644
そんな餌に(AAry

646 名前:642 mailto:sage [2008/11/25(火) 01:57:17 ]
>>643

こんなのを作ってみました。

template<class T>
std::istream& read(std::istream& is, T& data)
{
return is.read(reinterpret_cast<char*>(&data), sizeof(T));
}


>>644

それって、inputが文字列なら良いですが、
バイナリ読みしたい場合はダメですよね?



647 名前:デフォルトの名無しさん [2008/11/25(火) 16:50:03 ]
vectorのイテレータは足し算ができるのに、listのイテレータではできないんですね。
listで添え字アクセスのようなことをやる場合は、

list<int>::iterator it = list.begin();
for(size_t i= 0; i< index; i++ ) it++;

みたいなことをやらないといけないの?

挿入とか削除とかが多い配列なのでvectorよりlistを使った方がいいんですが、
indexを使ったアクセスも多いので、なんかブサイクですね。
いい方法ないですか?



648 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:55:04 ]
>>647
コンテナの種類とランダムアクセスイテレータに関して
も少し理解を深めといた方が。

649 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:57:49 ]
>>647
std::advance()

650 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:16:49 ]
>>648
ランダムアクセスをしたいならvectorを使うべきだと?
一般論ではそうでしょう。

しかし、
vectorの場合、挿入・削除におけるコストは配列要素の数が増えるに従って等差級数的に増大します。
listの場合は配列要素の数にかかわらずコストは一定です。

だから、配列要素の数と、挿入・削除・ランダムアクセスの頻度を考えて、
処理速度的に最適なものを選びたいと思っています。

それで私のケースではvectorよりlistが妥当だと判断した訳ですが、ソースの記述がブサイクだと言ったまでです。

>>649
listの要素の入れ替えをしたくはないのです。

651 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:22:20 ]
>>650
つdeque
ランダムアクセスできて挿入も速い

652 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:26:38 ]
>>651
私のケースでは、挿入・削除を行う位置は先頭・末尾でないことが圧倒的に多いのです。

653 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:41:22 ]
>>652
dequeは途中の挿入も(そこそこ)速いんだよ。
dequeの仕様を満たそうとすると、どうしてもそういう実装になる。

654 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:02:08 ]
>>650
要件がいまいちつかめないので何ともいえないけど、
規格を眺めてlistが最適だと思うなら仕方がないんじゃない?
listはランダムアクセス出来ないしね。

でも、std::advanceの認識からしてSTLの理解甘そうだし、もう一度規格眺めることをおすすめするよ

655 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:14:47 ]
>>652
要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ


656 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:39:03 ]
周りがアドバイスしても結局自分の方法に固執するんじゃ
何言っても意味ないよ
そういうのはほっとくに限る

657 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:44:27 ]
挿入/削除が多いならリストを使うべきだろ
ときどきランダムアクセスが必要ならstd::advanceで



658 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:51:51 ]
advanceを思いっきり勘違いしてる節があるよね

659 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:58:49 ]
>>655
配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。
VS2005でコンパイルした場合だけど。

660 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:05:31 ]
>>659
何が?

661 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:28:06 ]
用途によっては挿入/削除/ランダムアクセスが全部O(log n)のデータ構造も検討するといいかもな
STLにはないけど

662 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:31:05 ]
>>647より後の返答カキコ 本当に>>647なのか?
おまえら、誰かに釣られてないか?
IDのない板って、なりすまし可能だからな

663 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:35:42 ]
質問に答えてるだけなんだから、>>647>>650が同一人物であろうとなかろうと何も関係ない
釣りだったとしても痛くも痒くもない

664 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:03:28 ]
std::vector<要素 *>

665 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:30:10 ]
skip listか
んなもんわざわざ使うなら普通にlistでもいいと思うけどな

666 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:40:43 ]
setについて質問です
www5c.biglobe.ne.jp/~ecb/cpp/07_15.html
要素の追加(追加場所をイタレーターで指定) 定数時間

とありますが、追加場所をイタレーターで指定とはどういうことですか?
insert関数ではないですよね?

667 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:02:51 ]
>>647はlistを使うのを前提として質問していて
listの代わりに何が良いかは質問してないようによめるのだが



668 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:04:52 ]
>>666
insertのことだと思うが

669 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:11:14 ]
>>666
setにはイテレータを指定するinsertと指定しないinsertがあるよ

670 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:15:27 ]
vectorにそのままクラスを入れるとコピーコンストラクタを何度も呼び出してるようなので
クラスのポインタを入れて使おうかと思ってるのですが
何か注意しなければ行けない点はありますか?

671 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:17:35 ]
>>670
ないです。

672 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:18:02 ]
あります
vectorから取り除いたときのdeleteし忘れ

673 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:20:48 ]
>>670
オブジェクトの多重参照

674 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:54:32 ]
FUGAはduobleとstringのpairです

multiset<FUGA> huga;
にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか?


count関数がありますけど使い方が・・・

huga.count("hogehoge");みたいな感じで使いたいんです

675 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 22:04:16 ]
>>674
count_if()

676 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:21:30 ]
>>671-673
サンクス deleteしなきゃだったんだな
ありがとう

677 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:50:01 ]
>>670
ptr_vectorでも使えば



678 名前:デフォルトの名無しさん [2008/11/26(水) 11:06:22 ]

KOUZOUTAI data[100];

partial_sort( data, data + 10 ,data+100, Sortpred1)

ってできますけど



vector<KOUZOUTAI> data(size);



partial_sort( data.begin(), data + 10 ,data.end(), Sortpred1)

ができません。第2引数の書き方が問題だと思うんですが、どう書けばいいでしょうか?

679 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 11:18:38 ]
>>678
data.begin() + 10

680 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 12:37:31 ]
const_iterator を iterator に変換するために distance() と advance() を使う方法が
Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で
変換できません。
std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?

681 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:34:21 ]
typedef std::set<A,B> C
std::set<C::const_iterator,C::iterator>
を作って変換しろ

682 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:46:58 ]
>>681
std::set, std::map の検索は普通の実装で対数時間

683 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 18:49:39 ]
*reinterpret_cast<std::set<A>::iterator*>(&cit)

大体の実装なら通るよ
細かいこと気にすんなってwwwww

684 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 20:24:23 ]
対数時間なら別にいいんじゃね

685 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:02:08 ]
>>680
とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?

686 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:35:37 ]
>>680
定数時間にこだわるんならどうぞ
std::tr1::unordered_map<C::const_iterator, C::iterator>

687 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:23:23 ]
vector<vector<T> > WArray;
WArray warr (100, vector<T>(10));
T型の2次元配列を作る場合、このようにすることが多いのだけど
全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ
を知りたい場合、方法は無いのでしょうか?



688 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:44:30 ]
> 全体のデータサイズは、size_of()関数で取得できるけど、

できるか?

689 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:57:26 ]
>>688
>>687です
ごめんなさい、間違えました
size_t size = warr.size();
こうでしたね(^^;

690 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:29:30 ]
いや、それ全体じゃないから。

691 名前:デフォルトの名無しさん [2008/11/30(日) 17:38:11 ]
detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdbの解決方ありますか?

692 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 17:41:32 ]
マルチ市ね

693 名前:デフォルトの名無しさん [2008/11/30(日) 17:45:42 ]
detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdb' が 'C:\Program Files\Microsoft DirectX 9.0 SDK (Summer 2004)\Lib\detours.lib'に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。これの意味と解決方教えてください

694 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 18:34:07 ]
さっさとしね

695 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 19:02:34 ]
大体わかるけどマルチ野郎には絶対教えない

696 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:08:26 ]
こんなファイルがあって、
--
a foo FOO
a fooz FOOZ
a foz FOZ
b bar BAR
b baar BAAR
--
その場合、こんな関係を現わしているんだけど、
--
a-+-foo
  +-fooz
  +-foz

b-+-bar
  +-baar
--
どんなデータ構造にするのが手頃か相談に乗ってくれまいか。

697 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:17:04 ]
何やりたいかによるだろうが、単に vector vector ではだめなの?



698 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:26:09 ]
aやbがなければvector<vector<pair<string, string>>>でいけるかな。問題は、
aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。
おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。

699 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:31:12 ]
mapでいいだろ

700 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:32:12 ]
楽しようと思えばmap<string,map<string, string> >かなぁ

701 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:51:58 ]
>>698
なんかよくわからんが、vector<pair<>> を含む class を作れば
いいのかな。出力もメンバ関数でもできるし。

702 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:17:48 ]
multimap<string,pair<string,string>>とかかな・・・
S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR")))
みたいなのを表現したいってことなら

703 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:34:40 ]
struct Entry {
string type, id, name;
bool operator<(const Entry &a) const { return type < a.type; }
};
multiset<Entry> entries;

でequal_range使わせるかな

704 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 02:41:11 ]
定数時間でa->foo->FOOと引く必要あるなら、map二段構えが一番楽じゃね。

705 名前:696=698 mailto:sage [2008/12/04(木) 06:11:17 ]
レスありがと。

なるほど、色々手はありそうだね。
ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。

# 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w

706 名前:デフォルトの名無しさん [2008/12/04(木) 20:31:19 ]
vectorを配列っぽく使ってるんですが、
eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか?

vec.erase(vec[5])
vec[5].erase()

みたいなことはできませんか?

707 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 20:34:31 ]
begin()+5



708 名前:706 mailto:sage [2008/12/04(木) 20:36:56 ]
おおー。感動です。ありがとうございました。

709 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:10:14 ]
まあ使い辛いとは思うがな・・・。

710 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:28:47 ]
関数の戻り値を直接 + とか . で使えることを初めて知ったときは感動したな。
とどうでもいい回顧

711 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:29:42 ]
. はともかく + は・・・。
数学的に、単独の方が違和感あると思われ。

712 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:34:59 ]
右辺値やな

713 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:12:57 ]
for_eachの使い方を知ったときは感動したけどやっぱり使いづらい

714 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:21:25 ]
lambda なしに for_each だけあってもね・・・。

715 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 10:23:09 ]
range adapterも欲しいナ

716 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:00:27 ]
rangeベースのforとアルゴリズムとlambdaだけでもwktkが止まらない

717 名前:デフォルトの名無しさん [2008/12/06(土) 15:46:46 ]
deque<string> buff;


にpusu_back()は定数時間ですか?それと

buff[0]みたいなアクセスはありですか?



718 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:32:10 ]
「deque push_back 定数時間」でググれば、皆同じことを言っているし、
buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、
何故こういう質問が書き込まれるんだろう。

あと、「みたいな」っていうのがよくわからん。
それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、
その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。
もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、
そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。

答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。

719 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:39:40 ]
>>718
そんなのはいいから答え教えろかす

720 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:46:12 ]
長々となに書いてんだろ PC触りすぎて酸素欠乏症なのかな

721 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:49:17 ]
std::dequeはrandom access containerとback insertion sequenceの要件を満たしているので
operator[]によるrandom accessが可能かつ、
push_backによる要素追加は償却で定数時間であることが保証されています

722 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 17:45:09 ]
>>720
> 長々となに書いてんだろ
馬鹿が読むと煽りたくなるアドバイスじゃない?

723 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:13:35 ]
むしろpush_backが償却定数時間よりひどいコンテナなんて無いだろw

724 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:18:33 ]
これらの操作を提供するための条件として規定されてるからね。

725 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:15:49 ]
set とかは insert だしな。

726 名前:デフォルトの名無しさん [2008/12/09(火) 14:44:05 ]
vectorの2次元配列はどうすればいいんですか?
2次元目も動的にしたいんです

727 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 15:04:51 ]
vector<vector<int> > v;



728 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:27:55 ]
ありがとっ

729 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:01:36 ]
これって問題ある?

class CVector
{
  vector<int> A;
}

vector<CVector> B;


CVector.A.resize(10);
B.resize(10);

730 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:03:22 ]
class CVector
{
  vector<int> A;
}←セミコロンがない

vector<CVector> B;


CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい
B.resize(10);

731 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:21:46 ]
あそうか、こうしないとインスタンスが作れなかった


class CVectorSub
{
public:
  vector<int> A;
};

class CVectorMain
{
public:
  vector<CVector> B;
};

class C
{
public:
  CVectorSub vSub;
  CVectorMain vMain;

  void Resize()
  {
    vSub.resize(10);
    vMain.resize(10);
  }
};


732 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:24:20 ]
やばい
2次元配列じゃなくなってる
意味ねぇ

733 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:39:28 ]
あ!わかったthx!

class CVectorSub
{
public:
  vector<int> A;
};

class C
{
public:
  CVectorSub vSub;
  vector<CVectorSub> vMain;

  void Resize()
  {
    vSub.A,resize(100);
    vMain.resize(10);
  }
};

734 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:44:36 ]
うわ・・・これダメだ

735 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:45:35 ]
>>733
vSubを操作してもvMainに影響しないし、vMainを操作してもvSubには影響しない。
わかってるならいいんだけど。

エスパーすると
vector<vector<int> > vec;
vec.resize(10);
for(int i=0; i!=vec.size(); ++i)
{
vec[i].resize(10);
}
なんじゃないかと。
違ったら無視して。

736 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:56:13 ]
いやそれです。ありがとう
それだと全部同じ配列数になるのかと思ってしまった。
vec[0].resize(10);
vec[5].resize(20);
こう出来たんだ。
暴れてしまった・・・すまんTHX

737 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:12:04 ]
2次元配列の初期化とポインタの使い方あってますか?

vector<vector<int>> vec(5, vector<int>(100, 0));
vector<vector<int>>* pVec = vec;
pVec[3]->resize(200);
pVec[3][180] = 12345;




738 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:33:26 ]
いいえ。

739 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:37:41 ]
>>737
> vector<vector<int>>
まずこれがだめ。正しくは
vector<vector<int> >

2行目はコンパイル通らない。
3行目と4行目も意味がめちゃくちゃ。

740 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:27:03 ]
ポインタをインデクサで参照して実態をアロー演算子で参照してるがな
大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし

つーか何でポインタが出てくんの?w

741 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:35:38 ]
何がしたいかよく分からない例だが
そのまま直すとこんな感じか

vector< vector<int> > vec(5, vector<int>(100, 0));
vector< vector<int> > *pVec = &vec;
(*pVec)[3].resize( 200 );
(*pVec)[3][180] = 12345;

しかしvectorに直接vector入れたらりサイズのコストがやばそうだな^^;

742 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:44:08 ]
ありがと。
本2冊読んで> >の間のスペースがわからないのがやばい

vector<vector<int> > vint;
vector<vector<char> > vchar;
ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど
vector<vector>* pvec = char;
ここの書き方がわからないお願い!



743 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:06:59 ]
そこでテンプレート関数の出番ですよ

main()
{
vector< vector<int> > vint;
vector< vector<char> > vchar;
if(〜〜〜)
  test(vint);
else
  test(vchar);
}

templete<class T>
test(T &vector)
{
vector[3].resize(200);
vector[3][180] = 12345;
}

適当に書いたから間違ってるかも分からん

744 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:27:33 ]
>>742
共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。
なので>>743の方法になる。

745 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:40:36 ]
いや何を書いてあるのかがわからなかった
コンテナの前にテンプレートを勉強してくる
ありがと、まじありがとっ

746 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:45:38 ]
今更勉強するより0xまで待った方がいいかもなー

747 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:41:07 ]
それは0x完全対応コンパイラを待ってから勉強するってこと?
あ、老後の楽しみか




748 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 06:28:40 ]
なに微妙に興奮してんのw

749 名前:デフォルトの名無しさん [2008/12/12(金) 07:10:55 ]
>>748
オ○ニーしながらだからねw

750 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 09:04:47 ]
上級者すぐるw

751 名前:デフォルトの名無しさん [2008/12/13(土) 01:33:45 ]
[SourceForge.net: Project File Releases: STLport] STLport STLport-5.2.1 released (Wed, 10 Dec 2008 10:50:47 GMT) (2008-12-10 19:50)

752 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 10:34:59 ]
0x ってもうあと一年しか残ってないんだ

753 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:13:07 ]
もしかして 09 でなくて 0xa だったりして

754 名前:デフォルトの名無しさん [2008/12/13(土) 12:24:32 ]
すみません、c++のカスタムアロケータでの質問なんですが
カスタムアロケータとしてmy_allocatorを作り、
それを指定したbasic_stringを
typedef basic_string<char, char_traits<char>, my_allocator<char> > my_string;
と定義しました。

それでやりたいことなんですが
my_string ms = "ms test";
std::string ss = "ss test";
ms = ss;
と、アロケータの違うコンテナ同士で代入をしたいのです。

今はとりあえず
my_string ms = "ms est";
std::string ss = "ss test";
ms = ss.c_str();
としてますが、ちょっと不恰好で気になってしまいます。
なにかスマートな方法はありますでしょうか?




755 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:50:12 ]
assert(ms.size() >= ss.size());
std::copy(ss.begin(), ss.end(), ms.begin());

756 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:04:10 ]
おぉなるほど、イテレータを使えばいいんですね。
ありがとうございます。参考にして作ってみます。

757 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:19:49 ]
ss.assign(ms.begin(), ms.end());



758 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 18:59:03 ]
STLの仕様とかよく理解できてないから根本的におかしいかもだけど、
map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型)
コンパイルは通るんですが、insert()すると必ず失敗してしまいます。

759 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 19:12:31 ]
失敗ってどんな?

760 名前:758 mailto:sage [2008/12/15(月) 19:15:39 ]
>>759 insert()したときの戻り値の.secondが必ずfalseになる

761 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 20:35:44 ]
エラーが起きる最小限のソース貼ってみ

762 名前:758 mailto:sage [2008/12/15(月) 21:15:36 ]
↓にうpしときました
www3.uploda.org/uporg1858304.zip.html

Passはstlです

一応環境も書いときます
WinVista SP1
VS9

763 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 22:26:08 ]
一時オブジェクト?

764 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 22:45:41 ]
>>762
ttp://msdn.microsoft.com/en-us/library/ms632679.aspx
CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。
insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。

765 名前:758 mailto:sage [2008/12/15(月) 22:46:02 ]
ローカルのものをmapにはinsert出来ないということですか?

766 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:01:01 ]
764が言ってるのは、
自分でinsertを呼ぶよりも前に、WndProcが呼ばれて
LPFUNC lpfn = hoge[ hWnd ];
で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ

767 名前:758 mailto:sage [2008/12/15(月) 23:11:12 ]
なるほどやはり詳細な仕様を知らないで使うとへんなとこでバグになりますねー。
つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。



768 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:12:11 ]
>>765

// LPFUNC lpfn = hoge[ hWnd ];
// if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL;
これでinsertは成功

769 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:18:39 ]
わざわざエラー検査する必要ないのでは?
hoge[ hWnd ]=lpfn;
でいいじゃない

770 名前:758 mailto:sage [2008/12/15(月) 23:25:16 ]
無事解決しました。>>764 >>766 >>768ありがとでした。
ちょっとSTL関係の本を探して勉強しなおしてきますw

771 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:17:45 ]
STLというよりWindowsAPI、ウィンドウ生成周りの勉強だと思う

772 名前:758 mailto:sage [2008/12/16(火) 17:26:11 ]
CreateWindowが幾つかメッセージ送るのは知ってたんですが、
find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、
対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<158KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef