2016-10-25 2 views
0

これは私自身の知識のためにもっと質問です。 ベクター内の単一要素の複数のプロパティにアクセスするためのベストプラクティスはありますか?申し訳ありませんが、その質問があまり意味がない場合。シナリオを教えてください:C++ベクトル要素のプロパティにアクセスするための最良の方法

私はいくつかのコードを作業していましたが、ここで構造体のベクトルを作成しました。ベクトル内のデータを複製しないようにするために、入力データの複数の部分を、forループを介してベクトル内の既存のデータと照合してチェックします。データは複数の独立したソースから、時には連続して追加されることもあるので、この時点までに各エントリのマスターIDを作成するのは少し難しいです。コードはこのような何かを見終わる:いくつかの他のプログラミング言語で

vector<testStruct> test; 
    void addDataToVector(int _iData1, string _sData2, unsigned int _uiData3){ 
     testStruct tmp; 
     tmp.iData1 = _iData1; 
     tmp.sData2 = _sData2; 
     tmp.uiData3 = _uiData3; 

     if(test.size() > 0){ 
      for(size_t i = 0;; i < test.size(); i++){ 
       if(test[i].iData1 == tmp.iData1 && 
         test[i].sData2 == tmp.sData2 && 
         test[i].uiData3 == tmp.uiData3){ 
         break; 
       }else{ 
         test.push_back(tmp); 
       } 
      } 
     }else{ 
      test.push_back(tmp); 
     } 
    } 

を、私はこのような配列の同じ要素に複数の呼び出しを行うことは少し無駄であることを学びました。 Action Script 3では、要素の内容を一時変数に代入し、ベクトルに何度も繰り返しアクセスするのではなく、その変数を複数の呼び出しに使用する方が良いということを学びました。 C++には注意が必要なことがあるのでしょうか?私はベクトルがポインタであることを理解しています...私は思います。しかし、私はそれが多くを緩和するかどうか、あるいは私がまだそのようなことのために外見にいる必要があるかどうかは分かりません。私は同様のデータ/回答を探してみましたが、私の検索語をどのように語るのかは正確には分かりませんでした。

何か助けや指導(hehe get it?)をいただければ幸いです。

+0

ベクター内の要素の順序は重要ですか? – Pavel

+1

_ "ベクトルがポインタであることを理解しています..." –

+1

これは早すぎる最適化のようです。それは多くのことに依存します。私のアドバイスは:新しい一時変数を導入しようとしてコードを最適化しようとしないでください。コンパイラは通常あなたよりも優れた仕事をします。 –

答えて

1

ベクターはポインタ(配列の周りのラッパーのようなもの)であるだけでなく、テンプレートでもあるため、一般的には、使用時にコンパイラが一般的にアクセスできるようになっています。コンパイラを正確に知っていて、test[i]は何かを知っていることを意味しています。あなたはそのようなことに心配する必要はありません。要素へのアクセスは、非常にです。

あなたの構造にはoperator==をオーバーロードすることができますが、代わりにtest[i] == tmpと書くことができます。これはコードの可読性を向上させますが、そのフィールドが等しいということは実際にはオブジェクトが等しいことを意味する場合、つまり意味がある場合は意味的にとするだけです。

あるいは、いくつかの点であなただけ(たとえば、アクセス式が快適に繰り返すことが長すぎる)他の何らかの理由ではなく、パフォーマンスのために一度だけの要素にアクセスしたい場合、あなたは簡単にこれを行うことができます。

const testStruct &element = test[i]; 

&に注意してください。この方法でコピーするための不必要なコストを回避し、ベクター要素に直接アクセスします。要素を変更する必要がある場合は、constを削除します。

+0

ありがとうSergey。よく説明された答えに感謝します。私はまた、提案を感謝します。新しいものを学ぶのに役立ちます。あなたはロック! – Maxxumas

-3

iData1,sData2およびuiData3のフィールドを含むのはtestStructですか?はいの場合は、test[i] == tmpのようなオブジェクトを簡単に比較できます。

さらに、要素の順序が重要でない場合は、問題をより簡単に、より効率的に解決できます。この場合、vectorの代わりにsetを使用してください。

0

関数の最初の行にあるデータをテスト構造体にコピーするのは本当に必要ですか?渡されたパラメータを配列の値と直接比較し、戻す前に構造体を構築します。

あなたはコンストラクタを使用していないようです - なぜですか?

急速に入ってくるデータストリームに関するご質問には、システム全体のトポロジを記述してください。たぶん中央のキューコンポーネントまたはこれのようなものが役立つかもしれませんか?

+0

これはカジノゲーム用に設計された古いサーバーです。それはVisual Studioの2003年にC++でビルドされ、かなり巨大で...混乱します。それは私が投げ込まれた仕事のことであり、C++を学ばなければならなかったので、私の知識は、それがすべきであるものに比べて馬鹿げているような気がします。複数のクライアントマシンが接続され、ゲームデータから配当、更新など、何百ものリクエストが送信されます。だから私はできるだけ早くきれいに物事を動かせようとしています。だからこそ、私がこの部分をコーディングしている方法が最適であるかどうか不思議だったのです。 – Maxxumas

1

注文が重要でない場合は、vectorの代わりにsetを使用することをお勧めします。セットは一意のアイテムのグループを格納するために使用されます。アイテムをセットに追加すると、コンピュータはすでにアイテムが存在するかどうかをチェックします。いいえの場合、項目はセットに追加されます。それはより速く動作します。つまり、1回の追加でO(N)時間の代わりにO(log N)がかかります。

また、要素がセット内に存在するかどうかをチェックしたり、要素をO(ログN)時間だけ削除することができます。

set<testStruct> test; 
void add(int _iData1, string _sData2, unsigned int _uiData3) { 
    testStruct tmp; 
    tmp.iData1 = _iData1; 
    tmp.sData2 = _sData2; 
    tmp.uiData3 = _uiData3; 
    test.insert(tmp); 
} 

それとも、任意の追加機能whithout項目を挿入するだけで

test.emplace(i, s, ui); 

を書くことができるようになります:

機能は次のようになります。

+1

私は決してセットを聞いたことがありません。私は自分の知識のためにそれを見上げるでしょう。これが書かれているコードは古いです。 Visual Studio 2003 C++ old。それは基本的に私たちの会社の運営の中心であるので、それを外に出すことはできません。情報ありがとうございました。 – Maxxumas

関連する問題