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/19(土) 17:31:22.77ID:M61n5/yF
>>603
やってみたがC++の従来のイテレータ仕様が悪すぎることが敗因
なのでC++20からのstd::rangesでかなり改善できる
ただしRust版ほどシンプルに仕上がらないな

>>605
勘違いで詰まらない言いがかりを付けてくるな
そこまで言うならばC++版のコードはおまえに任せる
2022/03/19(土) 18:10:48.21ID:DslNhsx1
単発IDがたまに連続させたって意味ないんだけどw
その辺はとうに>>572に書いたよね?w まだ出来ないの?wwwww
2022/03/19(土) 18:22:18.16ID:u/mznaJY
>>605
> クロージャ(ラムダ)の引数を次のクロージャで使うのは気持ち悪い

意味不明すぎ
クロージャを理解できていない?

> 結局collectしちゃうのはイマイチだね

わかりやすくcollectしてるだけだろう
collectを外せばイテレータを返すイテレータとなるのは自明
2022/03/19(土) 18:31:58.03ID:DslNhsx1
またID変えて忙しいやつだなwww
1つ目の点は細かいが、クロージャを外に出したいと思ったときに不自由なんだよw
2つ目の点は遅延評価をわざわざ使うなら、collectしちゃうとロスが発生するのは分かるだろw
例えばコンソールに出力する場合、そのままiteratorをぶん回したらメモリ要らないのに、最初にcollect付けちゃってるから問題なんだよw
後から付ける事はできても、取り外すことは出来ないからw
2022/03/19(土) 18:34:23.73ID:+R/acvy/
エアプC++erの言い訳無限に出てくるよw
2022/03/19(土) 18:37:48.37ID:LL+Ti59i
もういいから正解書いてくれ。
2022/03/19(土) 18:38:41.55ID:DslNhsx1
ありゃりゃココで複垢まで使っちゃうと他で使えなくなっちゃうよ?w いいの?w
2022/03/19(土) 18:39:15.88ID:+R/acvy/
書けないのに書けるフリして可哀想やわ
614デフォルトの名無しさん
垢版 |
2022/03/19(土) 18:41:43.33ID:LL+Ti59i
複垢とか何を言ってるのかよくわからんが、正解がどうなるのか気になるので正解かいてくれ。
おれはC++もRustもそんなに知らん。
615デフォルトの名無しさん
垢版 |
2022/03/19(土) 18:43:31.88ID:6MHm2WKJ
>>545
手間を惜しまないならチュリ完ならなんでも出来るからなw
2022/03/19(土) 18:44:04.03ID:DslNhsx1
そんなに知らないならココ見るなよwwww 答えクレクレ君が来る場所じゃないw
2022/03/19(土) 18:44:08.25ID:jyTBsiM0
>>605
>どうでもいいけどクロージャ(ラムダ)の引数を次のクロージャで使うのは気持ち悪い

クロージャーは互いに独立しているので
引数を次のクロージャーで使うのは不可能です
根本的な理解が出来ていないのでは?
2022/03/19(土) 18:45:06.81ID:DslNhsx1
チュリ完はプログラミング出来るというだけで、何でもは出来んよw 知ったかくんw
2022/03/19(土) 18:46:38.78ID:DslNhsx1
入れ子のクロージャでって意味の次のだよw ただの順番w
2022/03/19(土) 18:47:35.76ID:+R/acvy/
だっさwwww
言い訳ばっかやんwww
2022/03/19(土) 18:49:45.68ID:DslNhsx1
分かる人は最初ので全部分かってるから、何もしないw
バカが煽ったり質問したりするから永遠に反応してやってるだけw
622デフォルトの名無しさん
垢版 |
2022/03/19(土) 18:49:59.87ID:LL+Ti59i
いやくるなと言われてもくるけどね。
623デフォルトの名無しさん
垢版 |
2022/03/19(土) 18:50:09.75ID:m5PNQvz6
相変わらすc++コードは全然でてこないな。
2022/03/19(土) 18:50:51.71ID:+R/acvy/
C++書いたほうが早いのに言い訳しか出てこないの怖いわw
2022/03/19(土) 18:54:53.91ID:DslNhsx1
Rust推しの駆け出し君がC++を語るとか片腹痛いw
2022/03/19(土) 19:02:54.69ID:cmtG3lS6
>>619
何を言ってるのかわからん
皆にイチャモンつけまくっているだけにみえる
君のsubsetsイテレータ実装を出したまえ
2022/03/19(土) 19:04:05.03ID:DslNhsx1
君等のような駆け出し君がやれマウントだドヤ顔だ上から目線だのと言いつつ、自分の仕事に真摯に取り組まず、自身の評価ばかり気にして待遇がどうの周りがどうのと言い始めて辞めた挙げ句、技術も経験もないままニートになってるから社会問題になってるんだよw
まずは足元を固めてじっくり1つのことをやった方がいいと思うぞおっさん的にはw
2022/03/19(土) 19:06:49.48ID:+R/acvy/
お前がなw
2022/03/19(土) 19:09:27.82ID:DslNhsx1
あれれ?当たっちゃった?w 頑張れよw
2022/03/19(土) 19:10:49.95ID:GZmTU31E
>>625
痛いのは左の腹ですか?それとも右脇腹ですか?
2022/03/19(土) 19:14:41.36ID:DslNhsx1
あえて訂正してこないところが出来るね君w 背中側の腹だよw
2022/03/19(土) 19:33:55.07ID:YQxYhoLA
>>605
もちろんcollect()を外せばそのままイテレータを返すイテレータを返す関数になる

