C vs C++ vs Rust Part.3

■ このスレッドは過去ログ倉庫に格納されています
2022/01/27(木) 22:19:47.56ID:avZQ9Wm7
闘え
※前スレ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
C vs C++ vs Rust Part.2
https://mevius.5ch.net/test/read.cgi/tech/1639539350/
2022/03/15(火) 22:53:14.37ID:H3mwwYQo
さきほどcombinationsイテレータをググって古いversionのitertoolsのソースで回答したよな>>484
ところが今回のsubsetsについては回答できない
検索で出てこないから答えられないのだとわかる
2022/03/15(火) 23:04:20.16ID:DajlRg+n
永久に書いてやるよw
すぐ書けるけど、お前に回答すんのが嫌なんだよw
なぜならお前がバカだからw 何度もそう書いてんだけどw
2022/03/15(火) 23:07:34.34ID:bERyk9+R
>>503
なるほど
subsetsのアルゴリズムは難しくて無理でしたか
2022/03/15(火) 23:09:47.42ID:DajlRg+n
永久に書いてやるよw
すぐ書けるけど、お前に回答すんのが嫌なんだよw
なぜならお前がバカだからw 何度もそう書いてんだけどw
2022/03/15(火) 23:20:19.51ID:H3mwwYQo
>>507
さきほどcombinationsイテレータをググって古いversionのitertoolsのソースで回答したよな>>484
itertoolsをもし本当に使ったことがあるならばsubsetsもあるだろうことくらいわかるだろ?
2022/03/15(火) 23:24:18.79ID:DajlRg+n
>>508
>>507
2022/03/15(火) 23:32:35.94ID:bERyk9+R
>>508
そこは英語力の問題かな
subsetsが見つからなかった時にpowersetを探せるかどうか
2022/03/15(火) 23:54:14.91ID:DajlRg+n
俺理系院卒だから数学一般教養くらいはあるぞw
難しい話をしてるつもりなのかもしれんけどw
2022/03/16(水) 00:52:00.92ID:2VKgWl5Z
>>481
俺はC++もRustも基本的部分は理解しているつもりで、書こうと思えば Rustでも
書けると思うが、書こうとは思えない。
しかし、C++は使う。
2022/03/16(水) 10:39:48.98ID:iFx1kR7d
同じことをやるにしてもrustは面倒くさそう
2022/03/16(水) 14:20:20.70ID:4Deniw6A
rustは詳しく知れば知るほど使える領域が狭いことに気付く。まあ勉強して損することはないとは思うけど。
2022/03/16(水) 16:01:45.47ID:FLjIdsXf
まぁ、Rustがものすごく人気になるようだったら、Rustを下敷きにしたC++サブセット Smart C++が出てくると思うわ。

そしてc++はライブラリアン向けのunsafe的な扱いになる、と。
516デフォルトの名無しさん
垢版 |
2022/03/16(水) 17:58:27.77ID:NLGXbRJg
>>515
無理じゃないかな。
2022/03/16(水) 20:15:10.51ID:TNL7Q8/z
rustが他言語の仕様に影響を与える部分はでてくるだろうね。
2022/03/16(水) 21:02:09.61ID:0TydPa2f
反面教師にはなるよねw
2022/03/16(水) 21:24:41.08ID:MkjFLw2M
>>512
それはあなたの能力では理解できなかったから思うだけで留まり実際には書けていない

>>513
逆だ
同じことが簡潔に書ける

>>514
むしろ幅広い分野で有効
後発だからとも言えるが言語仕様が幅広いパラダイムを洗練して採り入れていることが勝因とみた
2022/03/16(水) 21:56:01.01ID:GaQESt6l
少なくともC++はリプレイスしてほしいな
2022/03/16(水) 21:58:33.64ID:0TydPa2f
Rust信者って本当にバカだなw
妄想で他人を説得はできないんだよ
グラフ構造を標準ライブラリとunsafe使わずに簡潔に書いてみろよw
他の言語で出来ないやつないから
Rustも超狭い領域ではオンリーワンくらい有効なんだけど、それ以外では趣味でしか使われない
2022/03/16(水) 23:51:54.51ID:yCGU0QjC
>>491 >>492
横からやけどほんまにどんな仕様にしてもええの?
それなら長さlenのsubsetsイテレータは10文字で完成
『0..(1<<len)』
数字を2進数で見てbit立っている要素による各subset
0は全ての要素がないから空集合

