[表示 : 全て 最新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 以降

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でも使えば






[ 続きを読む ] / [ 携帯版 ]

前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