fn subsets<T>(input: &[T]) -> impl Iterator<Item=impl Iterator<Item=&T>> {
let len = input.len();
(0..(1 << len))
.map(move |bits| (0..len)
.filter(move |index| bits & (1 << index) != 0)
.map(|index| &input[index]))
}
2022/03/19(土) 19:50:41.66ID:YQxYhoLA
あとはID:DslNhsx1氏がC++バージョンを書けるかどうか
2022/03/19(土) 19:52:06.07ID:+R/acvy/
やめたれw
2022/03/19(土) 19:57:39.82ID:DslNhsx1
あれあれ?全文がなくなって動かなくなってるねwwww
変更はそこだけでいいのかな?w
C++はお前が書けないのがおかしいんだよw
2022/03/19(土) 20:09:59.31ID:YQxYhoLA
>>635
言いがかりをつけることしか出来ないダメなやつだな
自分でコードを書けないってことなんだろ
どうぞ >>632用の簡易動作確認コード
let input = ["a", "b", "c"];
for mut iter in subsets(&input) {
println!("({})", iter.join(","));
}
2022/03/19(土) 20:41:03.66ID:DslNhsx1
# こんな感じねw
cargo install cargo-edit cargo-geiger
cargo new subsets
cd subsets
cargo add itertools
cat >src/main.rs <<EOF
#![forbid(unsafe_code)]
use itertools::Itertools;
fn subsets<T>(input: &[T]) -> impl Iterator<Item = impl Iterator<Item = &T>> {
let len = input.len();
(0..(1 << len)).map(move |bits| {
(0..len)
.filter(move |index| bits & (1 << index) != 0)
.map(|index| &input[index])
})
}
fn main() {
let input = ["a", "b", "c"];
for s in subsets(&input) {
println!("[{}]", s.format(","));
}
}
EOF
cargo run
cargo geiger
# Run cargo-geiger!
2022/03/19(土) 20:42:40.39ID:DslNhsx1
まあ外部に括りにくいのが気になるのは趣味だから修正はやめといたw
joinはformatに変えただけw
そのまま動くというのはこういうコードw
2022/03/19(土) 21:18:01.62ID:OlJIHMMJ
相変わらずコピペ&改変だけしかできないガイガー君だ
ゼロからコードを書くのは苦手だからC++版の方は手付かずのままなわけだ
2022/03/19(土) 21:27:48.52ID:jYZm0dN8
金もらわないとコード書かないんじゃなかったのか
機嫌が良かったのかな?
2022/03/19(土) 21:39:07.36ID:DslNhsx1
俺は書けるけど、お前らが書けないのに俺が書いたら書かされた感があって嫌なだけw
2022/03/19(土) 21:44:20.43ID:LL+Ti59i
残念だな。エレガントなC++のコードみたかったわ。
2022/03/19(土) 21:47:05.64ID:DslNhsx1
じゃあエレガントでないC++のコードを見せろよw
2022/03/19(土) 21:50:10.65ID:LL+Ti59i
いやおれは書かないけどね。なにをいうてんの。
2022/03/19(土) 21:57:27.50ID:OlJIHMMJ
ガイガー君はコピペ改変なら辛うじてできるからC++派の誰かがコードを書くまで無理だろう
2022/03/19(土) 22:02:11.32ID:DslNhsx1
なんでC++派とかRust派とかいるんだよwwww
両方書けないのになんでこのスレにいるんだよゴミクズどもwwww
2022/03/19(土) 22:18:51.04ID:pGbdb8un
>>646
スレタイと >>1 を見なさいよ
ここは各派閥が争うスレ
2022/03/19(土) 22:19:15.66ID:/tgdZc/e
正確には
Rustだと色々シンプルに書けるためRust派