それで納得してもらえんのやったら入力inputとして
(0..(1 << len))
.map(|c| (0..len)
.filter_map(move |i| (c & (1 << i) != 0).then(|| &input[i]))
.collect::<Vec<_>>())
これでちゃんとしたsubsetsイテレータが完成
例えばinput = &["a", "b", "c"]ならば以下が順に出る
[]
["a"]
["b"]
["a", "b"]
["c"]
["a", "c"]
["b", "c"]
["a", "b", "c"]
2022/03/16(水) 23:53:02.55ID:yCGU0QjC
>>491 >>492
横からやけどほんまにどんな仕様にしてもええの?
それなら長さlenのsubsetsイテレータは10文字で完成
『0..(1<<len)』
数字を2進数で見てbit立っている要素による各subset
0は全ての要素がないから空集合

それで納得してもらえんのやったら入力inputとして
(0..(1 << len))
.map(|c| (0..len)
.filter_map(move |i| (c & (1 << i) != 0).then(|| &input[i]))
.collect::<Vec<_>>())
これでちゃんとしたsubsetsイテレータが完成
例えばinput = &["a", "b", "c"]ならば以下が順に出る
[]
["a"]
["b"]
["a", "b"]
["c"]
["a", "c"]
["b", "c"]
["a", "b", "c"]
2022/03/17(木) 01:31:24.96ID:HeUHSOmZ
collectするならfoldで十分かな

fn subsets<T>(input: &[T]) -> impl Iterator<Item=Vec<&T>> {
let len = input.len();
(0..(1 << len))
.map(move |c| (0..len)
.fold(vec![], |mut v, i| {
if c & (1 << i) != 0 {
v.push(&input[i])
};
v
})
)
}
2022/03/17(木) 02:22:57.24ID:stJJ2apy
C++でsubsetsイテレータを書くとどんな感じになるの?
2022/03/17(木) 02:29:21.66ID:M6s617kA
>>519
馬鹿
2022/03/17(木) 02:39:09.51ID:faeKJv0z
Rust同様どうとでも出来るよw
C++のは古いから名前がアレだけど
俺は>>522じゃないけどfilterとmapで書いた方が分かりやすいとは思う
この書き方でpushとかは見たくなかったw
2022/03/17(木) 02:53:46.50ID:75al4ANx
うむ

>>522
filter_mapとthenによるOption利用が分かりやすいな
2022/03/17(木) 03:28:10.97ID:OxdqHDsn
>>527
ぜひC++版お願い
2022/03/17(木) 04:22:11.55ID:faeKJv0z
>>529
何度でも言うけど、そういう要求は飲まない
金くれたら書くよw
2022/03/17(木) 08:12:49.73ID:8E8aTCar
>>520
リプレースはしなくていい。
コーダーとかが通常使う安全運転版と、ライブラリアン用のフル版が住み分け・共存できればいい。
従来はコーディング規約とライブラリでやっていたところだけど、こういうのはshared ptrみたいに旨が使う共通仕様にしたほうがいい。
2022/03/17(木) 08:19:10.27ID:H9cH52GC
Rustに移行すれば
色んな問題が一気に解決するだけでなく
プログラミングもしやすくなって一石二鳥
2022/03/17(木) 08:41:07.21ID:FVjeEviC
>>532
サンプルコードがもっと充実してきて、標準的なコーディングが普及してきてから検討するわ。

