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

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

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

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

Q&A

解決済

1回答

271閲覧

SoA形式のComplex_Vector型を定義したとき、配列の要素への代入を演算子オーバーロードで定義をしたい

Gustave

総合スコア21

C++

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

0グッド

0クリップ

投稿2019/04/28 18:09

配列の実部だけ、虚部だけへのアクセスを頻繁に切り替えて行うアプリケーションがあり、
実部・虚部だけへのアクセスを連続的に行いたく、SoA(Structure of Array)形式のComplex Vector型を作成したいです。

コード的には:

c++

1class Complex_vector{ 2public: 3 double real*; 4 double imag*; 5}

というのを作ろうと考えています(実装中につき書いてるコードがコンパイル通らなかったらすみません。

このクラスとstd::complexとの組み合わせを考えたとき、
以下のような要素をとってくる演算:

c++

1int main(){ 2 class Complex_vector vec(10); // これはclassでallocate関数を定義済 3 std::complex<double> a = vec[3] 4}

については、以下のようにoperator[]で定義できると思います。。

c++

1std::complex<double> operator[](int N) { 2 std::complex<double> ret; 3 ret.real=this.real[N]; 4 ret.imag=this.imag[N]; 5 }

ここで問題になるのが、以下のような要素に代入する演算

c++

1class Complex_vector vec(10); 2std::complex<double> a = 1; 3vec[3] = a;

こうなった場合、[] operatorではあくまでstd::complexの返り値が返ってくるだけなので、実際にvecの値は書き換わりません。
(やりたいのはreal[3]とimag[3]にa.realとa.imagを代入)
なんとかこういった操作を定義する方法はないでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

殴り書きやけど、こんなことがやりたいんかな?

C++

1#include <vector> 2#include <complex> 3 4template<typename T> 5class Complex_ref { 6 typename std::vector<T>::iterator real_iter; 7 typename std::vector<T>::iterator imag_iter; 8public: 9 Complex_ref(typename std::vector<T>::iterator r, typename std::vector<T>::iterator i) 10 : real_iter(r), imag_iter(i) {} 11 void operator=(std::complex<T> c) { *real_iter = c.real(); *imag_iter = c.imag(); } 12 operator std::complex<T>() { return std::complex<T>(*real_iter, *imag_iter); } 13}; 14 15template<typename T> 16class Complex_vector { 17public: 18 std::vector<T> real; 19 std::vector<T> imag; 20 Complex_vector(std::size_t n) : real(n), imag(n) {} 21 Complex_ref<T> operator[](size_t n) { 22 return Complex_ref<T>(real.begin() + n, imag.begin() + n); 23 } 24}; 25 26// おためし 27#include <iostream> 28 29int main() { 30 Complex_vector<double> cv(5); 31 for (int i = 0; i < 5; ++i) { 32 cv[i] = std::complex<double>(i, i); // set 33 } 34 for (int i = 0; i < 5; ++i) { 35 std::complex<double> item = cv[i]; // get 36 std::cout << item << std::endl; 37 } 38}

投稿2019/04/28 22:22

episteme

総合スコア16614

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

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

Gustave

2019/04/29 01:12

まさにこれです。ありがとうございます!
episteme

2019/04/29 03:39

やってることはわかると思う。 Complex_vector と std::complex との仲介役: Complex_ref を定義した。
episteme

2019/04/29 22:57

そうそう、このままの実装だと Complex_ref どうしの代入、たとえば cv[1] = cv[0] とかがうまいこと動かんので注意。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問