C++でも書ける派
ただし後者はコードが出てこないので実証されていない
2022/03/19(土) 22:25:23.19ID:DslNhsx1
いやいや
RustだとC++より色々シンプルに書ける派と
RustもC++も同じ派がいるだけだろw
C++だとこんなになっちゃいますってコードが前者から出てないんだがw
C++書けないのにRustだけシンプルに書けると思い込んでるバカはお引取り願おうかねwwwww
2022/03/19(土) 22:32:19.39ID:DslNhsx1
あと個人的に無駄が結構気になるので、さっきのコードRust部分だけ以下に置き換えてくれ
#![forbid(unsafe_code)]
use itertools::Itertools;
fn subsets(len: usize) -> impl Iterator<Item=impl Iterator<Item=usize>> {
(0..(1 << len)).map(move |bits| {
(0..len).filter(move |index| bits & (1 << index) != 0)
})
}
fn main() {
let input = ["a", "b", "c"];
for s in subsets(input.len()) {
println!("[{}]", s.map(|index|&input[index]).format(","));
}
}
2022/03/19(土) 22:36:43.09ID:unVMuDSw
絶対コード書けないだろ
面白すぎw
2022/03/19(土) 22:42:30.15ID:miakijMp
>>650
ポインタとusizeは同じ大きさだから
そのコードでは何か無駄を削除できているわけではない
むしろ使う側で毎回mapしなければならず使い勝手が悪くなっている
さらに大元の話は>>460から始まっているのだから大きく仕様を変えるべきではない
以上3点により却下だ
2022/03/19(土) 23:04:04.71ID:DslNhsx1
別にu32やu16でもいいよw
むしろセットである必要がないのが素晴らしく合理的だし元とかiteratorにした時点で細かく言えば変わっているw
ただ最適化時に範囲チェックがどこまで見てくれるのかが気になるかな…
ノーチェックでいいと判断してくれたら御の字w
2022/03/19(土) 23:27:21.61ID:YSd+hKe3
>>653
添え字を返すならusize必須
あと使う側で変換すればいいと言う主張ならば最初の>>522『0..(1 << len)』でも良いことになる
そのままの方がビット演算処理もできてより利便性が高い
2022/03/19(土) 23:49:24.15ID:DslNhsx1
お前は何を言ってるんだw
inputのサイズで、この方式だと30個が上限w
usizeはオーバースペックなのw
2022/03/19(土) 23:58:01.67ID:Xi4ntxoy
>>653
Iteratorではなく他の言語のようにコストを払ってVec(のVec)で返したいならば
以下のように2段階それぞれcollect()するだけなのでコードが本質的に変わるわけではない

fn subsets<T>(input: &[T]) -> Vec<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())
.collect()
}