Rustは土方向け言語目指しているのに、今のRustの仕様だと土方に難しすぎるから中途半端。それならc++&コーディング規約でいいや。
2022/03/17(木) 08:49:29.01ID:+B7ucdDW
>>533
君たち土方には難しいのかも知れないが普通のプログラマーにとっては難しくないしコーティングがC++より快適
2022/03/17(木) 08:57:01.71ID:qDb9bUKB
Pythonくらいしかやったことない人にとって難しいのはそうだろうけど
C++14/17についていってる人ならRust余裕だと思うけどなぁ
2022/03/17(木) 10:08:01.84ID:faeKJv0z
Rustに出来てC++が似たようなことを出来ないってことはまずないよ
ただ同じことをしたい場合、手間がすごいかかる(23は知らんけど)
そしてどう転んでもエラーがRustほど人間に優しくなったりはしない(と思う)

C++に出来てRustが似たようなことを出来ないってこともそんなに多くない
まあでもこっちは本当に出来ない
https://www.reddit.com/r/rust/comments/n7rjfk/what_can_c_do_that_rust_cant_2021_edition/

ただRustは初心者には難しすぎ、ある程度他の言語をやってる人にも難しいというハンデがある
なのでスクリプト言語感覚でRustをやろうと思うのはちょっとオススメできない
楽を出来る場面は確かにあるので、そこをどの程度メリットと捉えるか
制約をどの程度デメリットと捉えるかで評価が分かれる
2022/03/17(木) 12:06:55.23ID:wJGqDNhd
>>534
土方にやらせる話をしているんだよ。

Rust信者がそういう意識なら、RustがJavaみたいに流行ることは無いな。
やっぱりHaskellコースかね。
2022/03/17(木) 16:20:31.29ID:YyXXowcK
>>534
>君たち土方には難しいのかも知れないが普通のプログラマーにとっては難しくないしコーティングがC++より快適
自分がどれくらい矛盾してること言ってるのかも理解してなさげ。
2022/03/17(木) 18:26:55.16ID:kAy4MIQW
>>522
Rustはスクリプト言語のように簡潔に書ける点もいいね
それでいてC言語並に速い
C++は簡潔に書けず手間暇かかりすぎる
2022/03/17(木) 18:35:40.91ID:+BzvG1OL
お手軽さっていう話だと、関数の仮引数の型も型推論してほしい、ってたまに思っちゃう
2022/03/17(木) 18:44:45.18ID:qDwk9HhQ
>>540
技術的にはできるし、できるならやりたくなっちゃうところをあえて削ったのは英断だと思ってる
過去のコードや他人のコードを読むときに直近に型があるのは大きい
2022/03/17(木) 18:59:38.79ID:Rcv7QaS+
> 仮引数の型も型推論
OCamlだとそれはフツーにできてるのにね

> 過去のコードや他人のコードを読むときに直近に型があるのは大きい

同じような話だがJavaのジェネリクスで

> List<Foo> list = new ArrayList<>();
> この右辺のパラメータが省略できるのを有難がるのは残念で
> ホントは左を省略してvar ist = new ArrayList<Foo>();
> と書けたほうが嬉しいのにJavaはやっぱりダメダメ

みたいな意見をみたことがあるが、左を残すことこそ大事なんだよな
実装に対してではなくてインタフェースに対してプログラミングするのであって
変数の型を必要最低限の小さいインタフェースで宣言するのが嬉しいのに
それをわかってないやつはタイピング数などで判断して世迷い言を言う
543デフォルトの名無しさん
垢版 |
2022/03/17(木) 19:25:12.70ID:pdkFYtDC
Rust学習しはじめだがEnumの仕組みは良いと思う。
C#あたりに組み込まれればいいのに。
2022/03/17(木) 20:43:27.53ID:oh1xEFC0
enum Optionとか便利で簡潔に
null nil undefined -1など無くして安全に出来ていいよね
それでいてコンパイル後は最適化されたり消えたりして効率も両立されたり
2022/03/17(木) 20:52:32.01ID:faeKJv0z
別にC++でも同じことはできるけどね
自分で組めばC++14とかでもrxっぽく書いたり、Optionの実装も余裕
手間さえ惜しまなければw
2022/03/17(木) 20:55:03.76ID:faeKJv0z
Javaも最近は左側省略できるよ
おっしゃるとおり基底型何にするかは選べないけどw
2022/03/17(木) 20:58:40.56ID:LRb50lm3
C++17にstd::optional<T>があるにはあるのだが...

