0

私は興味を持っている:

  • ユーザー定義型/クラスへのポインターの std::vector を持つ
  • このベクトルを最速の方法で埋める

私はこれを解決したいと思います:

  • while + イテレータ (非 C++11 ソリューション)
  • for_each 反復 + ラムダ (c++11 ソリューション)

ドキュメントを読んだ後、私はこれiteratorwhile

#include <iostream>
#include <vector>

class A{
  public:
    A(){}
    ~A(){}
  private:
    int n;
    double d;
    float f;
    std::string s;
};

int main(){
  std::vector<A*> v(100); // fixed *A to A*
  std::vector<A*>::iterator iter = v.begin(); // fixed *A to A*
  while( iter != v.end() )
  {
    *iter = new A(); // iter = A(); by the way this does not works either // now fixed using new
    ++iter;
  }
  return(0);
}

私はこれが些細なことだと知っていますが、私にとってはそうではありません。私の理解では、 iter はポインターであり、ベクトルで指している実際の値に間接的にする必要があります。明らかに、この概念はこのようには機能しません。

ラムダと for_each を使用すると、カスタム定義クラスにコンストラクターを使用する方法がわかりません。ドキュメントではジェネリックメソッドと関数についてのみ説明されており、コンストラクターを使用できないように思われるためです。

イテレータとラムダを使用してオブジェクトを構築するにはどうすればよいですか?

whileまた、と 、for_eachまたはを使用した反復アプローチを使用せずに、同じアクションをあちこちで実行する必要がある場合に、ベクトル全体を循環させるより高速な方法がありますfor

コピー コンストラクターのオーバーヘッドを回避したいので、ポインターを使用してすべての可能なソリューションを維持したいと考えています。

ありがとう。

4

1 に答える 1

3

まず、C++ でポインターを作成するA*代わりに使用する必要があります。次に、スタックで作成されたインスタンスへのポインターを設定することはできません。代わりに、ヒープに値を作成するか、スタックからの変数のアドレスを使用する必要があります。*AA()*iter = new A()

于 2012-10-27T17:30:38.060 に答える