C++相談室 part142at TECH
C++相談室 part142 - 暇つぶし2ch503:デフォルトの名無しさん
19/05/06 18:27:12.43 ecbY6TsO.net
>>499,500,501
ostream派生クラスじゃなくて独自のクラスのほうが軽量でいい。
stringインスタンスへのポインタのほかに、数値書き込み時の進数設定(oct,dec,hexを覚えておく)などをメンバ変数に持てばOK。

504:デフォルトの名無しさん
19/05/06 18:58:24.90 oGUqqIoM.net
>>502
をを、なるほど、これは素晴らしいw

505:デフォルトの名無しさん
19/05/06 21:02:54.05 ZJRraXBB.net
>>492
stringstream・・・

506:デフォルトの名無しさん
19/05/07 19:51:10.38 FbrTB0S1.net
basic_ostream使えよっていつも思う
なんで決め打ちするのかわからない

507:デフォルトの名無しさん
19/05/08 21:52:50.27 iQQm+nuQ.net
to_charsというものをみつけました。

508:デフォルトの名無しさん
19/05/09 18:03:02.17 PdPEbd3c.net
b配列全てをa配列のケツにコピーするとき
std::vector<char> a;
char b[]={0,1,1,3,4};
a.insert(a.begin(),&b[0],&b[sizeof b]);
これでいいの?
&b[sizeof b]
これが死ぬほど気持ち悪いんだけど

509:デフォルトの名無しさん
19/05/09 18:18:44.76 JXKWFyOS.net
そんな気色悪い書き方しなくてもこれでいいよ
a.insert(a.end(), std::begin(b), std::end(b));

510:デフォルトの名無しさん
19/05/09 18:25:51.81 PdPEbd3c.net
なるほど!ありがとう

511:はちみつ餃子
19/05/09 18:44:16.05 IVoLxnXn.net
>>508-509
std::copy に back_inserter を渡す方が効率的という豆知識。

512:デフォルトの名無しさん
19/05/09 18:53:31.44 vbHvKAwn.net
>>511
insertのが速いんでね?
resizeしてmemcpyになるはず

513:デフォルトの名無しさん
19/05/09 23:40:45.34 q7ofaYCv.net
アルゴリズムよりvector::insertのほうが実装による最適化の余地は大きそうだな

514:デフォルトの名無しさん
19/05/10 00:47:30.50 5C678nxv.net
ポインタがイテレータとして渡された時点で相手が連続バッファだってわかるからね

515:デフォルトの名無しさん
19/05/10 11:00:01.95 KAkBQh2y.net
&b[sizeof b]でもstd::end(b)でもやってることは変わらないんだけどな
見映えは重要だな

516:デフォルトの名無しさん
19/05/10 11:08:59.15 pPfi71KH.net
sizeof bじゃcharでしか使えないんで、そういう意味でもイケてないかも

517:はちみつ餃子
19/05/10 12:01:59.87 g2QrvVju.net
>>515
見栄えというか、名前が付いているってのはそれだけで単純にわかりやすいな。
(名前が妥当であれば。)

518:デフォルトの名無しさん
19/05/10 19:02:43.61 UhKi+qPE.net
嫌儲で、東京五輪チケットのソースコードが出てるけど
C++使ってるお前らなら、こんなソースコードじゃないよね?
URLリンク(gogotsu.com)

519:デフォルトの名無しさん
19/05/10 19:05:10.83 curN/h5M.net
>>518
サーバーサイドあまりやってないけどこんな泥臭い書き方するのか

520:デフォルトの名無しさん
19/05/10 19:05:16.55 TAwz/zT/.net
javascriptやん

521:デフォルトの名無しさん
19/05/10 19:36:57.50 tfYAY6pz.net
こんなもんだろ
SIerが間違ってコンシューマ系のWeb制作を請けてしまうとこんな感じになる

522:デフォルトの名無しさん
19/05/10 21:47:05.61 oOPMkjEw.net
てかこんなもの韓国に出すのね
安くなさそう
ってもしや北の方?

523:デフォルトの名無しさん
19/05/10 21:53:19.07 oOPMkjEw.net
parseInt(Num).lengthって動かなそう

524:デフォルトの名無しさん
19/05/10 21:57:58.16 TAwz/zT/.net
ほんまやw桁でも返ってくるのかと思ったがundefinedじゃんかw