膨大な量の既存のSTLが無効値をoptionalに置き換えられることはない
つまり無効値でoptionalを返す風潮ができにくいから悲しみ
2022/03/17(木) 20:59:36.98ID:oh1xEFC0
引数の型推論は原理的にはかなり出来そうだけど
例えば引数がas_ref()で使われていて変換後がPathなら引数はimpl AsRef<Path>までやっちゃう?
でもその利用者へのインタフェース明示や可読性と保守性を考えると型明記でいいような気がする
2022/03/17(木) 21:13:38.45ID:faeKJv0z
C++もautoだらけlambdaだらけにすると引数も戻り値も結構型書かなくていいけど、遠すぎて何に怒られてるのか分からん代入エラーが出たりもするw
Rustも同じだけどエラーは分かりやすい
2022/03/17(木) 21:15:46.46ID:cEFLJG6J
>>545
そこはやろうと思えばできるレベルと
Rustが標準ライブラリで全面採用サポートしてるレベルで天と地の差があるよね
例えば>>522もbool値がthenでOptionを生成してそれをfilter_mapが受け取ることで簡潔なコードになっていたり
2022/03/17(木) 21:23:13.02ID:faeKJv0z
そこはfilterとmapの方が分かりやすい
2022/03/17(木) 21:32:28.43ID:7cb0HHrx
一般的にfilter_mapはわかりやすと速さを両立
だからわざわざfilter_mapやfilter_map_okが用意されている
2022/03/17(木) 21:35:05.28ID:faeKJv0z
そんなところは全く速さに影響しないと思うよ
2022/03/17(木) 21:43:21.73ID:LVblziyo
>>553
その種類のイテレータを2段は最適化前はもちろん速さに影響するけど
最適化により最終コードが同一コードになることを確認したということ?
2022/03/17(木) 21:49:32.84ID:faeKJv0z
お前は速くなることを確認したんかい?w
俺は出来るけど速くならないことを確認する必要がないと判断したw
お前は恐らく出来ないw
2022/03/17(木) 21:58:49.13ID:S0ETBIy2
コードそのままならイテレータ2つより1つの方が速いと明白なので
速さが同じと主張する>>555が最適化で同じコードになることを示す必要がある
2022/03/17(木) 22:05:07.99ID:faeKJv0z
明白じゃねーよwwwww
2022/03/17(木) 22:19:03.24ID:ONkUn4dy
たぶん>>557氏はイテレータの動作原理を知らないのだと思う
例えばfilterは構造体Filterを返しそのメソッドnext()がイテレータを進めるごとに呼ばれる
同様にmapは構造体Mapを返しそのメソッドnext()がイテレータを進めるごとに呼ばれる
最適化前はそれら二重のオーバヘッドがある
2022/03/17(木) 22:24:52.40ID:qNBuWQhB
速さに関して議論するなら最適化のコードがどうなるかを確認すべきでは
特にイテレーターアダプターを何度も噛ませてもfor文相当のコードが生成されるというのはrustの売りのひとつだよね
2022/03/17(木) 22:29:02.79ID:IFNw/pUN
もし最適化後に有意に速度差があるなら、それは性能バグとしてIssueにあげるべき問題だと思う
2022/03/17(木) 22:31:57.85ID:IHLBrgoM
>>559
その通りで最適化で非常に効率な最終コードとなる
ただし今回のケースでfilter().map()がfilter_map()と同一コードになるかどうかは自明ではない
したがって>>553に立証義務がある
2022/03/17(木) 22:36:47.68ID:faeKJv0z
立証義務なんてねーだろwwww
できないからって他人に頼るなwwwww
2022/03/17(木) 22:38:48.81ID:IFNw/pUN
意味的に同じことやってるんだから、理想的な最適化コンパイラは全く同じバイナリを吐くはずで
遅くなるはずってのも別に自明ではないのでは
2022/03/17(木) 22:46:51.69ID:IHLBrgoM
>>563
意味の同じプログラムが最適化で常に同じコードになるかどうかは自明ではない
そしてそれを期待することはよいが前提としてはいけない
自明ではないことを同じと主張する側に立証義務がある
2022/03/17(木) 22:48:42.58ID:faeKJv0z
できないんだねwwww
rustの吐くコードすげー見にくいしなw
それ以前にアセンブラ読めなそうw
2022/03/17(木) 22:52:00.13ID:IFNw/pUN
>>564
ん?別に同じになるのが自明とは言ってないよ
どちらも同程度に自明でないって言ってるだけ
立証はまぁやりたい人がやればいいんじゃない
2022/03/17(木) 22:57:38.05ID:s2P7MscG
>>565
> rustの吐くコードすげー見にくいしなw

