更改升压向量的构造函数

Changing the constructor of a boost vector

本文关键字:构造函数 向量      更新时间:2023-10-16

我试图改变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);

我想我可以创建一个新的类,提供一个接口来做到这一点,无论是包含或继承从增强向量类,但我是相当新的c++,我不确定最好的方式来保留增强向量的功能。特别是因为我不想干扰uBLAS向量类使用的模板表达式优化。任何关于这方面的建议将是非常感激的。谢谢,基兰

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

vector<vector<type>> v;

在这种情况下,我不确定你所说的x和y是什么意思。使用[]操作符而不是()操作符:v[1] = x, etc

如果两个坐标(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. 您正在寻找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等的自动互操作)


在不具备上述条件的情况下,下面的语句将是惯用的:

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

如果你经常处理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));

最后看一下例3