競え
※前スレ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
探検
C vs C++ vs Rust Part.2
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2021/12/15(水) 12:35:50.91ID:biBE4xC0168デフォルトの名無しさん
2021/12/23(木) 11:37:52.36ID:Gjq2t2pD >>167
FTは無限大集合を扱っている訳では無いだろ。実数とか扱えないし。
FTは無限大集合を扱っている訳では無いだろ。実数とか扱えないし。
169デフォルトの名無しさん
2021/12/23(木) 12:01:15.99ID:l46o0/Jm 周期信号のフーリエ級数展開なら有限だけど連続信号を扱うなら無限積分の計算が必要
FTは無限積分を数値計算するため分割統治のバタフライ演算に落とし込んで更に演算量を抑えるため各種のアルゴリズムが考案されてる
FTは無限積分を数値計算するため分割統治のバタフライ演算に落とし込んで更に演算量を抑えるため各種のアルゴリズムが考案されてる
170デフォルトの名無しさん
2021/12/23(木) 12:32:25.74ID:GoKXBRn5 で、新しい枠組みを作り出すことが C vs C++ vs Rust にどう関わってくるの
171デフォルトの名無しさん
2021/12/23(木) 12:46:22.58ID:l46o0/Jm 枠組みを作ることは凡人には無理
殆どは枠組みを使う人
ただ枠組みの仕組みを知らないと使うことも出来ない
殆どは枠組みを使う人
ただ枠組みの仕組みを知らないと使うことも出来ない
172デフォルトの名無しさん
2021/12/23(木) 12:56:14.10ID:GHRrX/7/ 最早スレチの話題に突っ込んで悪いけど、無限積分を回避できている気になっているのは気のせいであって、バタフライ演算とか関係ないからね(笑)
173デフォルトの名無しさん
2021/12/23(木) 17:57:47.72ID:NwYcCv97 以前に皆さま方からアドバイスをいただいて
『足し算のみで素数列を生成するジェネリックなイテレータの実装』
を当時O(N^3)という酷さでしたが、このたびほぼ O(N) の新たなアルゴリズムと実装が出来ましたのでご報告します
足し算の総回数を O(N log log N) すなわちほぼ O(N) 近くにすることに成功しました
具体的には 1億(=10^8) までの素数生成に必要とする 足し算の総回数が 2.5億回 とリニアになりました
前回と異なりメモ化をしていますがこちらも工夫により配列の長さを O(√N / log N) に抑えることに成功しました
具体的には 1億(=10^8) までの素数生成に必要とする 配列の長さが 1231 と非常に小さな領域のみで実現できました
10^kまでの素数を順に生成時の足し算の総回数 O(N log log N)
10^1 4.70×10^1=47
10^2 2.03×10^2=203
10^3 1.90×10^3=1903
10^4 1.95×10^4=19508
10^5 2.12×10^5=212715
10^6 2.27×10^6=2278220
10^7 2.41×10^7=24148110
10^8 2.54×10^8=254082528
10^kまでの素数を順に生成時の配列の長さ O(√N / log N)
10^1 4
10^2 6
10^3 13
10^4 27
10^5 67
10^6 170
10^7 448
10^8 1231
メモリ使用もこの程度の少なさで
足し算を2.5億回とその比較だけで1億までの全ての素数を順に出力できるようになりました
このスレは数学が得意な方々が多いようなのでご検証よろしくお願いします
『足し算のみで素数列を生成するジェネリックなイテレータの実装』
を当時O(N^3)という酷さでしたが、このたびほぼ O(N) の新たなアルゴリズムと実装が出来ましたのでご報告します
足し算の総回数を O(N log log N) すなわちほぼ O(N) 近くにすることに成功しました
具体的には 1億(=10^8) までの素数生成に必要とする 足し算の総回数が 2.5億回 とリニアになりました
前回と異なりメモ化をしていますがこちらも工夫により配列の長さを O(√N / log N) に抑えることに成功しました
具体的には 1億(=10^8) までの素数生成に必要とする 配列の長さが 1231 と非常に小さな領域のみで実現できました
10^kまでの素数を順に生成時の足し算の総回数 O(N log log N)
10^1 4.70×10^1=47
10^2 2.03×10^2=203
10^3 1.90×10^3=1903
10^4 1.95×10^4=19508
10^5 2.12×10^5=212715
10^6 2.27×10^6=2278220
10^7 2.41×10^7=24148110
10^8 2.54×10^8=254082528
10^kまでの素数を順に生成時の配列の長さ O(√N / log N)
10^1 4
10^2 6
10^3 13
10^4 27
10^5 67
10^6 170
10^7 448
10^8 1231
メモリ使用もこの程度の少なさで
足し算を2.5億回とその比較だけで1億までの全ての素数を順に出力できるようになりました
このスレは数学が得意な方々が多いようなのでご検証よろしくお願いします
174デフォルトの名無しさん
2021/12/23(木) 18:08:00.97ID:NwYcCv97 今回は読みやすいようにループで記述しました
impl<T> Iterator for 素数生成Iterator<T>
where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
type Item = T;
fn next(&mut self) -> Option<T> {
'次候補: loop {
self.新素数 = self.新素数.checked_add(&T::one())?;
if self.新素数 == self.倍数[self.上限] {
self.上限 += 1;
if self.子.is_some() {
self.素数.push(self.子.as_mut()?.next()?);
}
self.倍数.push(二乗(self.素数[self.上限]));
}
for index in 1..self.上限 {
while self.倍数[index] != T::zero() && self.倍数[index] < self.新素数 {
self.倍数[index] = self.倍数[index].checked_add(&self.素数[index]).unwrap_or(T::zero());
}
if self.倍数[index] == self.新素数 {
continue '次候補;
}
}
break;
}
if self.子.is_none() {
self.素数.push(self.新素数);
}
Some(self.新素数)
}
}
impl<T> Iterator for 素数生成Iterator<T>
where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
type Item = T;
fn next(&mut self) -> Option<T> {
'次候補: loop {
self.新素数 = self.新素数.checked_add(&T::one())?;
if self.新素数 == self.倍数[self.上限] {
self.上限 += 1;
if self.子.is_some() {
self.素数.push(self.子.as_mut()?.next()?);
}
self.倍数.push(二乗(self.素数[self.上限]));
}
for index in 1..self.上限 {
while self.倍数[index] != T::zero() && self.倍数[index] < self.新素数 {
self.倍数[index] = self.倍数[index].checked_add(&self.素数[index]).unwrap_or(T::zero());
}
if self.倍数[index] == self.新素数 {
continue '次候補;
}
}
break;
}
if self.子.is_none() {
self.素数.push(self.新素数);
}
Some(self.新素数)
}
}
175デフォルトの名無しさん
2021/12/23(木) 18:17:16.76ID:NwYcCv97 上述に「子」とあるのはメモリ節約のためのテクニックで
「子」と「孫」を再帰的に利用しているためです
「自分」だけで必要なメモリをNとすると
「子」を利用することでメモリが√Nで済むように設計しました
また、 self.上限 が配列の長さで
self.新素数 が1億(=10^8)まで進んだ時点で self.上限 が 1231 です
self.上限 が更新された時のみ、つまり1億までで1231回だけ
コードにあるように以下の二乗する関数が呼ばれます
fn 二乗<T>(n: T) -> T
where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
let mut count = T::one();
let mut result = n;
while result != T::zero() && count < n {
count = count.checked_add(&T::one()).unwrap();
result = result.checked_add(&n).unwrap_or(T::zero());
}
result
}
「子」と「孫」を再帰的に利用しているためです
「自分」だけで必要なメモリをNとすると
「子」を利用することでメモリが√Nで済むように設計しました
また、 self.上限 が配列の長さで
self.新素数 が1億(=10^8)まで進んだ時点で self.上限 が 1231 です
self.上限 が更新された時のみ、つまり1億までで1231回だけ
コードにあるように以下の二乗する関数が呼ばれます
fn 二乗<T>(n: T) -> T
where T: Copy + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialOrd,
{
let mut count = T::one();
let mut result = n;
while result != T::zero() && count < n {
count = count.checked_add(&T::one()).unwrap();
result = result.checked_add(&n).unwrap_or(T::zero());
}
result
}
176デフォルトの名無しさん
2021/12/23(木) 18:20:15.44ID:NwYcCv97 fn main() {
assert_eq!(vec![2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127], 素数生成::<i8>().collect::<Vec<_>>());
assert_eq!(65521, 素数生成::<u16>().last().unwrap());
assert_eq!(78498, 素数生成::<u32>().take_while(|&p| p < 1000000).count());
}
fn 素数生成<T>() -> 素数生成Iterator<T> where T: Copy + num::One + num::CheckedAdd {
let 孫 = 素数生成Iterator::<T>::new(None);
let 子 = 素数生成Iterator::<T>::new(Some(孫));
素数生成Iterator::<T>::new(Some(子))
}
struct 素数生成Iterator<T> {
素数: Vec<T>,
倍数: Vec<T>,
新素数: T,
上限: usize,
子: Option<Box<Self>>,
}
impl<T> 素数生成Iterator<T> where T: Copy + num::One + num::CheckedAdd {
fn new(子指定: Option<Self>) -> Self {
let three = T::one().checked_add(&T::one()).unwrap().checked_add(&T::one()).unwrap();
Self {
素数: vec![T::one()],
倍数: vec![three],
新素数: T::one(),
上限: 0,
子: 子指定.map(|子| Box::new(子)),
}
}
}
assert_eq!(vec![2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127], 素数生成::<i8>().collect::<Vec<_>>());
assert_eq!(65521, 素数生成::<u16>().last().unwrap());
assert_eq!(78498, 素数生成::<u32>().take_while(|&p| p < 1000000).count());
}
fn 素数生成<T>() -> 素数生成Iterator<T> where T: Copy + num::One + num::CheckedAdd {
let 孫 = 素数生成Iterator::<T>::new(None);
let 子 = 素数生成Iterator::<T>::new(Some(孫));
素数生成Iterator::<T>::new(Some(子))
}
struct 素数生成Iterator<T> {
素数: Vec<T>,
倍数: Vec<T>,
新素数: T,
上限: usize,
子: Option<Box<Self>>,
}
impl<T> 素数生成Iterator<T> where T: Copy + num::One + num::CheckedAdd {
fn new(子指定: Option<Self>) -> Self {
let three = T::one().checked_add(&T::one()).unwrap().checked_add(&T::one()).unwrap();
Self {
素数: vec![T::one()],
倍数: vec![three],
新素数: T::one(),
上限: 0,
子: 子指定.map(|子| Box::new(子)),
}
}
}
177デフォルトの名無しさん
2021/12/23(木) 18:29:41.75ID:NwYcCv97 コードは以上です
今回はitertools::unfold()を用いなかったため、それにより省略できていた、
「イテレータ用構造体の宣言」「その初期化」「そのIteratorトレイト実装宣言」
などが今回は必要となりコードがその分だけ長くなっていますが
イテレータの実装本体部分は>>174のみです
足し算の総回数が O(N log log N) 例: 素数を1億までで2.5億回
メモリは配列の長さが O(√N / log N) 例: 素数を1億までで長さ1231使用
これらを足し算のみで実現できています
どうぞご検証よろしくお願いします
今回はitertools::unfold()を用いなかったため、それにより省略できていた、
「イテレータ用構造体の宣言」「その初期化」「そのIteratorトレイト実装宣言」
などが今回は必要となりコードがその分だけ長くなっていますが
イテレータの実装本体部分は>>174のみです
足し算の総回数が O(N log log N) 例: 素数を1億までで2.5億回
メモリは配列の長さが O(√N / log N) 例: 素数を1億までで長さ1231使用
これらを足し算のみで実現できています
どうぞご検証よろしくお願いします
178デフォルトの名無しさん
2021/12/23(木) 18:41:40.03ID:eB9sLMVm 嫌われ者Rusterのウザウザ全文貼り付け、見るのも嫌になる自己満足オナニー
179デフォルトの名無しさん
2021/12/23(木) 18:47:57.52ID:y6QdIUGa なんかやたら足し算のみで、って強調してるけど、
アルゴリズムはエラトステネスの篩だよね?
そう言ってくれたほうが理解しやすいよ
Rustはまだあんま良くわかってないのでコードは参考になるかも
でもテストケースに127が入ってるのはおかしくない?
アルゴリズムはエラトステネスの篩だよね?
そう言ってくれたほうが理解しやすいよ
Rustはまだあんま良くわかってないのでコードは参考になるかも
でもテストケースに127が入ってるのはおかしくない?
180デフォルトの名無しさん
2021/12/23(木) 18:49:15.20ID:y6QdIUGa あ、おかしくなかった
すまん
すまん
181デフォルトの名無しさん
2021/12/23(木) 19:25:25.17ID:2KeIelt0 アルゴリズムに興味がある場合はCが読みやすいということがよくわかった
182デフォルトの名無しさん
2021/12/23(木) 20:59:20.34ID:QAvlUc5m 1億までの素数を全て求めるのが2.5億回の足し算だけで出来るものなのか??
メモリもエラトステネスだと1億必要だよな?
メモリもエラトステネスだと1億必要だよな?
183デフォルトの名無しさん
2021/12/23(木) 23:06:13.63ID:MjSWMWRR 一億たって100メガにすぎませんからね。
184デフォルトの名無しさん
2021/12/23(木) 23:52:41.64ID:NwYcCv97 >>182
1億回の素数判定を個別に考えると平均2.5回の足し算となりもちろん無理です
そこで過去の判定時で用いた足し算の結果を後の判定時に用いる方法で
結果的に平均2.5回の足し算で済ませています
また、単純にエラトステネスのふるいでは1億の長さの配列が必要となりますが
まず時間と空間を逆転させることで必要となる配列の長さを減らしています
さらに再帰的に子と孫のイテレータを活用することで
>>173の表のように1億(=10^8)まで判定時で配列の長さ1231に抑えています
その時点で子と孫では配列の長さ27となっています
>>183
そんなO(N)のペースでメモリを使用していくのはいずれ限界もありますし
メモリキャッシュヒットの観点からも望ましくないと思います
さらに今回は小さい方から順に素数を返すイテレータです
イテレータ利用者は1億を超えて素数を利用するかもしれませんし
逆にもっと少ない小さい数のみ利用するかもしれません
最初に上限が1億など決まって開始する古典的エラトステネスのふるいでは上手くいかないのです
1億回の素数判定を個別に考えると平均2.5回の足し算となりもちろん無理です
そこで過去の判定時で用いた足し算の結果を後の判定時に用いる方法で
結果的に平均2.5回の足し算で済ませています
また、単純にエラトステネスのふるいでは1億の長さの配列が必要となりますが
まず時間と空間を逆転させることで必要となる配列の長さを減らしています
さらに再帰的に子と孫のイテレータを活用することで
>>173の表のように1億(=10^8)まで判定時で配列の長さ1231に抑えています
その時点で子と孫では配列の長さ27となっています
>>183
そんなO(N)のペースでメモリを使用していくのはいずれ限界もありますし
メモリキャッシュヒットの観点からも望ましくないと思います
さらに今回は小さい方から順に素数を返すイテレータです
イテレータ利用者は1億を超えて素数を利用するかもしれませんし
逆にもっと少ない小さい数のみ利用するかもしれません
最初に上限が1億など決まって開始する古典的エラトステネスのふるいでは上手くいかないのです
185デフォルトの名無しさん
2021/12/24(金) 00:05:23.52ID:jmk0MHfo キャッシュヒット率の話するならベンチマークとってくれ
186デフォルトの名無しさん
2021/12/24(金) 00:12:47.34ID:1YPq+lkD わざわざ決まってる数列を順番に出力するイテレータ書くのにそんな記述が必要になるのか
ちょっと普通のループでいいからC言語で書いてみてよ
ちょっと普通のループでいいからC言語で書いてみてよ
187デフォルトの名無しさん
2021/12/24(金) 00:19:39.24ID:HWkip0+R188デフォルトの名無しさん
2021/12/24(金) 19:37:12.56ID:MpuWLPBj イテレータにすると、プログラミングの方向が変わるんですよ。
詳細を未来に先送りできるんです。
伝統ある手続き型の手法では、システムやライブラリを書く人が詳細を実装し、使う人は大まかな指示を出しましたよね。
イテレータ手法は、未来に詳細を決定する。
つまり使う人が細かいことを決める事になるんです。
そこらへんの詳しい話は、書籍クリーンアーキテクチャに載ってます。
この本に書かれてることがすべて正しいとは言いませんが、正しいことにしろ間違ってることにしろ、読んでおいて損はないです。
詳細を未来に先送りできるんです。
伝統ある手続き型の手法では、システムやライブラリを書く人が詳細を実装し、使う人は大まかな指示を出しましたよね。
イテレータ手法は、未来に詳細を決定する。
つまり使う人が細かいことを決める事になるんです。
そこらへんの詳しい話は、書籍クリーンアーキテクチャに載ってます。
この本に書かれてることがすべて正しいとは言いませんが、正しいことにしろ間違ってることにしろ、読んでおいて損はないです。
189デフォルトの名無しさん
2021/12/24(金) 19:43:08.10ID:jmk0MHfo イテレータ特有の話と言うより遅延評価全般の話に読めるが
190デフォルトの名無しさん
2021/12/24(金) 20:57:48.40ID:4EcCA1ju イテレータ万能説を唱えて長文するガチキチおじさんwww
yieldはgeneratorをレイトバインド
for(range)はiteratorをレイトバインド
async/awaitはfutrueをレイトバインド
詳細を未来に先送り!キリッw
yieldはgeneratorをレイトバインド
for(range)はiteratorをレイトバインド
async/awaitはfutrueをレイトバインド
詳細を未来に先送り!キリッw
191デフォルトの名無しさん
2021/12/24(金) 21:06:12.59ID:MpuWLPBj >>190
さあご一緒に、キリツ!
さあご一緒に、キリツ!
192デフォルトの名無しさん
2021/12/24(金) 21:28:57.48ID:fTLW+5qu レイト「バインド」?
193デフォルトの名無しさん
2021/12/24(金) 21:44:54.12ID:cMhJNtck クリーンアーキテクチャを出してるから遅延評価のことじゃなく
IoCの一例としての高階関数のことを言いたいんじゃないかな?
IoCの一例としての高階関数のことを言いたいんじゃないかな?
194デフォルトの名無しさん
2021/12/24(金) 22:01:56.18ID:piC+XKnR 昔は局所化して先送りにできることは素晴らしいことだと思ってた
でも最近そんなのは些末な事で、無能な働き者が気にすることだったなと考えを改めた
木を見て森を見ずと言うべきか
でも最近そんなのは些末な事で、無能な働き者が気にすることだったなと考えを改めた
木を見て森を見ずと言うべきか
195デフォルトの名無しさん
2021/12/24(金) 22:55:30.83ID:UVQKl71H >>188
ある意味その考え方も正しいかもしれませんが
イテレータは例えば大ざっぱに分けても5種類はあるので
自分が作る部分がどの部分かによってその立場も変わると思います
(1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
(2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
(3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの
(4) 合成イテレータ … chain()、zip()、merge()など複数のイテレータを入力とするもの
(5) 創造イテレータ … unfold()などイテレータを生み出す汎用イテレータ
とりあえず(4)(5)は置いとくにしても自分が作る部分は用途によって(1)か(2)か(3)と変わるため大きく立場も異なります
>>189
一般的に遅延評価による先送りといえば主役はクロージャですね
上述したイテレータを作り出すunfold()もクロージャを渡すことで成立しています
>>190
futureは「未来に先送り」ではなく「未来を先取り」と捉えたほうがよくないでしょうか
そして遅延評価というよりも並行並列評価する形になりますね
したがって今回の話には適さないかなと思います
ある意味その考え方も正しいかもしれませんが
イテレータは例えば大ざっぱに分けても5種類はあるので
自分が作る部分がどの部分かによってその立場も変わると思います
(1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
(2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
(3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの
(4) 合成イテレータ … chain()、zip()、merge()など複数のイテレータを入力とするもの
(5) 創造イテレータ … unfold()などイテレータを生み出す汎用イテレータ
とりあえず(4)(5)は置いとくにしても自分が作る部分は用途によって(1)か(2)か(3)と変わるため大きく立場も異なります
>>189
一般的に遅延評価による先送りといえば主役はクロージャですね
上述したイテレータを作り出すunfold()もクロージャを渡すことで成立しています
>>190
futureは「未来に先送り」ではなく「未来を先取り」と捉えたほうがよくないでしょうか
そして遅延評価というよりも並行並列評価する形になりますね
したがって今回の話には適さないかなと思います
196デフォルトの名無しさん
2021/12/24(金) 23:02:03.16ID:UVQKl71H >>186
> わざわざ決まってる数列を順番に出力するイテレータ書くのにそんな記述が必要になるのか
決まってる数列ではなく毎回算出するんですよ
記述については各々のイテレータはそれぞれ何らかの構造体にすぎないので >>176に示しましたように
「(a) イテレータとなる構造体の型宣言」「(b) その構造体の初期値定義 new()」「(c) 今回は自分と子と孫がいるためその関係記述」
があってようやく、>174に示しました「(d) イテレータ自体の毎回の算出コード」がそこに加わります
一般的にも今回の特殊な用途(c)を除いた3つ(a)(b)(d)は必要です
さらに>>195でいうところの仲介型イテレータはそれらの記述に加えて
「(e) 他のイテレータのメソッドとなりチェーンできるようにするための宣言」がさらに必要となります
上述(a)(b)(d)の部分の記述だけならば
お手軽にイテレータを生成できる itertools::unfold() を使えるケースだと
例えばフィボナッチ数列を返すジェネリックなイテレータは
以下のように初期値と処理クロージャを1つunfold()に与えてやればイテレータを作れます
fn fibonacci<T>() -> impl Iterator<Item=T>
where T: Clone + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialEq,
{
itertools::unfold((T::one(), T::one()), |(m, n)| {
if *m == T::zero() {
// overflow
return None;
}
// shift: ret <- m <- n <- next
let next = m.checked_add(&*n).unwrap_or(T::zero());
let ret = m.clone();
*m = n.clone();
*n = next;
Some(ret)
})
}
> わざわざ決まってる数列を順番に出力するイテレータ書くのにそんな記述が必要になるのか
決まってる数列ではなく毎回算出するんですよ
記述については各々のイテレータはそれぞれ何らかの構造体にすぎないので >>176に示しましたように
「(a) イテレータとなる構造体の型宣言」「(b) その構造体の初期値定義 new()」「(c) 今回は自分と子と孫がいるためその関係記述」
があってようやく、>174に示しました「(d) イテレータ自体の毎回の算出コード」がそこに加わります
一般的にも今回の特殊な用途(c)を除いた3つ(a)(b)(d)は必要です
さらに>>195でいうところの仲介型イテレータはそれらの記述に加えて
「(e) 他のイテレータのメソッドとなりチェーンできるようにするための宣言」がさらに必要となります
上述(a)(b)(d)の部分の記述だけならば
お手軽にイテレータを生成できる itertools::unfold() を使えるケースだと
例えばフィボナッチ数列を返すジェネリックなイテレータは
以下のように初期値と処理クロージャを1つunfold()に与えてやればイテレータを作れます
fn fibonacci<T>() -> impl Iterator<Item=T>
where T: Clone + num::Zero + num::One + num::CheckedAdd + std::cmp::PartialEq,
{
itertools::unfold((T::one(), T::one()), |(m, n)| {
if *m == T::zero() {
// overflow
return None;
}
// shift: ret <- m <- n <- next
let next = m.checked_add(&*n).unwrap_or(T::zero());
let ret = m.clone();
*m = n.clone();
*n = next;
Some(ret)
})
}
197デフォルトの名無しさん
2021/12/24(金) 23:05:16.16ID:UVQKl71H198デフォルトの名無しさん
2021/12/24(金) 23:17:20.90ID:759ZBatD より良い方法に興味があるんなら、普通に既存実装を研究してみたらいいんじゃない?
例えばRubyの標準添付ライブラリにも Prime.each があるよ
ソースはここ https://github.com/ruby/prime
おれはそこまで素数のアルゴリズム自体には興味ないから考えないけど
例えばRubyの標準添付ライブラリにも Prime.each があるよ
ソースはここ https://github.com/ruby/prime
おれはそこまで素数のアルゴリズム自体には興味ないから考えないけど
199デフォルトの名無しさん
2021/12/25(土) 01:08:34.65ID:0QMGJaE9 >>197
CかC++で書いて
CかC++で書いて
200デフォルトの名無しさん
2021/12/25(土) 04:20:39.50ID:9OzOPrjS C/C++/Rustならどの言語も理解できないほどの特異な書き方や奇妙な省略もなくどれも似たようなもんだ
どれか一つで書かれていれば普通のプログラマーなら読めるだろう
それでもわからない部分があれば質問したら皆が教えてくれるぞ
どれか一つで書かれていれば普通のプログラマーなら読めるだろう
それでもわからない部分があれば質問したら皆が教えてくれるぞ
201デフォルトの名無しさん
2021/12/25(土) 06:09:26.55ID:sZ4+jXNJ202デフォルトの名無しさん
2021/12/25(土) 09:05:26.62ID:0QMGJaE9 >>200
普通のプログラマじゃなくて雑魚なんで
Rustで書かれたコードはわからないしRustの説明が欲しいわけじゃない
C/C++で書かれてれば説明無用だから全部わかるならC/C++で書いてくれない?
普通のプログラマじゃなくて雑魚なんで
Rustで書かれたコードはわからないしRustの説明が欲しいわけじゃない
C/C++で書かれてれば説明無用だから全部わかるならC/C++で書いてくれない?
203デフォルトの名無しさん
2021/12/25(土) 13:08:57.90ID:6OMvh/ue Ruby の無限generator は、遅延評価する。lazy
普通に、メソッドチェーンを左から処理していくと、
無限に処理できないので、右から処理していく
素数は、6 で割って余りが、1 か5
余りが3なら、3で割り切れる。
余りが2, 4なら、2で割り切れる
普通に、メソッドチェーンを左から処理していくと、
無限に処理できないので、右から処理していく
素数は、6 で割って余りが、1 か5
余りが3なら、3で割り切れる。
余りが2, 4なら、2で割り切れる
204デフォルトの名無しさん
2021/12/25(土) 13:31:00.64ID:Jczj7qaZ 素数に2,3が含まれるの忘れてる?
205デフォルトの名無しさん
2021/12/25(土) 13:54:13.44ID:0QMGJaE9 if (25 % 6 == 1) {
//25は素数?
}
//25は素数?
}
206デフォルトの名無しさん
2021/12/25(土) 14:02:33.11ID:+KvRe5Is >>205
さすがに必要条件と十分条件がわからないのはどうかと思う
さすがに必要条件と十分条件がわからないのはどうかと思う
207デフォルトの名無しさん
2021/12/25(土) 14:14:33.50ID:0QMGJaE9208デフォルトの名無しさん
2021/12/25(土) 14:21:15.89ID:6Qf096MJ >>194
その考え方がまさに木を見て森を見ず
その考え方がまさに木を見て森を見ず
209デフォルトの名無しさん
2021/12/25(土) 14:40:34.51ID:E7PEPPKI210デフォルトの名無しさん
2021/12/25(土) 15:29:54.15ID:0QMGJaE9 その事実を利用してまずは数を6で割って余りが1 or 5のとき
改めて素数かどうかを判定する関数に通すってことか?
rem = X % 6
if ((rem == 1 || rem == 5) && is_prime(X)) {
// Xは素数
}
else {
// Xは合成数
}
改めて素数かどうかを判定する関数に通すってことか?
rem = X % 6
if ((rem == 1 || rem == 5) && is_prime(X)) {
// Xは素数
}
else {
// Xは合成数
}
211デフォルトの名無しさん
2021/12/25(土) 16:04:02.04ID:a8rAfIFO 必要十分を理解してないエンジンは無価値
212デフォルトの名無しさん
2021/12/25(土) 16:50:37.75ID:sZ4+jXNJ 電気モーターの時代だから。
213デフォルトの名無しさん
2021/12/25(土) 17:51:05.49ID:cg2rHVf2 >>195
発信、受信、仲介、合成、創造?
コンピューターサイエンス分野を見てもRust公式を見てもそんな用語は1つもないけど
それってもしかしてあんたの個人的な思想ですか?それなら知りたくないのでウザいので黙っててもらえますか?
したがって今回のRustオジサンは気持ち悪い基地外だと思います
発信、受信、仲介、合成、創造?
コンピューターサイエンス分野を見てもRust公式を見てもそんな用語は1つもないけど
それってもしかしてあんたの個人的な思想ですか?それなら知りたくないのでウザいので黙っててもらえますか?
したがって今回のRustオジサンは気持ち悪い基地外だと思います
214デフォルトの名無しさん
2021/12/25(土) 17:58:00.70ID:+KvRe5Is >>213
気持ちはわかるけど最後の一文が個人的な気持ちになってて同じ穴の狢になってない?
気持ちはわかるけど最後の一文が個人的な気持ちになってて同じ穴の狢になってない?
215デフォルトの名無しさん
2021/12/25(土) 18:19:18.17ID:IFpjnGkc >発信、受信、仲介、合成、創造
たしかにこの用語なんなん? どっから出てきたの?
どの界隈のコンセンサスで得てる言葉なの?
たしかにこの用語なんなん? どっから出てきたの?
どの界隈のコンセンサスで得てる言葉なの?
216デフォルトの名無しさん
2021/12/25(土) 18:20:04.09ID:IFpjnGkc >コンサンサスで
じゃなくて、コンセンサスを
じゃなくて、コンセンサスを
217デフォルトの名無しさん
2021/12/25(土) 18:26:25.36ID:E7PEPPKI ワイもこの用語はわかんなかった
218デフォルトの名無しさん
2021/12/25(土) 19:07:03.87ID:PUQlITfY 仲介なんて不動産屋でしか聞いたことないわw
219デフォルトの名無しさん
2021/12/25(土) 19:14:05.00ID:9OzOPrjS イテレーターを作ったことがない初心者プログラマーには理解が難しいと思うが
命名はともかくイテレーターがそのように分類されることは俺でもわかるぜ
>(1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
これはRustだとimpl Iterator for XXXのみ実装のイテレーター
つまり他者のnext()は利用せずに他者に対してnext()を提供
>(2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
これはRustだとimpl Iterator for XXXおよびimpl XXX for Iteratorと両方実装のイテレーター
つまり他者のnext()を利用しつつ別の他者に対してnext()を提供
>(3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの
これはRustだとimpl XXX for Iteratorのみ実装のイテレーター
つまり他者のnext()を利用するが他者に対してnext()を提供せず
以前に議論されていた消費者プログラマー(?)だと区別を一生気付かないままかもしれぬ
命名はともかくイテレーターがそのように分類されることは俺でもわかるぜ
>(1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
これはRustだとimpl Iterator for XXXのみ実装のイテレーター
つまり他者のnext()は利用せずに他者に対してnext()を提供
>(2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
これはRustだとimpl Iterator for XXXおよびimpl XXX for Iteratorと両方実装のイテレーター
つまり他者のnext()を利用しつつ別の他者に対してnext()を提供
>(3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの
これはRustだとimpl XXX for Iteratorのみ実装のイテレーター
つまり他者のnext()を利用するが他者に対してnext()を提供せず
以前に議論されていた消費者プログラマー(?)だと区別を一生気付かないままかもしれぬ
220デフォルトの名無しさん
2021/12/25(土) 19:17:12.81ID:Jczj7qaZ 本来の用語は何?
221デフォルトの名無しさん
2021/12/25(土) 19:46:48.90ID:+KvRe5Is222デフォルトの名無しさん
2021/12/25(土) 20:41:43.56ID:qfkDfu3c >>219
自演バレバレやぞw
自演バレバレやぞw
223デフォルトの名無しさん
2021/12/25(土) 21:08:04.90ID:9OzOPrjS224デフォルトの名無しさん
2021/12/25(土) 21:22:55.51ID:0QMGJaE9 足し算で素数を求めるアルゴリズムについて知りたいんだが誰かC/C++で書ける人いないの?
225デフォルトの名無しさん
2021/12/25(土) 21:41:11.69ID:Sq1Xjjv1 独自に分類名を付けようとする試みは評価するが
チュートリアルに書いてるレベルの内容で
「初心者プログラマーには理解が難しいと思うが」とか言っちゃう初心者プログラマーはどうかと思う
チュートリアルに書いてるレベルの内容で
「初心者プログラマーには理解が難しいと思うが」とか言っちゃう初心者プログラマーはどうかと思う
226デフォルトの名無しさん
2021/12/25(土) 21:53:14.53ID:Sq1Xjjv1 公式用語はsource、adapter、consumer
227デフォルトの名無しさん
2021/12/25(土) 22:31:39.88ID:sZ4+jXNJ イテレータはライブラリ作者と利用者の間でループをやり取りするには便利なものです。
しかし、それ以外で使ってもパッとしない。
しかし、それ以外で使ってもパッとしない。
228デフォルトの名無しさん
2021/12/25(土) 23:31:43.20ID:nV1lOrYt229デフォルトの名無しさん
2021/12/25(土) 23:46:56.47ID:cn6bnobm 試し割り法で検索しろ
230デフォルトの名無しさん
2021/12/26(日) 00:33:01.70ID:kT157QEc >>228
素数が足し算平均2.5回程度で求まるアルゴリズムを説明してくれないか?
素数が足し算平均2.5回程度で求まるアルゴリズムを説明してくれないか?
231デフォルトの名無しさん
2021/12/26(日) 02:08:18.89ID:N3NYq5+A Rustという世界最高の言語があるのに、なぜRubyを使うのが正しいのか。
リーン・スタートアップという本を読めばわかるよ。
リーン・スタートアップという本を読めばわかるよ。
232デフォルトの名無しさん
2021/12/26(日) 10:42:00.41ID:bwDwv7pP Ruby on Railsは、GitHub, Airbnb, Disney, Hulu, SoundCloud, Shopify といった世界的に有名な企業や、
日本国内でも、note、クックパッド、freee、マネーフォワード、Progate、Qiita などで使われている
2021年10月には、GitHubのコピーで、Railsを使い続ける宣言をしている、
GitLab が上場し、時価総額は約1.9兆円!
一方、GitHubはGo へ以降する
Railsを使う理由を端的に言えば、もうかるから
Ruby biz Grand prix 2020 大賞を受賞した、Ruby の女神・池澤あやかも言ってる。
他の言語では開発者を確保しにくいので、Railsに切り替えた
日本国内でも、note、クックパッド、freee、マネーフォワード、Progate、Qiita などで使われている
2021年10月には、GitHubのコピーで、Railsを使い続ける宣言をしている、
GitLab が上場し、時価総額は約1.9兆円!
一方、GitHubはGo へ以降する
Railsを使う理由を端的に言えば、もうかるから
Ruby biz Grand prix 2020 大賞を受賞した、Ruby の女神・池澤あやかも言ってる。
他の言語では開発者を確保しにくいので、Railsに切り替えた
233デフォルトの名無しさん
2021/12/26(日) 10:47:24.01ID:bwDwv7pP Mediator は、空港の管制塔
234デフォルトの名無しさん
2021/12/26(日) 15:09:49.43ID:h4Mdc0Ob >>214
仲介手数料、信用創造、お前が同じ穴の狢、アホのRustオジサンです
仲介手数料、信用創造、お前が同じ穴の狢、アホのRustオジサンです
235デフォルトの名無しさん
2021/12/26(日) 16:15:26.85ID:Tvo9Wvhs >>173
1億までの素数を全て生成するのに足し算2.5億回で済む理由がわかった
素数でなければ1万以下の素数が約数として必ずあるから順に最大素数9973まで調べるだけでよい
1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず
1億までの素数を全て生成するのに足し算2.5億回で済む理由がわかった
素数でなければ1万以下の素数が約数として必ずあるから順に最大素数9973まで調べるだけでよい
1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず
236デフォルトの名無しさん
2021/12/26(日) 21:21:30.44ID:MtmTWc/M237デフォルトの名無しさん
2021/12/26(日) 21:25:21.15ID:XOSaINd5 エラトステネスの篩、のことなのでは?
でも1億分のバッファとか、勿体ない気がしますね…
でも1億分のバッファとか、勿体ない気がしますね…
238デフォルトの名無しさん
2021/12/26(日) 22:30:41.92ID:RjefXsAR そこで区間篩ですよ
239デフォルトの名無しさん
2021/12/26(日) 22:31:44.15ID:kT157QEc 発見済みの素数を使ってループして数Xが素数かどうかを調べてるだけだろ?
足し算平均2.5回って意味不明なんだが?
足し算平均2.5回って意味不明なんだが?
240デフォルトの名無しさん
2021/12/26(日) 22:57:15.49ID:Tvo9Wvhs241デフォルトの名無しさん
2021/12/26(日) 23:11:50.20ID:Tvo9Wvhs そう書いていたら謎が解けた
>>235
> 1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず
これは1億✕(1/2 + 1/3 + 1/5 + 1/7 + 1/11 + … )だから括弧内は素数の逆数の和でlog log N
1億がNだから足し算の回数はO(N log log N)なのか
>>235
> 1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず
これは1億✕(1/2 + 1/3 + 1/5 + 1/7 + 1/11 + … )だから括弧内は素数の逆数の和でlog log N
1億がNだから足し算の回数はO(N log log N)なのか
242デフォルトの名無しさん
2021/12/26(日) 23:46:34.73ID:L9HJqboW243デフォルトの名無しさん
2021/12/27(月) 00:18:24.10ID:OK/wNcge >>242
C言語でいいから加算で素数を求めるアルゴリズム書いてくれない?
C言語でいいから加算で素数を求めるアルゴリズム書いてくれない?
244デフォルトの名無しさん
2021/12/27(月) 08:37:12.33ID:vZ39sN8j このスレで出てきているテレーターがよくわからんのだけど、wikipediaの定義と違うんかいな?
ttps://ja.m.wikipedia.org/wiki/%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF
ttps://ja.m.wikipedia.org/wiki/%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF
245デフォルトの名無しさん
2021/12/27(月) 09:31:03.72ID:2XZCOhTP >>244
その日本語wikiは怪しいので英語のwikiを見るといい
その日本語wikiは怪しいので英語のwikiを見るといい
246デフォルトの名無しさん
2021/12/27(月) 13:29:55.23ID:ZyPtB7dw 100回繰り返すのと1億回繰り返すのとどっちがマヌケに見えるか、億という言葉を使えば賢く見えるのか?
億回繰り返さないと理解できないのか、汚コードRust相談室と化したC vs C++ vs Rustスレに未来はあるのか
億回繰り返さないと理解できないのか、汚コードRust相談室と化したC vs C++ vs Rustスレに未来はあるのか
247デフォルトの名無しさん
2021/12/27(月) 14:18:09.83ID:Btn3kp2t 隔離スレに未来などあるわけあるか
248デフォルトの名無しさん
2021/12/27(月) 18:22:06.83ID:/o/Y1bP3 >>244
実際のコード例で体験していくと理解が早い
例えばこの計算をしたいとする
>>235
> 素数でなければ1万以下の素数が約数として必ずあるから順に最大素数9973まで調べるだけでよい
> 1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず
コードは>>176の素数生成イテレータも使って以下のイテレータ4つの連鎖で求まる
let result: i32 = 素数生成::<i32>()
.take_while(|&p| p < 10000)
.map(|p| 100000000 / p)
.sum();
途中のtake_while()は条件を満たす間だけ取るイテレータでこの場合は「1万未満」が条件
map()は変換するイテレータで「素数pを1億/p」へ変換している
最後にsum()で流れてきた1億/pを「全て足して」目的を達成
このように個々の単機能イテレータを複数組み合わせて連鎖させることでプログラミングできる
実際のコード例で体験していくと理解が早い
例えばこの計算をしたいとする
>>235
> 素数でなければ1万以下の素数が約数として必ずあるから順に最大素数9973まで調べるだけでよい
> 1億/2 + 1億/3 + 1億/5 + 1億/7 + 1億/11 + … + 1億/9973 = 約2.5億の足し算で原理的には済むはず
コードは>>176の素数生成イテレータも使って以下のイテレータ4つの連鎖で求まる
let result: i32 = 素数生成::<i32>()
.take_while(|&p| p < 10000)
.map(|p| 100000000 / p)
.sum();
途中のtake_while()は条件を満たす間だけ取るイテレータでこの場合は「1万未満」が条件
map()は変換するイテレータで「素数pを1億/p」へ変換している
最後にsum()で流れてきた1億/pを「全て足して」目的を達成
このように個々の単機能イテレータを複数組み合わせて連鎖させることでプログラミングできる
249デフォルトの名無しさん
2021/12/27(月) 21:02:50.96ID:/sRDJTH0 まーたイテレータの定義をよくわかってないやつがヘンテコな説明しちゃう
250デフォルトの名無しさん
2021/12/27(月) 22:13:30.95ID:h+0xE8z4 ヘンテコなとこに気がつけなかったんだけど、どのへん?
251デフォルトの名無しさん
2021/12/27(月) 23:21:22.61ID:N7w3YVE+ 今どきの言語のイテレータは>>248で合っている
しかしC++のイテレータは低レベルでポインタを抽象化したものと考えたほうがいいので注意
C++にもようやくmap()に相当するものが入ったが他言語とは異なりtransform()という名前など使いにくい
今どきのプログラミングしたいなら素直にRustを使ったほうが便利
しかしC++のイテレータは低レベルでポインタを抽象化したものと考えたほうがいいので注意
C++にもようやくmap()に相当するものが入ったが他言語とは異なりtransform()という名前など使いにくい
今どきのプログラミングしたいなら素直にRustを使ったほうが便利
252デフォルトの名無しさん
2021/12/27(月) 23:38:31.34ID:0wmEJTQl253デフォルトの名無しさん
2021/12/27(月) 23:39:05.80ID:pyO9ra+c この文中に>>入れる自作自演の同一人物の基地外Rustのくせはほんと気持ち悪い。また引用で > 使う
254デフォルトの名無しさん
2021/12/27(月) 23:41:50.94ID:OK/wNcge 伝統的には値を生成するものはジェネレータと呼ぶわな
255デフォルトの名無しさん
2021/12/27(月) 23:46:27.40ID:Bqcwp6fR >>253
はちみつ病だからスルーしてさしあげろ
はちみつ病だからスルーしてさしあげろ
256デフォルトの名無しさん
2021/12/27(月) 23:49:02.66ID:N7w3YVE+ >>254
それは観点が違うな
値を生成するものであってもイテレータとして機能するものと機能しないものがある
つまり重要な点はイテレータとして機能するか否かのみ
Rustの1..nやこのスレの素数生成はイテレータとして機能しているから明白にイテレータ
それは観点が違うな
値を生成するものであってもイテレータとして機能するものと機能しないものがある
つまり重要な点はイテレータとして機能するか否かのみ
Rustの1..nやこのスレの素数生成はイテレータとして機能しているから明白にイテレータ
257デフォルトの名無しさん
2021/12/28(火) 01:27:16.67ID:iF4hooVM ジェネレータはみんなイテレータだから
258デフォルトの名無しさん
2021/12/28(火) 10:31:13.05ID:wyc7do74 やっぱり頭がおかしいよ、1..nはRange { start: 1, end: n }と同じ。Rust公式でもイテレータじゃなく
単にRangeと言っているだけなのに、それが機能するかという観点ならfor inが無ければ機能しないから
イテレータじゃない。collect()がイテレータをコレクションに変換するように、for inで(暗黙)変換されるだけ。
こいつ、あちこちで暴れてる
単にRangeと言っているだけなのに、それが機能するかという観点ならfor inが無ければ機能しないから
イテレータじゃない。collect()がイテレータをコレクションに変換するように、for inで(暗黙)変換されるだけ。
こいつ、あちこちで暴れてる
259デフォルトの名無しさん
2021/12/28(火) 11:06:40.72ID:We8KhoPF RangeはIterator実装してるからrustの定義ではイテレータではあるのでは
260デフォルトの名無しさん
2021/12/28(火) 11:57:32.05ID:c+MbZA8y 汚コード厨まだ居るのか
261デフォルトの名無しさん
2021/12/28(火) 12:05:42.28ID:SY7gTV8u >>258
君もイテレータがわかってないお仲間さんなので仲良く勉強しとけ
君もイテレータがわかってないお仲間さんなので仲良く勉強しとけ
262デフォルトの名無しさん
2021/12/28(火) 12:13:02.75ID:SY7gTV8u プログラミング初心者でもないのにイテレータを理解してないやつがRustスレに多いのはなぜ?
263デフォルトの名無しさん
2021/12/28(火) 12:16:44.18ID:F00FUyP7 ここ本スレではなく隔離スレ
スレ民の目的はただの冷やかし
スレ民の目的はただの冷やかし
264デフォルトの名無しさん
2021/12/28(火) 14:55:22.51ID:uwqQYFJJ "仲介イテレータ"
約 2 件 (0.26 秒)
すげー、全世界で、このスレにしかその言葉は存在しない
約 2 件 (0.26 秒)
すげー、全世界で、このスレにしかその言葉は存在しない
265デフォルトの名無しさん
2021/12/28(火) 15:25:43.05ID:c+MbZA8y 厨怪イッテレータ
266デフォルトの名無しさん
2021/12/28(火) 15:44:45.74ID:WXYqKfV2 >>262
一番レスの多い自演厨が理解してないから、そう見えるだけ
一番レスの多い自演厨が理解してないから、そう見えるだけ
267デフォルトの名無しさん
2021/12/28(火) 16:37:20.65ID:a2iPSFXu イテレータには狭義のイテレータと広義のイテレータがある
広義のイテレータは狭義のイテレータとイテレータメソッドを合わせたものである
(A) イテレータ(狭義)
Rustで言えばtrait Iteratorを実装するもの
コード上で「impl Iterator for 各イテレータが返す型」となって現れる
各イテレータが返す型は通常structでありimpl Iterator<Item=T>を満たす
メソッドとしてnext()を持ちこれがOption<T>を返す
(B) イテレータメソッド
Rustで言えば上述イテレータ(狭義)のメソッドとなるもの
コード上では「impl 宣言用トレイト for Iterator」の中で現れる
各イテレータメソッドが返す型は任意でありfor_each()のように無しもある
対象となったイテレータ(狭義)のnext()を利用する側となる
>>195
| (1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
| (2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
| (3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの
その分類で言えば
(1) = (A) かつ not (B) = イテレータ(狭義)だが イテレータメソッドではない
(2) = (A) かつ (B) = イテレータ(狭義)であり イテレータメソッドでもある
(3) = not (A) かつ (B) = イテレータメソッドだが イテレータ(狭義)ではない
広義のイテレータは狭義のイテレータとイテレータメソッドを合わせたものである
(A) イテレータ(狭義)
Rustで言えばtrait Iteratorを実装するもの
コード上で「impl Iterator for 各イテレータが返す型」となって現れる
各イテレータが返す型は通常structでありimpl Iterator<Item=T>を満たす
メソッドとしてnext()を持ちこれがOption<T>を返す
(B) イテレータメソッド
Rustで言えば上述イテレータ(狭義)のメソッドとなるもの
コード上では「impl 宣言用トレイト for Iterator」の中で現れる
各イテレータメソッドが返す型は任意でありfor_each()のように無しもある
対象となったイテレータ(狭義)のnext()を利用する側となる
>>195
| (1) 発信イテレータ … >>174で示しました素数生成、レンジ(0..n)、配列やVecに対するiter()などチェーンでは先頭に来るもの
| (2) 仲介イテレータ … map()、filter()、enumerate()などチェーンでは中間に来るもの
| (3) 受信イテレータ … find()、fold()、collect()などチェーンでは最後に来るもの
その分類で言えば
(1) = (A) かつ not (B) = イテレータ(狭義)だが イテレータメソッドではない
(2) = (A) かつ (B) = イテレータ(狭義)であり イテレータメソッドでもある
(3) = not (A) かつ (B) = イテレータメソッドだが イテレータ(狭義)ではない
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 [蚤の市★]
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★4 [Hitzeschleier★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ [蚤の市★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 自民・麻生太郎副総裁 石破政権の1年は「どよーん」 高市政権発足で「何となく明るくなった」「世の中のことが決まり動いている」★2 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 【実況】博衣こよりのえちえちダンガンロンパ2🧪★7
- トランプ、G7に代わるcore 5を発表 [805596214]
- 【朗報】維新「高市さんは約束を守ってくれている」連立継続へ [519511584]
- ハロワって客層悪すぎるだろwwwwwwwwwwwww
- オナニーするか😔
- VIPスクリプトだらけでワロタwwwwwwwww
