前置き
以下のようなブロードキャスト計算が可能な、自作のベクトルクラスVector
を作成しました。
cpp
1Vector vec(3); // 要素数3のvector<double>を作成 2vec[0] = 0; 3vec[1] = 1; 4vec[2] = 2; 5 6vec *= 2; // 各要素に2をかける 7// vec = {0, 2, 4} 8 9vec *= 2.1; // 各要素に2.1をかける 10// vec = {0, 4.2, 8.4}
この機能を実装したコードは後述しています。見てほしい箇所は、以下の(★1)と(★2)でそれぞれ囲まれた部分です。
/*** (★1)ここから ***/ ... /*** (★1)ここまで ***/
/*** (★2)ここから ***/ ... /*** (★2)ここまで ***/
コード
cpp
1#include <bits/stdc++.h> 2using namespace std; 3 4 5class Vector { 6 private: 7 vector<double> v; 8 public: 9 size_t size; 10 Vector(size_t size=0) { 11 this->size = size; 12 this->v.resize(size); 13 } 14 15 double& operator[](const size_t i) { 16 return this->v[i]; 17 } 18 19 /*** (★1)ここから ***/ 20 Vector& operator*=(const int a) { 21 /* 各要素にaをかける */ 22 vector<double> res = this->v; 23 for (size_t i=0; i<this->size; i++) { 24 res[i] *= a; 25 } 26 this->v = res; 27 return *this; 28 } 29 const Vector operator*(const int a) { 30 return Vector(*this) *= a; 31 } 32 /*** (★1)ここまで ***/ 33 34 /*** (★2)ここから ***/ 35 Vector& operator*=(const double a) { 36 /* 各要素にaをかける */ 37 vector<double> res = this->v; 38 for (size_t i=0; i<this->size; i++) { 39 res[i] *= a; 40 } 41 this->v = res; 42 return *this; 43 } 44 const Vector operator*(const double a) { 45 return Vector(*this) *= a; 46 } 47 /*** (★2)ここまで ***/ 48 49 void print() { 50 int len = 0; 51 for (size_t i=0; i<this->size; i++) { 52 string str = to_string(this->v[i]); 53 len = max(len, (int)str.size()); 54 } 55 56 printf("["); 57 for (size_t i=0; i<this->size; i++) { 58 printf("%*lf", len, this->v[i]); 59 if (i!=this->size-1) printf(", "); 60 } 61 printf("]\n"); 62 } 63}; 64 65void test(){ 66 Vector vec(3); 67 vec[0] = 0; 68 vec[1] = 1; 69 vec[2] = 2; 70 71 vec *= 2; 72 vec.print(); 73 // [0.000000, 2.000000, 4.000000] 74 vec *= 2.1; 75 vec.print(); 76 // [0.000000, 4.200000, 8.400000] 77} 78 79 80int main(int argc, char const *argv[]){ 81 test(); 82 return 0; 83} 84
やりたいこと
(★1)と(★2)は処理としてはほぼ同じで、違うところは、
- (★1)は引数が
const int a
- (★2)は引数が
const double a
という部分だけです。
この(★1)と(★2)をうまくまとめる方法はないでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/11 00:58