無知っぷりを曝け出してるな
2022/03/17(木) 23:14:09.53ID:faeKJv0z
お前が無知なだけw
2022/03/17(木) 23:29:12.99ID:OpaED0hw
>>565
LLVMがアセンブリを吐いてることも知らないのか
2022/03/17(木) 23:31:17.03ID:faeKJv0z
ビビリ単発IDが何もかもを証明しちゃってるw
お前は何も分かってないw
2022/03/17(木) 23:50:47.22ID:76PcfavB
>>529
C++ではそんなに簡単には書けない
2022/03/17(木) 23:59:39.29ID:faeKJv0z
C++でも簡単に書けるよw
C++20で導入されたrangeでも使ってみw
より古い規格でもユーザーライブラリを使えばRxっぽい記述は簡単に出来る
自分で書くと難しくはないが骨が折れるタイプの実装
並列化を意識しない限りだけどw
まあ並列化を意識しないで簡便さを意識すれば無理にRxを使う必要もないけども・・・
2022/03/18(金) 00:00:49.69ID:Mo7HNly3
>>572
無理でしょ
実際に書いてみ
2022/03/18(金) 00:03:10.42ID:slshVm4c
加えて言えばRxでなければ上限を意識したループで書けるのでメモリ確保が最適化できるし、手でinlineにする部分を選べる分より速く書ける可能性もあるw
2022/03/18(金) 00:03:27.72ID:slshVm4c
>>573
いくらくれる?
2022/03/18(金) 00:10:24.15ID:eD3MnnxT
>>574
無理だ
2022/03/18(金) 00:13:29.40ID:slshVm4c
君にはそうなんだねw可哀想にねw
2022/03/18(金) 00:37:03.66ID:3Q/aNMKI
前スレの時からそうだけどRustのコードばかり出てくるスレ
C++で同じコードを書くと長く見難くなってしまうからだろうけど
2022/03/18(金) 00:49:14.78ID:slshVm4c
C++20なら普通に同じくらいw
あるのはRustの不慣れな部分コードねw まあこのレベルの作業に良い悪いもないけどw
君等のお勉強()にはいいんじゃないのw
2022/03/18(金) 03:33:36.54ID:ljbCBN/E
>>524のC++バージョン教えて
2022/03/18(金) 06:33:28.96ID:slshVm4c
これだけヒント出してやったのにまだ書けないのやばくね?w
2022/03/18(金) 08:39:50.87ID:q9WLoJ2B
>>542
変数の型を必要最低限の小さいインタフェースで宣言するのが嬉しいのに