そしてあなたもcollect()して返すのはイマイチだと>>605で明言しているのだから
今回の結論はどちらもcollect()せずにイテレータのイテレータとなる>>632のコードが正解
2022/03/20(日) 00:10:53.62ID:1+CNf8az
無駄多くね?必要なくね?メモリとCPUを無駄遣いするクソコードでしかなくね?w
>>605で言ったのは上のコードで最初のcollectの話w 2個目は最初からないんだよw
>>650なら生成した瞬間に出力されるお得仕様だから無駄がないw
collectするくらいならそもそもVecをcapacity指定して作ってforループしてそこに埋めてった方が速いw
つまり>>632はゴミで>>650が正解w
2022/03/20(日) 01:32:33.30ID:+zPQ2FRY
>>657
ダメです
C++やRustを含めて各言語のcombination, permutation, subsetなどの実装はいずれも
与えられた入力があってその要素を使って返します
今回もその仕様で確定です
あとはイテレータを使わずに普通に>>656でもよいですし
イテレータを使える言語ならば>>632のイテレータのイテレータを返す仕様がベターでしょう
2022/03/20(日) 01:40:13.83ID:1+CNf8az
>>658
ダメじゃねーよwwww
むしろロジックが脆弱なのに余計にいろいろ浪費するコードでベターとか言ってんじゃねーよwwww
こんな短いコードでこんなにダメなやつは初めて見たぞw
2022/03/20(日) 01:51:34.86ID:+zPQ2FRY
>>659
あなたはダメです
既存のものの仕様に合わせるならば>>658に書いた通りですし
浪費をせずにインデックスだけ渡せばよいとの主張ならば皆が書いているように 0..(1 << len) がその答えです
ビット表現の方がサイズも小さく包含関係などもビット演算のみで得られるなど利点が多いです
あなたの>>650はそのどちらでもない中途半端です
2022/03/20(日) 01:58:09.59ID:1+CNf8az
>>660
頭悪いの?遅延評価されてるので、必要にならない限り計算されないんだけどw
その値も必要時に計算され、その結果を引数に与えられたiteratorが生成されて返ってくるだけだろw
そのときにiteratorがセットになってないindexだけ返ってきてそれがsubsetsになるの?wwww
足りない頭に脳味噌もう少し充填した方がいいよw
2022/03/20(日) 02:52:06.33ID:fen0VFs0
ガイガー君の主張だと
入力として集合をスライスとしてもらって
出力としてその部分集合をイテレータとして返す>>522は無駄で
出力としてその部分集合もイテレータで返し二段イテレータとなる>>632も無駄で
そもそも入力としての集合を関数に渡す必要がなく長さだけ渡してインデックスだけ返せばいいとの主張で>>650なんだろ

それならばもっと無駄を排除して次で十分だ
fn subsets(len: usize) -> impl Iterator<Item=usize> {
0..(1 << len)
}
これで各部分集合をビット表現で得られる
サイズも最小となりビット演算も可能で使い回しもよい
fn main() {
let input = ["a", "b", "c"];
let len = input.len();
for bits in subsets(len) {
println!("{:b} ({})", bits, (0..len).filter(|i| bits & (1 << i) != 0).map(|i| &input[i]).format(","));
}
}
このように文字列として必要になった場合に初めて変換すればよい
ついでにビット表現文字列も同時に表示できる
ガイガー君の無駄を無くす主張を認めるならばこのほうがさらに優れていることになる
したがってこの件もガイガー君の敗北だ
2022/03/20(日) 02:58:15.92ID:1+CNf8az
バカだなw コードにしなくてもそんなのは分かってんだよwwww
それじゃ意味が不明である上にI/Fとしても稚拙極まりないと言ってるんだよw
返ってくる数字が何なのか意味不明だろうにw
今回は元作者がアホなために30個そこそこしか作成できないわけで、まあそれでもなんとかなるわけだが、いずれロジックを修正して無限に生成できるようにしたときにまだそんなビット列に拘るのかい?
敗北はお前wwww
2022/03/20(日) 03:15:01.33ID:fen0VFs0
ところがガイガー君はsubsetsがビット表現から生成できることに気付かなかった
そのためガイガー君が示した最初のコードは>>463でありcombinationsイテレータを使ってsubsetsを生成するコードだった
ちなみにググるとsubsetsはcombinationsを使って実装できるとのページが多数ヒットする
ガイガー君がそこからカンニングしたのかどうかは知らないが少なくともビット表現から生成できることに気付かずcombinations頼みとなったのは事実だ>>463
2022/03/20(日) 03:23:47.90ID:1+CNf8az
>>664
お猿さんの妄想が事実と食い違ってたところで俺にはどうでもいいんだけど、事実はC、P、階乗みたいな計算や集合みたいなのは俺小学校時代から知ってるw
だから冪集合と聞くだけで、君のようにカンニングすることなく答えに辿りついてしまうんだよw
ビット表現から生成する方法を必死に提唱してたのは俺一人しか知らないけど、この手の処理は原則変更可能な元データのセットを用意すればスワップするだけで生成出来るものだよw
可哀想にねw
2022/03/20(日) 03:33:20.84ID:fen0VFs0
ガイガー君はsubsets関数をプログラミングする時になぜか非常に遠回りとなるitertools.combinationsを使った ソース>>463
この事実からガイガー君はアルゴリズムや数学などが不得意であると断言できる
ここまでコピペ改変しか披露できていないことからプログラミングが不得意なのだろう
2022/03/20(日) 03:58:13.20ID:1+CNf8az
>>666
こいつはアホなのか?普通に>>460が求める簡単な方法なんだがwwww
妄想を自分で断言しちゃうとかもうねw 久しぶりにこれを使ってあげようwwww