525:デフォルトの名無しさん
19/05/10 22:59:11.84 HK1/2Yro.net
型に無駄にこだわった結末がstreamと知っとくのは重要。
あの間違いを覚えとけ。

526:デフォルトの名無しさん
19/05/10 23:25:31.58 u3uVdMgu.net
ゲームのシーンを管理するクラスとシーンクラスがあり、管理するクラスはシーンクラスを保持しています
シーンクラスから管理クラスのシーンチェンジを行う関数を呼び出したいのですがどうやったらいいでしょうか
シーンクラスが管理クラスのインスタンスを持ちたくありません

527:デフォルトの名無しさん
19/05/10 23:30:31.35 0WVRNDv3.net
>>518
webにあげるなら難読化まではしないにしても最低限圧縮するよね

528:デフォルトの名無しさん
19/05/10 23:55:31.69 tshfuAdx.net
>>526
シーンクラスに管理クラスへの参照(ポインタ)を持たせればいいんじゃないのか

529:デフォルトの名無しさん
19/05/11 03:16:15.93 xsmcwCcm.net
早速情報漏洩やらかしたの?

530:デフォルトの名無しさん
19/05/11 10:30:07.92 f5HniSEP.net
>a.insert(a.begin(),&b[0],&b[sizeof b]);

これ、添字オーバーしてるけどメモリエラーとかにならないの?

531:デフォルトの名無しさん
19/05/11 10:54:36.87 RjxICFG6.net
>>530
イテレータ範囲のendは配列の場合最後の要素の次のアドレス
それは普通の実装ではアクセスされることはない
規格的にも最後の次の要素へのポインタだけは未定義じゃない

532:デフォルトの名無しさん
19/05/11 11:55:52.83 Y1ZlGg0p.net
>>530
アクセスしてるからダメそう

533:デフォルトの名無しさん
19/05/11 12:40:07.82 3XjGQ6E0.net
[]はただのアドレス計算じゃん

534:デフォルトの名無しさん
19/05/11 12:42:52.29 DVWj7ai3.net
&p[N]はp + Nと同じって規格にあったっけ?

535:デフォルトの名無しさん
19/05/11 12:44:31.45 RjxICFG6.net
確かに&b[sizeof b]はデリファレンスしてるわ
これはあかんそう

536:デフォルトの名無しさん
19/05/11 12:56:49.51 FaKAPAIh.net
>>533
a[i]は a+i ではなく *{a+i}

537:デフォルトの名無しさん
19/05/11 13:12:17.25 2v2BzL6t.net
経験上出来るプログラマーは言語オタクが多いイメージ?(ただし浅い)

538:デフォルトの名無しさん
19/05/11 18:44:16.82 fU686pnk.net
&*pはデリファレンスなしで単にpと評価するってどっかで特別に決められてなかったっけ?

539:デフォルトの名無しさん
19/05/12 06:58:46.18 x4ccFx6b.net
>>530
int a[5];
int *p = &a[5];
というコードが有効、つまり
「配列の最終要素の次の要素」(現実には存在しないデータ)のアドレスを取れる、
という仕様から、この場合は許される、というのが >>531 の指摘か。
一般的に >>538 が成り立つなら便利だけど、調べ切れなかった。
流れの元になった >>508 を見返したら、
a.insert(a.begin(),&b[0],&b[sizeof b]);
これだと b[] の内容はベクタ a の先頭に挿入されちゃうね。

540:デフォルトの名無しさん
19/05/12 07:43:52.68 2y1+p9UL.net
>>530
>>a.insert(a.begin(),&b[0],&b[sizeof b]);
>>

>これ、添字オーバーしてるけどメモリエラーとかにならないの?
508だけど、これは
a.insert(a.begin(),&b[0],&b[sizeof b]);
こっちの間違いです。ごめんなさい。
a.insert(a.end(),&b[0],&b[sizeof b]);
&b[sizeof b]);
この部分は
b+sizeof(b)
これなら問題ない感じ?
どちらでも動くけど、たまたまいてる可能性捨てきれないから不安なんだよね。
実際のソースはsizeof(b)がbに格納されているデータのサイズを示していて、
char b[256];
int s = read( fd, b, sizeof b);
a.insert(a.end(),&b[0],&b[s]);
みたいな感じで書いてます。
んで、b最大数来た場合にちゃんと動くか気になったというわけっす。
int s = read( fd, b, (sizeof b)-1);
無難にこれの方がいいですかね?

