0

たとえば、次のように 2D ベクトル (1000x3) を作成します。

vector<vector<float>> Vector (1000, vector<float>(3))

関数は、3D ポイントをベクトルに格納します (必ずしも 1000 ポイントではなく、1000 未満)。作成したベクターの最後の行のインデックスを取得するにはどうすればよいですか?

vector クラスで定義されている end というメソッドを見つけましたが、構文がわかりません。

また、ベクトルに格納されている最後のポイントのインデックスをトレースできると言う人もいます。たとえば、次のようになります。

Vector[i][j] = value;

しかし、他の関数でこのデータが必要なので、常にこのインデックスを返すことは、私にとっては良い選択肢ではないようです。

4

2 に答える 2

1

各行は 3D ポイントであり、必ず 3 つの要素を持つため、std::vectorは適切なタイプではありません。内部型には、おそらく astd::array<float, 3>または astructをメンバーxy、およびとともに使用します。z

ベクトルに実際には 1000 ポイントは必要ないようです。後で再割り当てを避けるためにそうしているのでしょうか?その場合は、を使用する必要がありますVector.reserve(1000);。これにより、ポイントを実際に追加せずにポイントのメモリが予約されます。emplace_back次に、push_backまたはその他のメカニズムを使用してポイントを追加できます。

次に、ベクター内の最後の点への反復子を取得するには、 または のいずれかを実行できstd::end(Vector) - 1ますVector.end() - 1。ベクトルに常に 1000 個のポイントがある場合、これを保持していた場合は、1000 番目のポイントへの反復子が与えられます (まだ有用な値を割り当てていなくても)。

于 2014-01-19T14:55:08.023 に答える
1

1000 要素で初期化しないでください。空のままにし、 Vector.push(...) を使用して新しいポイントを追加するだけで、ベクターは自動的に成長します。

次に、最後のインデックスは次のとおりです。

Vector.size() - 1

または、どうしてもそうする場合は、クラスに入れて、サイズを格納するメンバーを追加できます。

struct PointVector {
    vector<array<float, 3>> Vector;
    int size;
    PointVector() : Vector(1000, {0, 0, 0}), size(0) { }
};
于 2014-01-19T14:56:32.237 に答える