2017-05-22 10 views
0

私は列車でこれをコーディングするだけで、オブジェクトのベクトルが作成されます。 もっとエレガントで効果的な提案があれば幸いですか?オブジェクトのベクトルを作成する

#include <iostream> 
#include <vector> 

using namespace std; 

typedef struct{ 
    short xpos,ypos; 
    short width, height; 
    short area; 
}LABELPROP; 

int get_property(int n,LABELPROP *pP) 
{ 
    if(n%2) 
    { 
     pP->xpos=n*2; 
     pP->ypos=n*3; 
     return 1; 
    } 
    else return 0; 
} 

int main() 
{ 
    vector<LABELPROP> myvector; 
    cout<<"Initial Number :"<<myvector.size()<<endl; 
    LABELPROP temporal; 
// LABELPROP *pT=&temporal; 

    for(int n=1;n<=10;n++) //10 objects 
    { 
    //if(get_property(n,pT)) 
    if(get_property(n,&temporal)) 
     myvector.push_back(temporal); 
    } 

    for(int i=0;i<myvector.size();i++) 
     cout<<"("<<myvector[i].xpos<<","<<myvector[i].ypos<<")"<<endl; 

    return 0; 
} 

私が最初に付けた不要なポインタは削除されています。

私は事前

+3

トピック:C++でtypedef gagは必要ありません。 – user4581301

+5

あなたのプログラムが意図したとおりに動作し、改善のための提案を探している場合は、https://codereview.stackexchange.com/より良いサイトです。投稿する前に[投稿のガイドライン](https://codereview.stackexchange.com/help/dont-ask)を必ずお読みください。 –

+1

ここでポインタではなく参照を使用してください: 'int get_property(int n、LABELPROP * pP)'。コンパイラは、ポインタに対する参照を最適化するための追加の手段を有することができ、また、ヌルポインタが渡される可能性を排除する。 – user4581301

答えて

2

おかげでポインタとしてあなたがCスタイルでC++を書いていることを置く理由があるので、一時的な構造体は、GET_PROPERTY関数から値を取得します。あなただけの使用、あなたの構造体をtypedefをする必要はありません。

struct LabelProp 
{ 
    LabelProp(short xpos, short ypos) : xpos(xpos), ypos(ypos) {} 
    short xpos,ypos; 
    short width, height; 
    short area; 
}; 

ほとんどの規則は、定数やマクロなど、すべて大文字の名前を使用するので、私はまた、ネーミングを変更しました。私はまた、使用するコンストラクタを追加しました。

get_propertyintですが、これはC++であるため、boolを返してください。

は、おそらくより良いアイデアは、 addIfOddget_propertyに取って代わるだろうと、それは次のようになりています

void addIfOdd(int n, std::vector<LabelProp>& results) 
{ 
    if(n%2) 
    { 
     results.emplace_back(n * 2, n * 3); 
    } 
} 

int main() 
{ 
    std::vector<LabelProp> myvector; 

    for(int n=1;n<=10;n++) //10 objects 
    { 
     addIfOdd(n, myvector); 
    } 
} 
+0

ありがとうございました!それはむしろ非常に優雅な解決策です。残念ながら私はちょうど私が "emplace_back"を実装していないコンパイラを見つけた – KansaiRobot

+0

私は一時的な構造体とpush_backを使用した – KansaiRobot

1

それは実際には奇数のときに不必要整数の全範囲にわたって反復されているように見えますあなたは後になっている。範囲を奇数に制限しないのはなぜですか? (反復回数の半分のみ)、など。

for(int i = 1; i < 10; i += 2) { /* 1, 3, ..., 9 */ } 

あなたのクラスにコンストラクタを追加することができ++近代的なCを使用した:

explicit label_prop(int n) 
    : xpos{static_cast<short>(n * 2)}, ypos{static_cast<short>(n * 3)} {} 

std::generate_n例えばですべてのコードを置き換えます:ここ

std::generate_n(std::back_inserter(myvector), 5, [n = 1]() mutable { 
    return label_prop{std::exchange(n, n + 2)}; 
}); 

、あなたはあなたのコンパイラが十分にモダンで、C++ 11個の機能をサポートしている場合は、1

0

から始まる、連続5つの奇数をしたいように指定している、あなたは新しいを使用することができます範囲ベースのように、forループ:

for(auto& x : myvector) 
    cout<<"("<<x.xpos<<","<<x.ypos<<")"<<endl; 

また、事前にベクトルの大きさを知っている場合は、不要なオブジェクトの再配分を避けることができるようにeficiencyを改善するためにあなたは、reserveメソッドを使用することができますし、メモリ割り当てns/deallocationsは高価になる可能性があります。

関連する問題