541:デフォルトの名無しさん
19/05/12 11:19:05.13 k8bUqGvO.net
>>539
>int *p = &a[5];
これは多分だめで、ポインタ値としての存在なら許される
int *p = a+5;

542:デフォルトの名無しさん
19/05/12 11:53:09.39 nuZIUjqi.net
ややこしいからoperator <<を定義しようw

543:デフォルトの名無しさん
19/05/12 15:25:00.10 8/5ODvoI.net
VC++だと
std::vector<T> a; &a[a.size()]はoperator[]のassertionに引っかかるね

544:デフォルトの名無しさん
19/05/12 22:25:11.86 yr8YjJOU.net
std::transformって並列処理されてますか?

545:デフォルトの名無しさん
19/05/12 23:20:05.82 jFoQmc6B.net
c++17のparallel版使えば並列実行されるかもしれない

546:デフォルトの名無しさん
19/05/13 01:24:36.27 RKe/NLvg.net
visual studioでC++17にしたけどいまいち並列版の使い方が分からなかった
普通にfor回すのと、OpenMP使ってfor並列化するのと、transform(非並列)使うの比較したら
OpenMP>普通にfor≧transform だった

547:デフォルトの名無しさん
19/05/13 20:49:38.54 YS57w6Jq.net
おとなしくpthead使えよ。

548:デフォルトの名無しさん
19/05/13 20:56:12.40 WUu3P+2G.net
非並列使ったならそりゃそうなるだろ

549:デフォルトの名無しさん
19/05/16 02:02:33.17 1v50lv4I.net
struct AとAを継承したstruct Bがあって
Aの内容をBの共通部分にコピーする方法ってないですか?
A a;
B b = a;
みたいにしたいんですけど親を派生先にキャストはできないので困ってます

550:デフォルトの名無しさん
19/05/16 02:06:57.91 mZDDPYlt.net
struct B : public A
{
B* operator=(const A& a){ this->hoge = a.hoge;}
};
これ初期時にも使えるんかな

551:デフォルトの名無しさん
19/05/16 02:25:05.62 1v50lv4I.net
コピーコンストラクタが実装できたとしてメンバ変数は1個ずつコピーするしかないですかね

552:デフォルトの名無しさん
19/05/16 02:28:08.55 mZDDPYlt.net
スライシングをさせるとか?
安全に?スライシング起こす方法ってあったっけな?
なんか危ういからやろうともしなかったが

553:デフォルトの名無しさん
19/05/16 06:25:17.13 /dAesd8e.net
cloneメソッド用意するとか

554:デフォルトの名無しさん
19/05/16 06:31:42.80 ebJ8HHSX.net
>>549
初期化時は普通にコンストラクタ初期化リストで A(a) って書けるでしょ。残りのメンバをどうするのか知らんけど。
代入なら static_cast<A&>(b) = a か b.A::operator=(a) で済みそう。

555:デフォルトの名無しさん
19/05/16 06:33:37.60 C3C4SHXA.net
普通にコンストラクタかオペレーター作ればいいんじゃね
B::B(const &A)
B::operator =(const &A)
A::operator B()
雑なキャストでよければdynamic_cast<A>でおk

556:デフォルトの名無しさん
19/05/16 06:38:27.18 C3C4SHXA.net
↑dynamic_cast<B>の間違い
B b = dynamic_cast<B>(a);

557:デフォルトの名無しさん
19/05/16 11:40:14.21 74mGoL8y.net
>>551
sturctでまとめればデフォルトコピーコンストラクタが使えるけどね。
あとはintとかPODオブジェクトだけだったらmemcpyしちゃうとかも、俺はたまにやるなw

558:デフォルトの名無しさん
19/05/16 17:20:00.24 PgzYowjZ.net
549です
解決しましたありがとうございます
以下のように書いたら思っていたことが出来ました
(派生先のコンストラクタで親のデフォルトコピーコンストラクタ呼べるの知りませんでした)
代入は現状使う予定がないので大丈夫です
B::B(const &A a) : A(a) {}

559:デフォルトの名無しさん
19/05/16 18:17:29.46 mr2QiBZl.net
その内容だったら=defaultでいいよ

560:デフォルトの名無しさん
19/05/16 21:32:58.41 /aEDSlbd.net
引数付きコンストラクタって、=default使えるの?

561:デフォルトの名無しさん
19/05/16 22:09:55.18 jJO9F8Je.net
使えないよね
うかうかっと読み過ごしてたわw


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch