2016-08-01 5 views
0

私は構造体がベクトルで埋められています。構造体を受け取っています

struct structtype{ 

vector<double> vec1; 
vector<double> vec2; 
vector<int> vec3; 

}; 

私は1つの構造体から特定の要素を取り、別のものにそれらを追加できるようにしたいです。ソートの

structtype myStructA 

myStructA.add(myStructB.at(i)) 

のようなので、私はmyStructBの特定の要素のうちmyStructAを構築しています。私はちょうどのようなものを含めることができstructtypeの定義内の場合、私は..

struct structtype{ 

vector<double> vec1; 
vector<double> vec2; 
vector<int> vec3; 

void Add(structtype myStructtoAdd, int i){ 
vec1.push_back(myStructtoAdd.vec1.at(i)); 
vec2.push_back(myStructtoAdd.vec2.at(i)); 
vec3.push_back(myStructtoAdd.vec3.at(i)); 
}; 


}; 

ウィルこの作品を思ったんだけど?それには関係なく、これを行うより良い方法はありますか?

+5

たぶんあなたの代わりにベクトルの構造体の、(単一変数の)構造体のベクトルをしたい:それを行うための標準的な方法は、このように、private継承を使用しています。 – deviantfan

+2

@deviantfanと同意します。このコードは、3つのベクトルすべてが同じサイズを持ち、同じインデックス 'int i 'を共有することを示唆しています。つまり、これはプログラムのほんの一部です。一度に1つのベクトル上で他の部分が動作する場合、ベクトルの構造は妥当である。 – MSalters

答えて

1

はい。これは、C++でstructclassと非常によく似ており、メソッドをサポートしているため動作します。その違いは、デフォルトでメンバーのアクセシビリティにあります。classでプライベートであり、structで公開されています。これは継承にも当てはまります - structはpublicとclassを継承して継承します(デフォルトではどちらの場合も、指定されたアクセス指定子を追加するためにはまだposiblleです)。

+0

_ "struct"は 'class'と非常によく似ています。" _疑いを避けるため、両方のキーワードがクラスを定義しているからです。しかし、このことのどれが質問と関係しているのかは分かりません。 –

+0

私は急いで、それはすでにスタウト(例えば、Java)なしでいくつかのoop言語を知っている誰かのための典型的な質問だと思ったので、クラスに精通しており、現在C + +を学ぶ。したがって、私は2つの感覚を比較しました。 – Giezr

0

はい、これは機能します。このコードの改善について

あなたはおそらく、あなたがそのような要素の上に他の操作が必要になる場合があり、別の構造から要素iを追加するので、それはそれのための構造体を定義するために賢明に見え、そして必要があるので検索演算子:

struct element 
{ 
    double f1, f2; 
    int f3; 
} 

element& structtype::operator [] (int i) 
{ 
    return {vec1[i], vec2[i], vec3[i]}; 
} 

const element& structtype::operator [] (int i) const 
{ 
    return {vec1[i], vec2[i], vec3[i]}; 
} 

これらの操作を実装した後、あなたはおそらく、どこかelementを保存することができるだけでなく、element引数でpush_back操作が有用であろうことを意味structtype、中:

void push_back(const element& e) 
{ 
    vec1.push_back(e.f1); 
    vec2.push_back(e.f2); 
    vec3.push_back(e.f3); 
} 

また、structtypeクラスはコンテナのように振る舞うことを考えると、イテレータのような典型的なSTLコンテナが提供するいくつかの他の機能を実施するのに有用であり得ます。 STLのようなコンテナ実装のための良いガイドはhereです。

また、2番目のオプションとして、すでにすべての機能を実装しているstd::vector<element>を使用することもできます。

その機能が十分でない場合は、拡張してstd::vectorの実装を継承する新しいクラスを作成できます。

class structtype : private std::vector<element> 
{ 
public: 
    /// Write such lines for all members of std::vector which you would like to have 
    using std::vector<element>::size(); 
    ... 
    /// Write some your own methods 
    std::vector<double> get_vec1() const; 
} 
関連する問題