0

ベクトルを作成するテンプレートがあります。デフォルトのコンストラクターは、n 個の同じ値の要素を割り当てます。2 番目のコンストラクターは、指定された引数でベクトルを作成します。2 番目のコンストラクターはデフォルトのコンストラクターを使用してベクターを定義するため、このベクターに含まれる要素の数とその値についてのみ引数を与えることができます。

    public:
      vector<float> coords;
      Vector<n> (){
      coords.assign(n, 0.0);
      }
      Vector<n> (vector<float> crds){
          coords.assign(crds.size(),0.0);
}   

理想的には、2 番目のコンストラクターはcrdsを受け取り、そのサイズをチェックする必要があります。次に、 crdsのサイズと同じ回数だけゼロを割り当てます。サイズが 2 の場合はうまく機能しますが、サイズが 2 より大きいまたは小さい場合はエラーが発生します。

これが機能するようになったら、crds にすべての値を挿入し、不要なゼロをポップします。しかし、現時点では別の解決策を見つけることができません。+ assign よりも自分に適した vector stl 関数が他に見つかりませんでした。

結果を確認するコードは

    Vector<2> v2 (vector<float>(2,3)); 
4

2 に答える 2

2

これは私があなたが求めていると思うことをします。2 番目のコンストラクターのコードの複雑さにより、余分な値をコピーせず、単に消去することが保証されます。

#include <vector>
#include <algorithm>
#include <cassert>

// untested
template <std::size_t n>
struct Vector {
  std::vector<float> coords;
  Vector() : coords(n, 0.) {}
  Vector(const std::vector<float>& crds)
    : coords(crds.begin(),
        crds.begin()+std::min(n, crds.size())) {
    // resize() extends coords with 0.0 values
    coords.resize(n);
  }
};

int main () {
  std::vector<float> v(3);
  Vector<6> V(v);
  assert(V.coords.size() == 6);
}


編集:説明された要件への対応:

#include <vector>
#include <algorithm>
#include <cassert>

// untested
template <std::size_t n>
struct Vector {
  std::vector<float> coords;
  Vector() : coords(n, 0.) {}
  Vector(const std::vector<float>& crds)
    : coords(crds) { }
};

int main () {
  Vector<6> V1;
  Vector<6> V2(std::vector<float>(3, 2.));
  Vector<6> V3(std::vector<float>(10, 3.));
  assert(V1.coords.size() == 6);
  assert(V2.coords.size() == 3);
  assert(V3.coords.size() == 10);
}


EDIT : 初期化子リストの要件に対応しています。

std::vectorコンパイラが c++11 機能を提供している場合は、 を使用して、またはVector 値のリストから初期化できますstd::initializer_list

#include <vector>
#include <algorithm>
#include <cassert>
#include <initializer_list>

// untested
template <std::size_t n>
struct Vector {
  std::vector<float> coords;
  Vector() : coords(n, 0.) {}
  Vector(const std::vector<float>& crds)
    : coords(crds) { }
  Vector(std::initializer_list<float> list)
    : coords(list) {}

};

int main () {
  Vector<6> V1;
  Vector<6> V2(std::vector<float>(3, 2.));
  Vector<6> V3(std::vector<float>(10, 3.));
  Vector<6> V4(std::vector<float> ({1, 2, 3, 4}));
  Vector<6> V5({1, 2, 3, 4});
  assert(V1.coords.size() == 6);
  assert(V2.coords.size() == 3);
  assert(V3.coords.size() == 10);
  assert(V4.coords.size() == 4);
  assert(V5.coords.size() == 4);
}
于 2012-03-13T13:37:04.207 に答える
0

あなたが何をしたいのかを正しく理解していれば、標準のベクターコンストラクターを使用するだけで、あなたが望むことができるはずです:

#include <vector>

template <int N>
class Vector {
public:
  std::vector<float> coords;

  Vector ()
    : coords(N, 0.0f)
  {}

  Vector (const std::vector<float> & crds)
    : coords(crds)
  {}
};

しかし、コメントで他の人が強調しているように、これは設計が不十分なようです (特に、N両方のコンストラクターでの役割が非常に非対称である理由を理解できません) 。

于 2012-03-13T13:36:03.473 に答える