更改增强矢量的构造函数

时间:2011-12-05 20:55:21

标签: c++ boost constructor ublas

我正在尝试更改BOOST uBLAS向量的构造函数行为,并想知道最好的方法是什么。我想使用构造函数初始化2D向量的组件(坐标),例如:

而不是:

typedef boost::ublas::vector BoostVector;

double x=1;
double y=0.7;

BoostVector<double> v(2);
v(1) = x; v(2) = y; //x and y are vector components/co-ordinates

我希望能够在构造函数中指定x和y。

BoostVector<double> v(x,y);

我想我可以通过包含或继承boost向量类来创建一个提供接口的新类,但是我对C ++很新,我不确定最好的方法保留增强矢量的功能。特别是因为我不想干扰uBLAS矢量类使用的模板表达式优化。对此有任何建议将非常感激。 谢谢, 基兰

3 个答案:

答案 0 :(得分:0)

2D在多维数组中还是两个坐标?如果是多维的,请使用向量矢量:

vector<vector<type>> v;

在这种情况下,我不确定x和y的意思。并使用[]运算符而不是()运算符:v[1] = x

如果有两个坐标(x轴,y轴),我会做这样的事情:

template <class T>
class Vector2
{
public:
    Vector2(const T& x, const T& y) : mX(x), mY(y) {}

private:
    T x;
    T y;
};

我倾向于创建自己的Vector2类而不是使用现有的std :: vector的原因是因为如果你所存储的所有内容都是两个值,你就不会消除大量的开销。这包括动态内存分配,存储数组的长度等。如果你所做的只是存储两个值,你不需要所有的东西。

答案 1 :(得分:0)

有许多方法可以给猫皮肤涂抹:

  1. 您在寻找C ++ 0x统一初始化器吗?

    std::vector<type> v { x, y };
    
  2. 或者只是普通的旧C ++ 03:

    type arr[] = { x,y };
    std::vector<type> v(arr, arr+2);
    
  3. 如果您想要一个具有类似结构行为的类,请使用元组:

    std::tuple<type, type> point(x,y);
    

    元组位于TR1,C ++ 0x和Boost中。它们具有各种漂亮的功能(例如与std :: pair,std :: less等自动互操作)。


  4. 在上述所有方面的缺席中,以下是惯用语:

    typedef std::pair<type, type> point_t;
    
    point_t p(x,y);
    

答案 2 :(得分:0)

如果您正在处理2D向量并且想要使用uBLAS,那么引入一些便利函数可能是合理的。顺便说一句,当你使用固定大小的向量时,使用bounded_array存储(在堆栈上)更有效

我想到了以下解决方案(没有一个是理想的,让uBlasstd::initialization_list兼容会很好):

// Assignment:
#include <boost/numeric/ublas/assignment.hpp>
ublas::bounded_vector<double,2> v1;
v1 <<= 1.1, 2.1; // syntactic sugar over plain assignment

// Use a helper
template<typename T>
ublas::vector<T> makeVector2(T x1, T x2) 
{
    ublas::bounded_vector<T,2> res; // I
    res <<= x1, x2; // or plain res(0)=x1; res(1)=x2;
    return res;
}
ublas::vector<double> v1 = makeVector2<double>(1,2.2);

// Use an `evil' conversion-helper (or it's templatized variant)
class Foo {
public:
    Foo(double x1, double x2) : m_x1(x1), m_x2(x2) {}
    operator ublas::vector<double>() { return makeVector2(m_x1, m_x2); };
private:
    double m_x1, m_x2;
};
ublas::vector<double> v3(Foo(1.3,2.3));

最后看看Example 3