お前がそう思うんならそうなんだろう
   / ̄ ̄ ̄ ̄\
  /  / | ヽ ヽ\
 / / /|||ハ||ヽ>
`/ /ィ-トノレ| N十トハ||ヽ
/V レ/テヾ |/ /テヾ||||
レ∧ |ヒOソ|  ヒOソiNV
|  ヽ ̄  `  ̄ ハ(
ヽ|ヽ \  ̄  人ソお
 ヽレ\_≧ー-イレソ 前
  / ̄ ̄ ̄\\  ん
  / / ̄ ̄\_ヽ) 中
 |(    )ヽヽ で
  ヒ∧  \/ |゚| は
  ||   ヽ | | な
2022/03/20(日) 05:21:36.47ID:1V6eoYkY
>>460を見てみたけど
最終的ににべき集合のべき集合が欲しいみたいよ
MathematicaだとSubsets[Subsets[{a, b, c}]]で済むと言ってるね

それに対して>>463はitertools.combinationsを使ってsubsetsを実装
今回のケースでわざわざcombinationsを用いた実装が必要なのかどうかは不明
そして空集合が出力されないバグ実装
rangeを1開始でなくて0開始にしないと駄目ですよ

それはさておき元と同じインタフェースならばRust版は>>656の実装でOK
subsets(subsets(&["a", "b", "c"])) でべき集合のべき集合がちゃんと得られますね
2022/03/20(日) 11:54:10.51ID:1+CNf8az
まだ言ってんのかよw 空集合はお茶目なバグだ許せw
combinationを使わない実装の方が珍しいわw
同じI/Fにする必要はないし、それが必要なら簡単に実装出来るw
fn subsets_collect<T>(s: &Vec<T>) -> Vec<Vec<&T>> {
subsets(s.len()).map(|iter| iter.map(|i| &s[i]).collect::<Vec<&T>>()).collect::<Vec<Vec<&T>>>()
}
fn main() {
let input = vec!["a", "b", "c"];
println!("{:?}", subsets_collect(&subsets_collect(&input)));
}
始めから同じ実装にしてないからなw
そして>>656の実装でsubsets(subsets(&["a", "b", "c"]))はエラーwwww
2022/03/20(日) 17:12:41.85ID:URBujIbQ
ストレス発散オナニーRusterスレッド
2022/03/20(日) 17:36:53.71ID:1+CNf8az
いや、Rusterは尽く俺にやられてるんだがw
しかもC++できないただの駆け出しw
2022/03/20(日) 17:51:03.84ID:HHTijYmK
>>669は嘘つき
やってみたら>>656の実装で動いた
fn main() {
println!("{:?}", subsets(&subsets(&["a"])));
println!("{:?}", subsets(&subsets(&["a", "b"])));
println!("{:?}", subsets(&subsets(&["a", "b", "c"])));
}
ちゃんとべき集合のべき集合が出力されている
1つ目
[[], [[]], [["a"]], [[], ["a"]]]
2つ目
[[], [[]], [["a"]], [[], ["a"]], [["b"]], [[], ["b"]], [["a"], ["b"]], [[], ["a"], ["b"]], [["a", "b"]], [[], ["a", "b"]], [["a"], ["a", "b"]],
[[], ["a"], ["a", "b"]], [["b"], ["a", "b"]], [[], ["b"], ["a", "b"]], [["a"], ["b"], ["a", "b"]], [[], ["a"], ["b"], ["a", "b"]]]
3つ目は長いので略
2022/03/20(日) 18:08:01.19ID:1+CNf8az
>>672
嘘つきはお前w &が余計についてるやんけw やはり駆け出しRust使いは嘘付きしかいないw
2022/03/20(日) 18:22:11.71ID:6IwS75Da
>>673
ガイガー君の書き込み>>669でも&が同じように付いている
つまりガイガー君は自分の誤りを認めたことになる
2022/03/20(日) 18:28:57.25ID:1+CNf8az
>>674
俺はちゃんとその>>669

