質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

11430閲覧

2次元のvectorを高速にコピーする方法

abuk

総合スコア20

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/10/14 12:55

2次元のvectorを別の変数にコピーする時
new_vec = old_vec
のように元のvectorを新しいvectorに代入する方法だと時間が多くかかってしまいます。
このような場合に高速にコピーできる方法はどのようなものが存在するのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

単に値を参照するのが目的であり、変更しないのであれば、次のように参照を作成すればよいです。

cpp

1const std::vector<double> &new_vec = old_vec;

そうでなく、値を変更し、コピー元とは別の実体を作りたいのであれば、メモリの確保及び値のコピーが必要なので、コピーコンストラクタの呼び出しより、高速化するのは難しいでしょう。

new_vec = old_vec;

投稿2018/10/14 13:02

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

単純にコピーした場合は全ての要素をコピーすることになるためO(mn)になります(mとnは行と列の数)。そこで次のような方法で改善できる可能性があります。

Copy-On-Writeなvectorを使う

Copy-On-Writeとは、コピーの時は参照のようなものをしておくだけで、要素を変更するときにコピーを行うというものです(実装によって細部は異なります)。実装例としてはPHPの配列が有名です。コピー自体はO(1)になりますが、いざ、要素に変更があるときは、コピー処理が遅れて走ることになります。しかし、二次元配列の一段階目もCopy-On-WriteであればそれぞれO(1)でコピーされますので、O(m+n)で処理できることになります。

Copy-On-Writeなvector実装を探したのですが、見つけられませんでした。探せばあるかも知れませんが、単純な実装では浅いコピーになってしまう恐れがあり難しいかも知れません。初めから2次元のmatrixとして作り込んだ方がいいかもしれません。

immutableなvectorを使う

実装方法によりますが、もし、immutableなvectorであれば、代入はコピーが不要になるため、O(1)になります。要素変更はCopy-On-Writeと同じくO(m+n)になるはずです。理論上はですが。

immerというライブラリがあるようです。全く試していませんので、どうなるかはわかりません。また、immutableはコードの書き方は通常のmutableと全く異なってきますし、場合によっては全体として遅くなることもあります。

投稿2018/10/15 09:51

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問