C ++迭代器 - Deduce维度

时间:2014-04-30 19:03:03

标签: c++ iterator

我计算矩阵的行列式,计算因此根据数据的维数调用方法,例如:

template<int X, int Y>
float determinant(X, Y, std::vector<Vector> &data)
{
    // Determine the dimensionality of matrix data (x and y) 
}

我遇到的问题是,在计算PCA的类中,调用此函数只接受迭代器:

class PCA { 

   public: 

      template<typename T> 
      PCA(T begin, T end)
      {
          // Determine the X and Y here
          float det = determinant(X, Y, ....); 
      }
}; 

现在我想知道是否可以从已经通过PCA传递的迭代器中推导出XY,而不是传递两个整数值。

非常感谢任何建议

编辑:

道歉,我的问题不明确。

基本上,typedef std::vector<double> Vector;被使用,因此std::vector<Vector> data;将是向量的向量。

我对此进行了以下操作:

std::vector<Vector> data1 = { {1, 2}, {3, 4}, {5, 6}, {8, 9} }; // 2x2而当我想添加以下内容时:std::vector<Vector> data2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} }; // 3x3显然,在计算行列式时,会有不同的计算方法。

我想从函数中推断出data1是2x2和data2 3x3,而不必专门传递这些值。

2 个答案:

答案 0 :(得分:1)

由于矢量不是固定大小的,因此它们可能是锯齿状的。 (用std::array<>T [N][M][L]来约束它;你可以在编译时推断他们的排名。)

我们假设他们不是:看到它 Live On Coliru

#include <vector>
#include <cstdint>
#include <deque>

template <typename V>
    std::deque<std::size_t> dims_of(V const& v) {
    return {};
}

template <typename T>
    std::deque<std::size_t> dims_of(std::vector<T> const& v)
{
    if (v.empty())
        return { 0 };
    else
    {
        auto dims = dims_of(v.front());
        dims.push_front(v.size());
        return dims;
    }
}

#include <iostream>

int main()
{
    std::vector<std::vector<std::vector<int> > > const
        v(7, std::vector<std::vector<int> >(
            10, std::vector<int>(3, 0)
            )
         );

    for (auto dim : dims_of(v))
        std::cout << dim << " ";

} 

打印

7 10 3 

答案 1 :(得分:0)

如何从PCA派生到持有X和Y的类

template<int X,int Y>
PCA_size : public PCA
{
      enum { Xv=X};
      enum { Yv=Y};

}

然后你可以将现有的PCA对象重铸为你的

 static_cast<PCA_size<3,5> >(PCA_instance);