> そして>>656の実装でsubsets(subsets(&["a", "b", "c"]))はエラーwwww

と言ってるので誤っていないw 誤っているのは、>>669

> それはさておき元と同じインタフェースならばRust版は>>656の実装でOK
> subsets(subsets(&["a", "b", "c"])) でべき集合のべき集合がちゃんと得られますね

という部分w
なんでこうまで説明されないと間違いを認められないんだろうなwwww
駆け出しRuster推しのお馬鹿さんたちがRustも使えないことが判明w
2022/03/20(日) 18:37:30.55ID:GV4qdrT7
実際に>>672で動作してるのだからRustの勝利
C++はコードの片鱗すら出てこない
2022/03/20(日) 18:44:09.03ID:1+CNf8az
>>572でFAなんだもんw
想像もできないくらいC++書けない人が文句言ってても何も気にならんw
両方書けるようになってから、ほらこんなになるじゃんって持ってきたら添削してやるよw
2022/03/20(日) 19:01:47.10ID:eXUaH9c5
C++20を使いこなせる人がいないことが敗北原因
Rustよりも利用者少ない
だからこのスレにもC++で書ける人が誰もいない
2022/03/20(日) 19:03:19.57ID:1+CNf8az
俺は書けるけどねwwwww
というかお前が書けないのに書き込んでるからこんな変な話になってるだけで、本来は書ける前提でああでもないこうでもないやるスレだろwwww
2022/03/20(日) 19:05:31.63ID:DiBIkIVz
それ、昔のコンパイラを今でも使ってる人達にも言えるの?
2022/03/20(日) 19:11:26.79ID:1+CNf8az
は?俺だって必要なら昔のコンパイラ使うぞw
特定CPU用のなんて安定したバージョンでないとバグ踏むからなw
2022/03/20(日) 19:59:25.97ID:kJ/tleYc
C++使えなくてRustは使えますとか、
あと10年はなんの価値もないんじゃ...
2022/03/20(日) 22:31:20.58ID:271cfGdl
そんな妄想をしても場所によりけり
うちはC++以外の諸言語からRustへ移行したので
Rust使えずC++使える人は価値ゼロ
といったように
2022/03/20(日) 23:04:08.64ID:1+CNf8az
それは最高にやばそうだなw
2022/03/20(日) 23:25:08.78ID:Ftc+D3LS
業界標準ツールのRust化も激しいよな
例えばJavaScriptでおなじみのトランスパイラBabel
遅いので当然ながらRust版のSWCというのが作成されて
React/Next.jp環境でもBabelからそのRust版へと移行された
2022/03/20(日) 23:39:52.49ID:1+CNf8az
全部であるかのごとくに書いてるけどごくごく一部だし、しかも期待したほど速度が上がらずに困ってたよねw
JavaScriptに比べてだぞ?w
2022/03/20(日) 23:57:33.12ID:jG5ySy9q
>>686
swcはbabelより20〜50倍速い
2022/03/21(月) 00:09:57.25ID:BAdp3agq
公称だろ?w 実際試した人がそうでもなかった(忘れたけど1.x倍くらい)って言ってたよw
2022/03/21(月) 00:10:28.20ID:BAdp3agq
しかも場合によっては遅くなるって言ってたw
2022/03/21(月) 00:53:26.08ID:1rsJ1Bxd
>>688 >>689
虚言癖
2022/03/21(月) 01:13:09.95ID:BAdp3agq
まあ自分で試したわけじゃないから、そう言われても何とも言えんけどなw
2022/03/21(月) 03:44:24.39ID:qXBNR9Nr
>>669
> fn subsets_collect<T>(s: &Vec<T>)

ガイガー君は相変わらず素人のままだな
そこは&Vec<T>ではなく&[T]と書くのだよ
Vec自体の固有機能に関する動作の場合を除き
狭くVecのみを対象にするのはバカげている
スライスを対象にするのが鉄則

