-1

ベクトルを作成し、これらの構造体を 64 個入力すると、次のようになります。

struct movementType { int x, y , moves;};
vector<movementType> myVector(64);

タイプが int、double、string などではないので、アルゴリズムをどのように使用できますか?

fill_n アルゴリズムを見てみましょう。あなたが持っている場合

vector<int> someOtherVector(64);

このように埋めることができます

fill_n (someOtherVector.begin(),64,20);

これを自分の MovementType ベクトルで試すと、エラーが発生します

MovementType empty;
empty.x = 5;
empty.y = 6;
empty.moves = 7;
fill_n (someOtherVector.begin(),64,empty);

では、ベクトルでこれらの型を使用して STL アルゴリズムを使用するにはどうすればよいでしょうか?

ありがとう!

4

4 に答える 4

2

どのようなエラーが発生したかを実際に言わないので、解決策について推測する必要があります。また、このテスト コードが機能することを考えると、他の場所で間違いを犯しているに違いないと思います。

セグメンテーション違反などの実行時エラーが発生していますか? もしそうなら、問題は、埋めようとしているベクトルにsomeOtherVector十分な要素が含まれていないことです。実際にそれを として定義したことがありますstd::vector<movementType> someOtherVector(64)std::vector<movementType> someOtherVectorstd::fill_n充填しているコンテナの各要素に指定された値を割り当てるため、そこに要素がない場合は問題があります。そのため、ベクターに十分な要素が含まれていることを確認してください。

ここでの代替手段はstd::back_inserter、要素を空のベクターに追加するために使用することです。

std::vector<movementType> someOtherVector;
std::fill_n(std::back_inserter(someOtherVector), 64, empty);

しかし、その後、あなたは本当にやるべきです:

std::vector<movementType> someOtherVector(64, empty);
于 2012-10-24T20:15:43.527 に答える
1

fill_n (someOtherVector.begin(),64,empty);あまり意味がありません。a を で埋めようとしてvector<int>いますmovementType。a を埋めたい場合はvector<movementType>、次のようにします (すでに宣言されていると仮定しますvector<movementType> myVector(64);)。

C++11 の場合:

fill_n(myVector.begin(), 64, movementType{1, 2, 3});

または C++03:

movementType m = {1, 2, 3};
fill_n(myVector.begin(), 64, m);
于 2012-10-24T20:02:15.170 に答える
0

使用するアルゴリズムのプリミティブ型のように動作するようにクラスの演算子を記述できます。または、アルゴリズムが関数オブジェクトを使用して操作を実行する場合は、ラムダクラスまたはファンクタークラスを記述して、クラスに渡します。アルゴリズム。

この場合、演算子はoperator=次のとおりです。

struct movementType
{
    int x;
    int y;
    int moves;

    movementType& operator=(int i)
    {
        // which member do you want to assign "i" to?
    }
};
于 2012-10-24T19:54:32.853 に答える
0

私の推測では、構造体にコンストラクターを提供する必要があります。コンストラクターは、C++ではクラスのように動作します。のように考える

struct movementType 
{ 
  movementType(int X, int Y, int Moves) : x(X), y(Y), moves(Moves) { }  // Constructor with 3 int's
  movementType(const movementType &MT) : x(MT.x), y(MT.y), moves(MT.moves) { } // Copy constructor
  int x, y , moves; 
};

その後、

fill_n(someOtherVector.begin(),64, movementType(5,6,7));
于 2012-10-24T19:57:32.947 に答える