C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: dequeから文字列作成


(過去ログ 53 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■29439 / inTopicNo.1)  dequeから文字列作成
  
□投稿者/ ナツ (3回)-(2008/12/09(Tue) 19:50:34)

分類:[C/C++] 

VC++2003です。

deque<char>型の配列があります。
この配列は全ての要素を繋げる事で文章になります。
その文章を「文章」として扱いたく、std::stringもしくはchar*変数に変換したいと思っています。

ただ、文章が長く数千文字に及び、さらにそれを何回も繰り返す為、できればループは避けたいです。

何か一発で解決できる方法がありましたら教えてください。

例)
deque<char> dq;
std::string str;

dq.push_back('a');
dq.push_back('b');
dq.push_back('c');

str = ????????; ←ココがわかりません

cout << str << endl;

実行結果:abc

よろしくお願いします。
引用返信 編集キー/
■29440 / inTopicNo.2)  Re[1]: dequeから文字列作成
□投稿者/ Jitta on the way (241回)-(2008/12/09(Tue) 20:03:56)
No29439 (ナツ さん) に返信
> VC++2003です。
>
> deque<char>型の配列があります。
> この配列は全ての要素を繋げる事で文章になります。
> その文章を「文章」として扱いたく、std::stringもしくはchar*変数に変換したいと思っています。
>
> ただ、文章が長く数千文字に及び、さらにそれを何回も繰り返す為、できればループは避けたいです。
>
> 何か一発で解決できる方法がありましたら教えてください。
>
> 例)
> deque<char> dq;
> std::string str;
>
> dq.push_back('a');
> dq.push_back('b');
> dq.push_back('c');
>
> str = ????????; ←ココがわかりません
>
> cout << str << endl;
>
> 実行結果:abc
>
> よろしくお願いします。

関数作れば?
引用返信 編集キー/
■29442 / inTopicNo.3)  Re[2]: dequeから文字列作成
□投稿者/ ナツ (4回)-(2008/12/09(Tue) 20:17:59)
No29440 (Jitta on the way さん) に返信

お返事ありがとうございます。


> 関数作れば?

すいません、初心者なもので、関数のロジックが思いつきません。

考えてみても、関数を作ってもけっきょくその関数内でループしてしまいます。

ヒントだけでもいただけないでしょうか?

引用返信 編集キー/
■29444 / inTopicNo.4)  Re[3]: dequeから文字列作成
□投稿者/ .SHO (343回)-(2008/12/09(Tue) 20:25:22)
No29442 (ナツ さん) に返信

> さらにそれを何回も繰り返す為、できればループは避けたいです。

なんのために避けたいのですか?

> 考えてみても、関数を作ってもけっきょくその関数内でループしてしまいます。

呼び出し側が何個あろうが、関数内のループ1個で済むということだと思います。
引用返信 編集キー/
■29445 / inTopicNo.5)  Re[4]: dequeから文字列作成
□投稿者/ ナツ (5回)-(2008/12/09(Tue) 20:38:09)
No29444 (.SHO さん) に返信

お返事有難うございます。

> なんのために避けたいのですか?

ループを使ったロジックを作ったのですが、それだと10秒近くかかってしまいました。
原因としては、dequeの内容を一文字ずつstd::stringに繋げている為のようです。
数千回のループを何十回も行うのでそれだけ時間もかかっているのだと思います。

> 呼び出し側が何個あろうが、関数内のループ1個で済むということだと思います。

そういう意味では関数化しているのですが、実際に回す回数が変わる訳ではないのでやはり短縮になりません。

色々ネットでも探しているのですが全然見つからずに困っています。
これだけ探して無いって事は「配列の内容を全部くっつける」という需要ってあまりないのでしょうか?
メソッドか何かあれば発想としては結構使われそうな気がするんですが…
引用返信 編集キー/
■29446 / inTopicNo.6)  Re[1]: dequeから文字列作成
□投稿者/ アキラ (131回)-(2008/12/09(Tue) 20:38:50)
アキラ さんの Web サイト
No29439 (ナツ さん) に返信

<numeric>をインクルードして

string str = accumulate(d.begin(), d.end(), string(""));
引用返信 編集キー/
■29447 / inTopicNo.7)  Re[2]: dequeから文字列作成
□投稿者/ アキラ (132回)-(2008/12/09(Tue) 20:46:55)
アキラ さんの Web サイト
もしくは、std::stringのコンストラクタで