とか言っているのに、使わない部分も含めてインターフェイスを制限する変数の型制限を有難がるのは笑いどころでしょうか?
「変数の型を固定して、コーダーの想定外の動きをしないように限定する」なら、そういう考えをもあるよね、となるけど。
2022/03/18(金) 19:44:54.15ID:MDox3gf5
>>580
手間がかかって分かりにくいのでC++でやるのは不向き
2022/03/18(金) 21:03:36.45ID:slshVm4c
>>583
この人も出来ないタイプなんだねw そういうことは全くないよw
2022/03/18(金) 21:36:44.00ID:w8aoFpzv
>>584
Rustのように楽にコード書けるの?
2022/03/18(金) 21:41:42.97ID:slshVm4c
>>585
楽かどうかは主観なので、まず自分でやってみれば?
このレベルなら俺はどちらが楽とかはないよw
2022/03/18(金) 22:10:37.73ID:HiGga5GH
9割9分はRustの方が楽にプログラミングできる
2022/03/18(金) 22:13:55.40ID:slshVm4c
単発IDは自作自演だから信用ならんのだよねw
2022/03/18(金) 23:01:40.37ID:l4s3ZEj8
ほとんどのケースでC++よりRustが簡潔になることは皆承知
2022/03/18(金) 23:44:11.33ID:slshVm4c
お前がC++使えてないだけw
変わらないよw
単発IDは自作自演
2022/03/19(土) 06:24:53.41ID:GZmTU31E
>>590
あちゃ、痛いところつかれましたわ
2022/03/19(土) 08:29:04.12ID:yuJH1G8D
変わらない と連呼するだけの簡単なお仕事ですw
2022/03/19(土) 08:34:00.61ID:DslNhsx1
単発IDが皆承知というだけで、ヒントも出したのにC++書けないバカが悪いw
2022/03/19(土) 08:35:31.99ID:GnnMuKUb
Rust信者がたくさん居るかのような見せかけのIDコロコロ
2022/03/19(土) 14:50:55.94ID:QSBhdvNV
公平に見てここまでに
Rustでの実装コードはある>>522 >>524
C++での実装コードはない
不利なのはC++側
2022/03/19(土) 15:08:06.66ID:DslNhsx1
必要だと思うなら自分で書けよwwww
書かなくても分かるから書いてないだけでw
両方分かる人はちゃんと言葉で説明できるからw
2022/03/19(土) 15:10:45.07ID:DslNhsx1
そもそも分からない言語があるのにこういうスレに来る方が間違いなんだがw
2022/03/19(土) 15:57:28.84ID:+R/acvy/
>>595
やめたれw
2022/03/19(土) 16:01:08.28ID:unVMuDSw
口だけでコードとか全然書けないヤツってよくいるよね
2022/03/19(土) 16:04:54.04ID:DslNhsx1
単発ID君悔しいのねw
俺は永遠に返事し続けるよw 君がC++使えるようになる日が来るといいねw
2022/03/19(土) 16:11:35.17ID:+R/acvy/
>>599
いるよなw
コード書いたようが早いような言い訳はいっぱい書けるのになw
言い訳だけはいっぱい書けるんよw
602デフォルトの名無しさん
垢版 |
2022/03/19(土) 16:12:10.15ID:m5PNQvz6
>>547
互換性が壁になるのは、長く広く使われてる言語ではどうしようも無いしなぁ。
だから言語も新しく作られるわけだけど、新しいものは認めません!という奴はいつだっている。
2022/03/19(土) 16:13:51.10ID:M61n5/yF
もう少しわかりやすくして
このsubsetsイテレータをC++で実装すればいいんだよね

fn subsets<T>(input: &[T]) -> impl Iterator<Item=Vec<&T>> {
let len = input.len();
(0..(1 << len))
.map(move |bits| (0..len)
.filter(|index| bits & (1 << index) != 0)
.map(|index| &input[index])
.collect())
}

fn main() {
let input = ["a", "b", "c"];
for s in subsets(&input) {
println!("{s:?}");
}
}

出力結果
[]
["a"]
["b"]
["a", "b"]
["c"]
["a", "c"]
["b", "c"]
["a", "b", "c"]
■ このスレッドは過去ログ倉庫に格納されています