【C++】STL(Standard ..
511:デフォルトの名無しさん
08/11/16 01:53:37
これっておかしくない?
URLリンク(www.geocities.jp)
512:デフォルトの名無しさん
08/11/16 01:57:21
>>511
どこがどうおかしいと思うのか書けやカス
513:デフォルトの名無しさん
08/11/16 11:21:20
とりあえずテンプレートクラスはクラステンプレート
514:デフォルトの名無しさん
08/11/16 12:11:13
enumの値か?
515:デフォルトの名無しさん
08/11/16 12:14:51
それは別に間違ってなくね
516:デフォルトの名無しさん
08/11/16 12:16:41
MIRROR_X
517:デフォルトの名無しさん
08/11/16 12:24:52
問題ないだろ
MIRROR_X = SCALE | ROTATE
を意図して書いてあるならな。
518:デフォルトの名無しさん
08/11/16 12:35:10
はー?
519:デフォルトの名無しさん
08/11/16 12:50:45
enum bitset
二大不要物(笑)
520:デフォルトの名無しさん
08/11/16 12:54:39
enumを不要とか言うやつは素人
521:デフォルトの名無しさん
08/11/16 13:04:54
enum要らないとか言う奴はただのバカかTMPしない人だろ
522:デフォルトの名無しさん
08/11/16 13:08:23
>C言語であれば、ANDやOR等の演算を使って管理しますが、C++ではbitsetが利用できます。
この辺りで馬鹿を晒している。このサイトも勿論、私のダメサイトリストに載っている。
523:デフォルトの名無しさん
08/11/16 13:10:34
じゃぁbitsetってなんに使うの?
524:デフォルトの名無しさん
08/11/16 13:13:37
ビット単位のフラグの管理をせざるを得ないときに使うかなぁ。ま、そのときが来たら考えるよ。
525:デフォルトの名無しさん
08/11/16 13:16:23
>>522
上級者のあなたがおすすめするサイトを教えてください
526:デフォルトの名無しさん
08/11/16 13:20:55
>>523
>>519
527:522
08/11/16 13:23:15
残念ながら今のところ、初心者に安心してお勧めでキルサイトは見つけていない。
したがって、申し訳ないが期待には応えられない。
ちなみに、私のダメサイトリストは正しくは、「初心者にはお勧めできない(≒ダメ)サイトリスト」だ。
中級者辺りが読む分には、(自力で確認できるノウハウもあるだろうから)まぁ、悪くないかもしれない。
528:デフォルトの名無しさん
08/11/16 13:34:14
enumは型安全じゃないのが気に要らないな
529:デフォルトの名無しさん
08/11/16 13:35:07
C++のenumは、|=するだけでキャストが必要な糞仕様
530:デフォルトの名無しさん
08/11/16 13:44:26
俺は#define派
enumだとアセンブラソースから使えないから
531:デフォルトの名無しさん
08/11/16 13:54:37
>>529
そもそもビットフラグで使うとは限らないわけで…
532:デフォルトの名無しさん
08/11/16 14:08:21
>>519
unionに失礼だろw
533:デフォルトの名無しさん
08/11/16 16:05:41
それは128ビットとかに使うぞ
534:デフォルトの名無しさん
08/11/17 09:37:02
お前らみんな、unionさんに謝れ!
535:デフォルトの名無しさん
08/11/17 15:37:45
アマチュアの俺からすると分からんのだけど、unionって実際の業務で使われてるの?
enumなんかは割りと使ってるんだけど
536:デフォルトの名無しさん
08/11/17 15:48:34
>>535
使うこともあるよ。Cでbitsetもどきを実装するときとか。
537:デフォルトの名無しさん
08/11/17 17:54:37
大きな数値から上位ビットと下位ビット分けたり
538:デフォルトの名無しさん
08/11/17 18:04:00
・建前
unionは環境に激しく依存するから、使わない方がいい。
・本音
いまどきビッグエンディアンとか無いだろw
539:デフォルトの名無しさん
08/11/17 18:11:15
オレも、エンディアン、ビット幅、signedの右シフト、除算の符号は実装決めうちで作ってる
540:デフォルトの名無しさん
08/11/17 18:14:14
>>538
サーバ系では未だにSunが頑張っているから無視できないのよね。
541:デフォルトの名無しさん
08/11/17 18:33:05
うにおんは組み込みCで以前使ってた事がある
おそらく今でも使ってる
542:デフォルトの名無しさん
08/11/17 18:45:55
1の補数はもう絶滅でいいだろ
543:デフォルトの名無しさん
08/11/17 18:50:13
引き算どうすんだよw
544:デフォルトの名無しさん
08/11/17 18:59:06
負数の表現方法のことだろ。
545:デフォルトの名無しさん
08/11/17 19:17:14
それは2の補数
546:デフォルトの名無しさん
08/11/17 19:19:57
Wikipedia項目リンク
547:デフォルトの名無しさん
08/11/17 22:16:38
よその言語だとASCIIにIEEE754も決め打ちと化しているものもあるよな。
548:デフォルトの名無しさん
08/11/17 23:10:13
未だにIBMのサーバでEBCDICとかあるから油断できない
549:デフォルトの名無しさん
08/11/17 23:51:08
>>538
俺はエンディアン入れ替えたいからunion使ってる。
union {
double a;
char b[8];
}
550:デフォルトの名無しさん
08/11/17 23:54:30
つーかネットワークバイトオーダはbigだし
画像処理でもエンディアン入れ替えなんてよくやるでしょ
全部littleで済むと思ってる人ってどういう世界に生きてるんだ?
551:デフォルトの名無しさん
08/11/18 00:08:27
意識する場面なんてほとんどないな
552:デフォルトの名無しさん
08/11/18 00:11:46
>>550
そういうときに、必ずエンディアン変換を挟むコードを書いてしまう(あるいは書かない)
というのがエンディアン決め打ちのコーディングだと思う。
553:デフォルトの名無しさん
08/11/18 00:14:19
#ifdefるだろjk
554:デフォルトの名無しさん
08/11/18 00:41:30
いや、自動判断する。
例えばtiffはヘッダのIかMかで判断できるし、実行環境がどっちなのかはint foo = 0とでもして& fooをchar *にキャストして取り出せば判る。
555:554
08/11/18 00:51:28
s/int foo = 0/int foo = 1/
まぁ、unionは使わないけれど。
556:デフォルトの名無しさん
08/11/18 00:53:15
スレから脱線するが、標準の方法でエンディアンをコンパイル時に知る方法ってある?
実行時ならできるんだが
557:デフォルトの名無しさん
08/11/18 00:58:32
boost/detail/endian.hppとかを見る限り、標準では無さそうだね
558:デフォルトの名無しさん
08/11/18 01:50:26
>>556
コンパイル環境のエンディアンを?
それとも、ターゲット環境?
559:デフォルトの名無しさん
08/11/18 01:58:09
>>556
VxWorksなら_BYTE_ORDERのdefine見れば分かるが他はしらん。
560:デフォルトの名無しさん
08/11/18 13:28:05
>>554
PDP-11位だしな変態なの
561:デフォルトの名無しさん
08/11/18 14:44:19
>>560
お前はSun、IBM、MIPSを敵に回した。
562:デフォルトの名無しさん
08/11/19 16:25:22
vectorについてですが
array.reserve(array.size());
でぴったりのサイズに変わるかと思ったのですが変わりません。
大きなデータを扱ったりする場合、ぴったりのサイズで作り直した方が
メモリが節約できるかと思うのですが、なぜうまくいかないのでしょうか。
何かいい方法はないでしょうか?
563:デフォルトの名無しさん
08/11/19 16:28:10
vector<T>(array).swap(array);
564:デフォルトの名無しさん
08/11/19 16:32:01
reserveは拡大する方向にしか働かないのでは
565:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/19 16:37:52
おっと
equal to the previous value of capacity() otherwise.
ともあるから、縮小しようとしてもcapacity()は変化しない事になる。
詰まるところ>>563のようにスワップ技法に頼るしかない。
567:562
08/11/20 11:20:10
>>563-566
出来ました。ありがとうございます。
サイズの縮小は出来ないんですね。勉強になりました
568:デフォルトの名無しさん
08/11/21 01:13:58
今までイテレータが指してるコンテナのことをイテランドと呼んでたんですが
そんなの聞いたことないって言われました
ぐぐってもほとんど出てこないので不安になってきたんですが(「イテランド」だとゼロ…)
普通に使いますよね?
569:デフォルトの名無しさん
08/11/21 01:17:07
はつみみです
570:デフォルトの名無しさん
08/11/21 01:18:50
ぐぐった時点で気づいてるだろwwww俺は聞いたこと無いな
iterandにしたら多少出てくるけど、まぁスズメの涙ね
571:デフォルトの名無しさん
08/11/21 01:24:17
あーやっぱり?
iterandは1000件くらい引っかかるから、わざわざカタカナにしないだけで
あっちでは普通の言葉かもしれないと思ってたんですが
じゃあ皆さんはイテレータが指してるコンテナのことはなんて呼んでるんでしょう
「イテレータが指してるコンテナ」ですか?
572:デフォルトの名無しさん
08/11/21 01:24:23
イテレータが指してるコンテナ?
vector<int>::iterator it;
だと
vectorが「イテランド」になんの?
573:デフォルトの名無しさん
08/11/21 01:27:10
例えば
vector<int> v;
vector<int>::iterator it = v.begin();
なら、itはvのイテレータで、vはitのイテランドです
574:デフォルトの名無しさん
08/11/21 01:38:03
iterateeとか言ってみる。
575:デフォルトの名無しさん
08/11/21 03:09:59
Pythonではiterable
576:デフォルトの名無しさん
08/11/21 03:40:26
>>575
それは意味が全然違う
577:デフォルトの名無しさん
08/11/21 03:50:39
iterable はまんまイテレータ(とみなせるもの)。
578:デフォルトの名無しさん
08/11/21 12:37:36
itのコンテナ 程度にしか言わないな
579:デフォルトの名無しさん
08/11/21 12:54:20
イテランドがまあ、何を指している言葉かは
オペレータ⇔オペランド
からの類推でわかるけどさ。
それより世間一般ではイテレータなんだろうが、
俺はついついイタレータと読み書きしてしまう今日この頃。
580:デフォルトの名無しさん
08/11/21 13:15:51
>>579
おいたが過ぎますぞ
581:デフォルトの名無しさん
08/11/21 17:24:11
いてまうどー
582:デフォルトの名無しさん
08/11/21 17:52:19
とりあえず、イテランドがあんまり一般的な言葉じゃないことはよくわかりました
内輪以外では使うのを控えることにします
ありがとうございました
583:デフォルトの名無しさん
08/11/22 02:05:31
あんまりという表現なのか・・・w
584:デフォルトの名無しさん
08/11/22 02:41:16
つうかどこでその言葉を習ったんだろ
585:デフォルトの名無しさん
08/11/22 15:27:41
イテランドでぐぐるとこのスレが引っかかるなw
586:デフォルトの名無しさん
08/11/22 15:47:04
イテランドたんのアニメ化が決定したそうです。
587:デフォルトの名無しさん
08/11/22 16:56:13
とある言語の被反復構造(イテランド)
588:デフォルトの名無しさん
08/11/22 17:09:09
パパ〜遊園地いきたーい
よーし家族みんなでイテランドにでもいくか〜
589:デフォルトの名無しさん
08/11/22 17:16:39
井手ランド
590:デフォルトの名無しさん
08/11/22 17:32:30
とある要素の列挙目録(イテレータ)
591:デフォルトの名無しさん
08/11/22 17:46:29
イテランドたんの要素数は103000ですね、わかります。
592:デフォルトの名無しさん
08/11/22 18:29:32
変数 X が std::list 型で変数 I がその reverse_iterator だとすると
X.erase( I.base() );
で I が示す要素の隣を消去するので I はまだ使えますよね。
VC8 で I を使うと assert で止まるんですけど。
593:デフォルトの名無しさん
08/11/22 18:55:16
その1行だけ示されてもなあ。
594:デフォルトの名無しさん
08/11/22 19:24:06
デバッガで追えばいいじゃん……
595:デフォルトの名無しさん
08/11/22 19:29:51
string strに入っている文字列のi番目から後ろをstr2に代入するにはどうすればいいですか?
596:デフォルトの名無しさん
08/11/22 19:56:15
str2 = str.substr(i);
597:デフォルトの名無しさん
08/11/22 19:57:28
substr
598:デフォルトの名無しさん
08/11/22 20:06:38
>>592
使えない
599:デフォルトの名無しさん
08/11/22 20:25:38
595です。ありがとうございました。あとstringを==で比較するときに小文字と大文字を区別しな方法はありますか?
一度変換しないとだめでしょうか?
600:デフォルトの名無しさん
08/11/22 21:06:58
stringはそもそも「大文字と小文字」っていう概念が無いと思う
601:デフォルトの名無しさん
08/11/22 21:10:43
大文字だの小文字だのは真面目にやり出すと大変だぞ
ロケールの問題とか
602:デフォルトの名無しさん
08/11/22 21:19:34
>>598
std::list の reverse_iterator の場合は1つ後の要素を消去したとき無効になるんですね。
603:デフォルトの名無しさん
08/11/22 21:23:31
stringは複雑なんですね・・・わかりました
604:デフォルトの名無しさん
08/11/22 21:30:16
複雑なのはstringではなく、真の国際化です
605:デフォルトの名無しさん
08/11/22 21:51:06
"ガ"と"ガ"を==で比較してtrueにできないからstd::stringはクソ
606:デフォルトの名無しさん
08/11/22 21:54:04
CLでいうところのequalpを手前で実装しろクソ
607:デフォルトの名無しさん
08/11/22 21:58:17
@と`を同じ文字と解釈するべき環境とかあるからな
608:デフォルトの名無しさん
08/11/22 21:59:34
7bit ASCII内での大文字小文字無視なら、char_traits自作でやる実装を何かの本で見た。
609:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/22 22:04:09
引数
611:デフォルトの名無しさん
08/11/22 22:11:52
引数なのはわかるんですが・・・
void func(deque<HOGE> &pairs){
}
main(){
func(pairs);
}
こうですかね?
612:デフォルトの名無しさん
08/11/22 22:15:07
>もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。
むちゃくちゃだ。
613:デフォルトの名無しさん
08/11/22 22:20:12
えっと具体的にどうおかしいですか?
614:デフォルトの名無しさん
08/11/22 22:22:48
頭がおかしい
615:デフォルトの名無しさん
08/11/22 22:35:40
mainのスコープを抜ける=プログラムが終わる
プログラムが終わった後にdequeが初期化されるって、
atexit内で初期化したいのか
616:デフォルトの名無しさん
08/11/22 23:14:48
>>615
ちょっと表現を間違えました。
617:デフォルトの名無しさん
08/11/22 23:44:46
えっとそれで611で大丈夫ですかね?
618:デフォルトの名無しさん
08/11/23 00:42:48
private な vector<int> hoge を外部から走査して数値を得たい
const int *mage = &hoge;
のような方法でするのかな?と思ったんですが
セオリーな方法はどんな書き方なんでしょうか
619:デフォルトの名無しさん
08/11/23 00:45:27
参照せずに値じゃね?
620:618
08/11/23 00:45:59
いやいまいちお前がなにいってんのかわかんないけど
621:デフォルトの名無しさん
08/11/23 00:47:43
hogeをスキャンして数値を返すメソッドを公開すればいいじゃない
622:デフォルトの名無しさん
08/11/23 00:52:10
プレイベートなデータなので、捜査には礼状が必要です。
623:デフォルトの名無しさん
08/11/23 00:53:45
vectorの中身は連続性が保証されている、
つまりprivateなvectorの、先頭アドレスを返すような関数作って
それをconst int * で受け取り(もちろんサイズも)、
そのconst int * を走査するのかな?と思ったけど
書き方がわかんないから>>618になってしまった
ゴメンナサイ(´・ω・`)
624:デフォルトの名無しさん
08/11/23 00:58:23
beginとendのペアを返す
625:デフォルトの名無しさん
08/11/23 01:02:01
>>621に一票
626:デフォルトの名無しさん
08/11/23 01:09:49
>>621
スキャンって・・・?
丸ごとコピーしてそれを返す?
内部でiterator保持して呼び出す毎に進める?
現場の人じゃないから、その手の語彙力ないんだわ(´・ω・`)
ちなみに具体的にはintではなく
x,y座標が入ってるpair<int,int>で
これを取得してGUIでリアルタイムに線を引きたい
という状況です
627:デフォルトの名無しさん
08/11/23 01:23:53
現場の人とか関係ねーw
>>618の走査 == >>621のスキャン
だろOKJK
それから情報後出しって嫌われるの知らないかね
いいから黙ってソースコードべたっと貼れ
628:デフォルトの名無しさん
08/11/23 01:27:26
では俺はコールバックを提案しよう。
629:618
08/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:デフォルトの名無しさん
08/11/23 02:28:25
const std::vector<Pos>& ppp() const { return p; } でいいじゃん
631:デフォルトの名無しさん
08/11/23 14:43:29
int function(string &buff){
}
main(){
string buff:
function(buff);
}
mainで宣言したstringに関数で値を入れるには、これであってます?
632:デフォルトの名無しさん
08/11/23 14:45:30
>>631
いいよ。
633:デフォルトの名無しさん
08/11/23 14:50:04
ありがとうございます。
functionでの代入時は
buff ="mozi";
みたいな感じでいいですか?
634:デフォルトの名無しさん
08/11/23 14:51:30
俺ルールだと、関数で値を入れる場合はポインタ渡しにして、
単に値を渡すだけなら参照にしてるな。
635:デフォルトの名無しさん
08/11/23 14:56:47
>>633
それでいいよ。
値を渡すだけでも、返してもらうときでも参照でいいよ。
const のあるなしで区別すればOK
636:デフォルトの名無しさん
08/11/23 14:57:54
>>634
M$ なんかが当初そういう方針だった気がするな。
NULL チェックが必要になるから個人的には微妙なんだが・・・。
637:デフォルトの名無しさん
08/11/23 16:31:25
>>635
賛成。
それとは別に、俺は std::string 程度なら値を返すようにしたい。
function().length() したいだけだったり、function() で代入したものを他の関数に渡したいだけだったりした時に、わざわざローカル変数を作らなければならないから。
また、ローカル変数に代入すべき場合のうちで初期化後に変更しないものに const を付けられなくなるから。
オーバーロードして両方のバージョンを用意すればいいだけだけど。
638:デフォルトの名無しさん
08/11/23 19:27:34
>>635 こうしろと?
int& function(string &buff){
639:デフォルトの名無しさん
08/11/23 19:28:40
>>638
いや、引数の話だよ。
640:デフォルトの名無しさん
08/11/23 19:58:24
>>635
int function(int&, double& )とかした場合
function( 1, 0.1) は使えないだろ
こんな使い方禁止?
641:デフォルトの名無しさん
08/11/23 20:05:30
>>640
直前のカキコとか見れよ。
引数で値を返してもらいたいとき、constなしの参照つかえって意味だから、
そういう使い方は意味ないだろ。
642:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/24 19:27:10
>>642
read<short>(input) とかいう関数でも作れば良いんじゃない?
644:デフォルトの名無しさん
08/11/24 20:13:34
>>642
short header1, header2;
if(input >> header1 >> header2) {
// ...
}
645:デフォルトの名無しさん
08/11/24 20:26:01
>>644
そんな餌に(AAry
646:642
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/25 16:55:04
>>647
コンテナの種類とランダムアクセスイテレータに関して
も少し理解を深めといた方が。
649:デフォルトの名無しさん
08/11/25 16:57:49
>>647
std::advance()
650:デフォルトの名無しさん
08/11/25 17:16:49
>>648
ランダムアクセスをしたいならvectorを使うべきだと?
一般論ではそうでしょう。
しかし、
vectorの場合、挿入・削除におけるコストは配列要素の数が増えるに従って等差級数的に増大します。
listの場合は配列要素の数にかかわらずコストは一定です。
だから、配列要素の数と、挿入・削除・ランダムアクセスの頻度を考えて、
処理速度的に最適なものを選びたいと思っています。
それで私のケースではvectorよりlistが妥当だと判断した訳ですが、ソースの記述がブサイクだと言ったまでです。
>>649
listの要素の入れ替えをしたくはないのです。
651:デフォルトの名無しさん
08/11/25 17:22:20
>>650
つdeque
ランダムアクセスできて挿入も速い
652:デフォルトの名無しさん
08/11/25 17:26:38
>>651
私のケースでは、挿入・削除を行う位置は先頭・末尾でないことが圧倒的に多いのです。
653:デフォルトの名無しさん
08/11/25 17:41:22
>>652
dequeは途中の挿入も(そこそこ)速いんだよ。
dequeの仕様を満たそうとすると、どうしてもそういう実装になる。
654:デフォルトの名無しさん
08/11/25 18:02:08
>>650
要件がいまいちつかめないので何ともいえないけど、
規格を眺めてlistが最適だと思うなら仕方がないんじゃない?
listはランダムアクセス出来ないしね。
でも、std::advanceの認識からしてSTLの理解甘そうだし、もう一度規格眺めることをおすすめするよ
655:デフォルトの名無しさん
08/11/25 18:14:47
>>652
要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ
656:デフォルトの名無しさん
08/11/25 18:39:03
周りがアドバイスしても結局自分の方法に固執するんじゃ
何言っても意味ないよ
そういうのはほっとくに限る
657:デフォルトの名無しさん
08/11/25 18:44:27
挿入/削除が多いならリストを使うべきだろ
ときどきランダムアクセスが必要ならstd::advanceで
658:デフォルトの名無しさん
08/11/25 18:51:51
advanceを思いっきり勘違いしてる節があるよね
659:デフォルトの名無しさん
08/11/25 18:58:49
>>655
配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。
VS2005でコンパイルした場合だけど。
660:デフォルトの名無しさん
08/11/25 19:05:31
>>659
何が?
661:デフォルトの名無しさん
08/11/25 19:28:06
用途によっては挿入/削除/ランダムアクセスが全部O(log n)のデータ構造も検討するといいかもな
STLにはないけど
662:デフォルトの名無しさん
08/11/25 19:31:05
>>647より後の返答カキコ 本当に>>647なのか?
おまえら、誰かに釣られてないか?
IDのない板って、なりすまし可能だからな
663:デフォルトの名無しさん
08/11/25 19:35:42
質問に答えてるだけなんだから、>>647と>>650が同一人物であろうとなかろうと何も関係ない
釣りだったとしても痛くも痒くもない
664:デフォルトの名無しさん
08/11/25 20:03:28
std::vector<要素 *>
665:デフォルトの名無しさん
08/11/25 20:30:10
skip listか
んなもんわざわざ使うなら普通にlistでもいいと思うけどな
666:デフォルトの名無しさん
08/11/25 20:40:43
setについて質問です
URLリンク(www5c.biglobe.ne.jp)
要素の追加(追加場所をイタレーターで指定) 定数時間
とありますが、追加場所をイタレーターで指定とはどういうことですか?
insert関数ではないですよね?
667:デフォルトの名無しさん
08/11/25 21:02:51
>>647はlistを使うのを前提として質問していて
listの代わりに何が良いかは質問してないようによめるのだが
668:デフォルトの名無しさん
08/11/25 21:04:52
>>666
insertのことだと思うが
669:デフォルトの名無しさん
08/11/25 21:11:14
>>666
setにはイテレータを指定するinsertと指定しないinsertがあるよ
670:デフォルトの名無しさん
08/11/25 21:15:27
vectorにそのままクラスを入れるとコピーコンストラクタを何度も呼び出してるようなので
クラスのポインタを入れて使おうかと思ってるのですが
何か注意しなければ行けない点はありますか?
671:デフォルトの名無しさん
08/11/25 21:17:35
>>670
ないです。
672:デフォルトの名無しさん
08/11/25 21:18:02
あります
vectorから取り除いたときのdeleteし忘れ
673:デフォルトの名無しさん
08/11/25 21:20:48
>>670
オブジェクトの多重参照
674:デフォルトの名無しさん
08/11/25 21:54:32
FUGAはduobleとstringのpairです
multiset<FUGA> huga;
にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか?
count関数がありますけど使い方が・・・
huga.count("hogehoge");みたいな感じで使いたいんです
675:デフォルトの名無しさん
08/11/25 22:04:16
>>674
count_if()
676:デフォルトの名無しさん
08/11/25 23:21:30
>>671-673
サンクス deleteしなきゃだったんだな
ありがとう
677:デフォルトの名無しさん
08/11/26 00:50:01
>>670
ptr_vectorでも使えば
678:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/26 11:18:38
>>678
data.begin() + 10
680:デフォルトの名無しさん
08/11/26 12:37:31
const_iterator を iterator に変換するために distance() と advance() を使う方法が
Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で
変換できません。
std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?
681:デフォルトの名無しさん
08/11/26 15:34:21
typedef std::set<A,B> C
std::set<C::const_iterator,C::iterator>
を作って変換しろ
682:デフォルトの名無しさん
08/11/26 15:46:58
>>681
std::set, std::map の検索は普通の実装で対数時間
683:デフォルトの名無しさん
08/11/26 18:49:39
*reinterpret_cast<std::set<A>::iterator*>(&cit)
大体の実装なら通るよ
細かいこと気にすんなってwwwww
684:デフォルトの名無しさん
08/11/26 20:24:23
対数時間なら別にいいんじゃね
685:デフォルトの名無しさん
08/11/27 01:02:08
>>680
とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?
686:デフォルトの名無しさん
08/11/27 01:35:37
>>680
定数時間にこだわるんならどうぞ
std::tr1::unordered_map<C::const_iterator, C::iterator>
687:デフォルトの名無しさん
08/11/30 15:23:23
vector<vector<T> > WArray;
WArray warr (100, vector<T>(10));
T型の2次元配列を作る場合、このようにすることが多いのだけど
全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ
を知りたい場合、方法は無いのでしょうか?
688:デフォルトの名無しさん
08/11/30 15:44:30
> 全体のデータサイズは、size_of()関数で取得できるけど、
できるか?
689:デフォルトの名無しさん
08/11/30 15:57:26
>>688
>>687です
ごめんなさい、間違えました
size_t size = warr.size();
こうでしたね(^^;
690:デフォルトの名無しさん
08/11/30 16:29:30
いや、それ全体じゃないから。
691:デフォルトの名無しさん
08/11/30 17:38:11
detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdbの解決方ありますか?
692:デフォルトの名無しさん
08/11/30 17:41:32
マルチ市ね
693:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/30 18:34:07
さっさとしね
695:デフォルトの名無しさん
08/11/30 19:02:34
大体わかるけどマルチ野郎には絶対教えない
696:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/04 00:17:04
何やりたいかによるだろうが、単に vector vector ではだめなの?
698:デフォルトの名無しさん
08/12/04 00:26:09
aやbがなければvector<vector<pair<string, string>>>でいけるかな。問題は、
aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。
おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。
699:デフォルトの名無しさん
08/12/04 00:31:12
mapでいいだろ
700:デフォルトの名無しさん
08/12/04 00:32:12
楽しようと思えばmap<string,map<string, string> >かなぁ
701:デフォルトの名無しさん
08/12/04 00:51:58
>>698
なんかよくわからんが、vector<pair<>> を含む class を作れば
いいのかな。出力もメンバ関数でもできるし。
702:デフォルトの名無しさん
08/12/04 01:17:48
multimap<string,pair<string,string>>とかかな・・・
S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR")))
みたいなのを表現したいってことなら
703:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/04 02:41:11
定数時間でa->foo->FOOと引く必要あるなら、map二段構えが一番楽じゃね。
705:696=698
08/12/04 06:11:17
レスありがと。
なるほど、色々手はありそうだね。
ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。
# 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w
706:デフォルトの名無しさん
08/12/04 20:31:19
vectorを配列っぽく使ってるんですが、
eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか?
vec.erase(vec[5])
vec[5].erase()
みたいなことはできませんか?
707:デフォルトの名無しさん
08/12/04 20:34:31
begin()+5
708:706
08/12/04 20:36:56
おおー。感動です。ありがとうございました。
709:デフォルトの名無しさん
08/12/04 22:10:14
まあ使い辛いとは思うがな・・・。
710:デフォルトの名無しさん
08/12/04 22:28:47
関数の戻り値を直接 + とか . で使えることを初めて知ったときは感動したな。
とどうでもいい回顧
711:デフォルトの名無しさん
08/12/04 22:29:42
. はともかく + は・・・。
数学的に、単独の方が違和感あると思われ。
712:デフォルトの名無しさん
08/12/04 22:34:59
右辺値やな
713:デフォルトの名無しさん
08/12/05 00:12:57
for_eachの使い方を知ったときは感動したけどやっぱり使いづらい
714:デフォルトの名無しさん
08/12/05 00:21:25
lambda なしに for_each だけあってもね・・・。
715:デフォルトの名無しさん
08/12/05 10:23:09
range adapterも欲しいナ
716:デフォルトの名無しさん
08/12/05 18:00:27
rangeベースのforとアルゴリズムとlambdaだけでもwktkが止まらない
717:デフォルトの名無しさん
08/12/06 15:46:46
deque<string> buff;
にpusu_back()は定数時間ですか?それと
buff[0]みたいなアクセスはありですか?
718:デフォルトの名無しさん
08/12/06 16:32:10
「deque push_back 定数時間」でググれば、皆同じことを言っているし、
buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、
何故こういう質問が書き込まれるんだろう。
あと、「みたいな」っていうのがよくわからん。
それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、
その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。
もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、
そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。
答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。
719:デフォルトの名無しさん
08/12/06 16:39:40
>>718
そんなのはいいから答え教えろかす
720:デフォルトの名無しさん
08/12/06 16:46:12
長々となに書いてんだろ PC触りすぎて酸素欠乏症なのかな
721:デフォルトの名無しさん
08/12/06 16:49:17
std::dequeはrandom access containerとback insertion sequenceの要件を満たしているので
operator[]によるrandom accessが可能かつ、
push_backによる要素追加は償却で定数時間であることが保証されています
722:デフォルトの名無しさん
08/12/06 17:45:09
>>720
> 長々となに書いてんだろ
馬鹿が読むと煽りたくなるアドバイスじゃない?
723:デフォルトの名無しさん
08/12/06 18:13:35
むしろpush_backが償却定数時間よりひどいコンテナなんて無いだろw
724:デフォルトの名無しさん
08/12/06 18:18:33
これらの操作を提供するための条件として規定されてるからね。
725:デフォルトの名無しさん
08/12/07 22:15:49
set とかは insert だしな。
726:デフォルトの名無しさん
08/12/09 14:44:05
vectorの2次元配列はどうすればいいんですか?
2次元目も動的にしたいんです
727:デフォルトの名無しさん
08/12/09 15:04:51
vector<vector<int> > v;
728:デフォルトの名無しさん
08/12/09 16:27:55
ありがとっ
729:デフォルトの名無しさん
08/12/09 17:01:36
これって問題ある?
class CVector
{
vector<int> A;
}
vector<CVector> B;
CVector.A.resize(10);
B.resize(10);
730:デフォルトの名無しさん
08/12/09 17:03:22
class CVector
{
vector<int> A;
}←セミコロンがない
vector<CVector> B;
CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい
B.resize(10);
731:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/09 17:24:20
やばい
2次元配列じゃなくなってる
意味ねぇ
733:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/09 17:44:36
うわ・・・これダメだ
735:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/09 17:56:13
いやそれです。ありがとう
それだと全部同じ配列数になるのかと思ってしまった。
vec[0].resize(10);
vec[5].resize(20);
こう出来たんだ。
暴れてしまった・・・すまんTHX
737:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 11:33:26
いいえ。
739:デフォルトの名無しさん
08/12/11 11:37:41
>>737
> vector<vector<int>>
まずこれがだめ。正しくは
vector<vector<int> >
2行目はコンパイル通らない。
3行目と4行目も意味がめちゃくちゃ。
740:デフォルトの名無しさん
08/12/11 12:27:03
ポインタをインデクサで参照して実態をアロー演算子で参照してるがな
大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし
つーか何でポインタが出てくんの?w
741:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 12:44:08
ありがと。
本2冊読んで> >の間のスペースがわからないのがやばい
vector<vector<int> > vint;
vector<vector<char> > vchar;
ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど
vector<vector>* pvec = char;
ここの書き方がわからないお願い!
743:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/11 13:27:33
>>742
共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。
なので>>743の方法になる。
745:デフォルトの名無しさん
08/12/11 13:40:36
いや何を書いてあるのかがわからなかった
コンテナの前にテンプレートを勉強してくる
ありがと、まじありがとっ
746:デフォルトの名無しさん
08/12/11 13:45:38
今更勉強するより0xまで待った方がいいかもなー
747:デフォルトの名無しさん
08/12/11 23:41:07
それは0x完全対応コンパイラを待ってから勉強するってこと?
あ、老後の楽しみか
748:デフォルトの名無しさん
08/12/12 06:28:40
なに微妙に興奮してんのw
749:デフォルトの名無しさん
08/12/12 07:10:55
>>748
オ○ニーしながらだからねw
750:デフォルトの名無しさん
08/12/12 09:04:47
上級者すぐるw
751:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/13 10:34:59
0x ってもうあと一年しか残ってないんだ
753:デフォルトの名無しさん
08/12/13 12:13:07
もしかして 09 でなくて 0xa だったりして
754:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/13 12:50:12
assert(ms.size() >= ss.size());
std::copy(ss.begin(), ss.end(), ms.begin());
756:デフォルトの名無しさん
08/12/13 13:04:10
おぉなるほど、イテレータを使えばいいんですね。
ありがとうございます。参考にして作ってみます。
757:デフォルトの名無しさん
08/12/13 13:19:49
ss.assign(ms.begin(), ms.end());
758:デフォルトの名無しさん
08/12/15 18:59:03
STLの仕様とかよく理解できてないから根本的におかしいかもだけど、
map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型)
コンパイルは通るんですが、insert()すると必ず失敗してしまいます。
759:デフォルトの名無しさん
08/12/15 19:12:31
失敗ってどんな?
760:758
08/12/15 19:15:39
>>759 insert()したときの戻り値の.secondが必ずfalseになる
761:デフォルトの名無しさん
08/12/15 20:35:44
エラーが起きる最小限のソース貼ってみ
762:758
08/12/15 21:15:36
↓にうpしときました
URLリンク(www3.uploda.org)
Passはstlです
一応環境も書いときます
WinVista SP1
VS9
763:デフォルトの名無しさん
08/12/15 22:26:08
一時オブジェクト?
764:デフォルトの名無しさん
08/12/15 22:45:41
>>762
URLリンク(msdn.microsoft.com)
CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。
insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。
765:758
08/12/15 22:46:02
ローカルのものをmapにはinsert出来ないということですか?
766:デフォルトの名無しさん
08/12/15 23:01:01
764が言ってるのは、
自分でinsertを呼ぶよりも前に、WndProcが呼ばれて
LPFUNC lpfn = hoge[ hWnd ];
で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ
767:758
08/12/15 23:11:12
なるほどやはり詳細な仕様を知らないで使うとへんなとこでバグになりますねー。
つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。
768:デフォルトの名無しさん
08/12/15 23:12:11
>>765
つ
// LPFUNC lpfn = hoge[ hWnd ];
// if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL;
これでinsertは成功
769:デフォルトの名無しさん
08/12/15 23:18:39
わざわざエラー検査する必要ないのでは?
hoge[ hWnd ]=lpfn;
でいいじゃない
770:758
08/12/15 23:25:16
無事解決しました。>>764 >>766 >>768ありがとでした。
ちょっとSTL関係の本を探して勉強しなおしてきますw
771:デフォルトの名無しさん
08/12/16 12:17:45
STLというよりWindowsAPI、ウィンドウ生成周りの勉強だと思う
772:758
08/12/16 17:26:11
CreateWindowが幾つかメッセージ送るのは知ってたんですが、
find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、
対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4777日前に更新/158 KB
担当:undef