string str(d.begin(), d.end());
引用返信 編集キー/
■29448 / inTopicNo.8)  Re[3]: dequeから文字列作成
□投稿者/ ナツ (6回)-(2008/12/09(Tue) 20:53:04)
No29447 (アキラ さん) に返信

お返事有難うございます。

> もしくは、std::stringのコンストラクタで
>
> string str(d.begin(), d.end());

無事解決しました!

なんか「なるほど〜」の一言です^^;
お陰様で開始〜終了までが2秒ほどに縮まりました!

有難うございました!
またよろしくお願いします!
解決済み
引用返信 編集キー/
■29477 / inTopicNo.9)  Re[4]: dequeから文字列作成
□投稿者/ あー (11回)-(2008/12/10(Wed) 11:25:26)
ところでVCのstd::stringの
string str(d.begin(), d.end());
の形のコンストラクタはforループを使って実装されているわけだが
引用返信 編集キー/
■29478 / inTopicNo.10)  Re[5]: dequeから文字列作成
□投稿者/ あー (12回)-(2008/12/10(Wed) 11:26:25)
しまった解決済はずしてしまった
解決済み
引用返信 編集キー/
■29485 / inTopicNo.11)  Re[5]: dequeから文字列作成
□投稿者/ επιστημη (1443回)-(2008/12/10(Wed) 11:38:14)
επιστημη さんの Web サイト
> string str(d.begin(), d.end());
> の形のコンストラクタはforループを使って実装されているわけだが

dequeの要素を
operator[i]でくるくる拾う と
iteratorを++する とのパフォーマンスの差かもですね。

解決済み
引用返信 編集キー/
■29488 / inTopicNo.12)  Re[6]: dequeから文字列作成
□投稿者/ .SHO (354回)-(2008/12/10(Wed) 11:42:40)
2008/12/10(Wed) 11:43:25 編集(投稿者)

解決済み付け忘れにて編集

No29485 (επιστημη さん) に返信

> dequeの要素を
> operator[i]でくるくる拾う と
> iteratorを++する とのパフォーマンスの差かもですね。

実際にやってみたんですけど殆ど差はでなかったです。
まぁ、スレ主さんが2秒速くなったと言っているので流しましたが。。。
解決済み
引用返信 編集キー/
■29495 / inTopicNo.13)  Re[7]: dequeから文字列作成
□投稿者/ 渋木宏明(ひどり) (982回)-(2008/12/10(Wed) 12:14:22)
渋木宏明(ひどり) さんの Web サイト
> 実際にやってみたんですけど殆ど差はでなかったです。
> まぁ、スレ主さんが2秒速くなったと言っているので流しましたが。。。

Debug ビルドと Release ビルドの違いだったりしてw

普通に考えて、連結するべき語が配列やコレクションの格納されているなら、その語の数分だけ誰かがどこかでループを回さにゃらなんでしょう。

であるなら、処理を高速化するために「ループを除去する」って方向性は無いと思うんだけどなぁ?
(見掛け上ループを除去する方法ならいくらでもあるでしょうけど)

単純な連結であるなら、連結するべき語の数に比例した処理時間が必要なのもまた不可避。

となると、あと出来ることつったら「連結という操作そのものの高速化」という方向で考えるべきなんじゃないかと。

.NET だと、「string を + 演算子でつなぐよりも StringBuilder 使った方が速いよね」てのがまさにそのパターン。

引用返信 編集キー/
■29500 / inTopicNo.14)  Re[8]: dequeから文字列作成
□投稿者/ アキラ (133回)-(2008/12/10(Wed) 12:26:46)
アキラ さんの Web サイト
自前のループ処理が遅かったってだけだと思いますが。
ループするたびにd.end()を評価してたとか、後置インクリメントしてたとか。一時オブジェクト作りまくってたとか。
解決済み
引用返信 編集キー/
■29504 / inTopicNo.15)  Re[9]: dequeから文字列作成
□投稿者/ επιστημη (1446回)-(2008/12/10(Wed) 12:32:35)
επιστημη さんの Web サイト
2008/12/10(Wed) 12:34:29 編集(投稿者)

No29500 (アキラ さん) に返信
> 自前のループ処理が遅かったってだけだと思いますが。
> ループするたびにd.end()を評価してたとか、後置インクリメントしてたとか。一時オブジェクト作りまくってたとか。

string::string(iter f, iter l) が、
あらかじめ fとlに挟まれた要素数:distance(f,l) を基に
ハナっからそんだけの大きさの領域を確保してるならば
文字の連結時に生じるメモリの再確保がなくなるわけなんだが...

それでも"劇的に速く"はならんわなぁ。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -