0

我有一个制作矢量的模板。默认构造函数分配 n 个相同值的元素。第二个构造函数用给定的参数创建一个向量。由于第二个构造函数使用默认构造函数来定义向量,我只能给出关于该向量中有多少元素以及它们的值是多少的参数。

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

理想情况下,第二个构造函数应该使用crds并检查它的大小。然后分配与crds大小一样多的零。如果大小为 2,则效果很好。但如果大小大于或小于 2,则会出现错误。

如果我得到这个工作,那么我会在 crds 中插入每个值并弹出不必要的零。但目前我想不出另一种解决方案。+ 我没有找到比 assign 更适合我的任何其他向量 stl 函数。

我检查结果的代码是

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

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);
}


编辑:响应初始化列表的要求。

如果您的编译器提供 c++11 功能,您std::vector可以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 回答