&Vec<T> ←Vecしか受け付けられない
&[T] ←Vecも配列もスライスも受け付ける
2022/03/21(月) 04:14:12.72ID:BAdp3agq
>>692
そんなこと言われなくても知っとるわwwww
それは俺のポリシーとして、可能ならVecを返すならVecを受けたいだけw
今回のケースではメリットとかないよw
同様にsliceで受けたらArrayで返したいし、iteratorを受けたらiteratorを返したいw
2022/03/21(月) 04:24:26.11ID:Czlt7YRo
>>693
arrayとsliceは別物ですよ
arrayで受けたらarrayで返したいなら意味がわかりますし実際にmapはその仕様ですけど
2022/03/21(月) 04:53:35.01ID:BAdp3agq
>>694
[i32] ... Array
&[i32] ... スライス
T ... T
&T ... Tの参照
という理解で、
・特定の型の参照はスライスとして扱える
・Arrayの参照はスライスと区別できない
と思ってて
→スライスで渡されたらArrayで返す
という発想なんだが、違うの?
2022/03/21(月) 05:13:22.29ID:Czlt7YRo
>>695
違います
[T] … これがスライス (動的サイズ)
[T; N] … これが配列 (固定サイズ)
明確に異なるprimitive typeです
2022/03/21(月) 05:32:43.26ID:BAdp3agq
>>696
なん。。だと!?!?そんな基本的なところを気付いていなかったのかw
では
・Arrayの参照(&[T;N])はスライス([T])と区別できる
let a = &[1,2,3];
のaは俺はずっとスライスと思ってたけど、そうではなく、
let a = &[1,2,3] as &[i32];
とかでないとスライス(の参照)にはならんってことかwwww
これはすまんかったw
ちょっともう一度最初から整理し直さないといかんかもw

ありがとw
2022/03/21(月) 06:00:44.84ID:Czlt7YRo
>>697
そこはコアースされます
配列とスライスの違いをわかりやすく使用例で示しましょう
まず「配列を受け取り」その各値を2倍にした「配列を返す」関数twice()です
fn twice<const N: usize>(input: &[isize; N]) -> [isize; N] {
let mut output: [isize; N] = [0; N];
for i in 0..N {
output[i] = input[i] * 2;
}
output
}
わかりやすいようforで回して代入しています
fn main() {
let input = [1, 2, 3];
println!("{:?}", twice(&input));
}
もちろんちゃんと動いて[2, 4, 6]となりますね
この関数の引数をスライスを受け取るように型を&[isize]へ変えても大丈夫なのですが
ただし関数を使う時にちょっと状況が変わってきます
そこには様々な違いと問題が生じますので実体験しましょう
これがスライスと配列の違いを理解するためのあなたへの宿題です
2022/03/21(月) 06:10:12.41ID:BAdp3agq
>>698
それは蛇足w Rust信者はそういうことするからダメなんだよw
別に必ず同じ固定サイズになるとは限らないから、そんな方法は考えてもいないw
2022/03/21(月) 06:18:10.57ID:Czlt7YRo
>>699
ほら、理解できていませんね
その発言からあなたはまだ机上の妄想の世界にいます
わかった気になって宿題をしていないダメな子パターン
2022/03/21(月) 06:22:52.71ID:BAdp3agq
>>700
一応配列で渡されたら配列で返したい心理の説明をしておくと、例えばベクタなど配列と同じような構造で動的に拡張可能なコレクションをずっと持ち回っていると、そいつが過去に持っていたデータなどが後ろにくっついてる可能性があったり、余計なメモリを確保していたり、gcなどが効きにくくなったりするので、内部処理で使ったオブジェクトではない、綺麗な生成データを固定で作って返す風習があるんだよw
2022/03/21(月) 06:32:23.88ID:Czlt7YRo
>>701
あなたは>>693
sliceで受けてarrayで返したいと言いました
そこで先ほどの例twice関数をその仕様で作る宿題をあなたに課しました
宿題をしてそこでの課題を得ることができましたか?
2022/03/21(月) 06:33:56.07ID:BAdp3agq
>>702
できるし頼んでないのでwwwww
2022/03/21(月) 06:40:05.89ID:Czlt7YRo
>>703
いいえ
あなたは>>695で配列とスライスを正しく理解できていませんでした
そして宿題もこなせず
そこで何が問題なのかもいまだ理解できていません
2022/03/21(月) 06:42:57.16ID:BAdp3agq
>>704
1+1が出来ることは証明する必要もないんだよw
君のように誰かに認めてもらいたいだけの人は別にしてw
俺は面白いから構ってあげるけどねw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況