2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

"Vec"の中身を"Clone()"なしで返す (into_iter()の使い方)

Last updated at Posted at 2024-12-11

Rustで開発していると、Cloneに頼りたくなる場面は多い。
しかし、大きなデータをCloneすることはパフォーマンス低下につながる。

この記事では、into_iter()を活用してclone()なしでVec内の要素を返す方法を紹介する。

Boardという構造体が入っているVec<Board>から、iter().min()で最小値を直接取得し、そのまま返す例を使って説明する。

fn get_unique_board(board: &Board) -> Board {
    let boards: Vec<Board> = board.get_all_symmetries();
    boards.iter()
          .min()     // -> Option<&board>
          .unwrap()  // -> &Board
          .clone()   // -> Board (ここで clone() が必要になっている)
}

image.png

min()の返り値は、Boardではなく&Boardである。
そのままBoardを返したいならclone()が必要になる。

into_iter()を使えば、Vec<Board>の所有権を直接イテレータに渡すことができる。結果的に、min()で返ってくるのはBoard自体となり、clone()が不要になる。

fn get_unique_board(board: &Board) -> Board {
    let boards: Vec<Board> = board.get_all_symmetries();
    boards.into_iter() // 所有権を移動
          .min()       // -> Option<Board>
          .unwrap()    // -> Board
}

image.png

このようにすることで、Vecの中のBoardを直接返す事ができる。
(Vecの中のBoardをコピーする必要がなくなる。)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?