使用 n 维 C++ Vector 类实现算术运算符重载的更好方法?

Posted

技术标签:

【中文标题】使用 n 维 C++ Vector 类实现算术运算符重载的更好方法?【英文标题】:Better way to implement arithmetic operator overloads with a n-dimensional C++ Vector class? 【发布时间】:2011-12-25 01:55:33 【问题描述】:

我在我的代码中使用了自己的数学向量类。我有一个新的需求,将我的向量类推广到 n 维,而不是只有 2 维。

我的问题是,实现运算符重载的最佳方法是什么,这样做会产生很大的开销吗?

我现在将值存储在一个数组中

double *vals;
....
vals = new double[dimension];

有了这个,我像这样实现 + 运算符:

Vector Vector::operator+(Vector v) 

    Vector ret = Vector(dimension);
    for (int i = 0; i < dimension; i ++)
    
        ret.vals[i] = vals[i] + v.vals[i];
    

此操作将完成很多并且必须快速运行。这是否比旧版本差很多(就速度而言)?

Vector Vector::operator+(Vector v) 
    return Vector(x + v.x, y + v.y);

感谢您的任何意见!

【问题讨论】:

哎呀,绝对想要那个! tvmet.sourceforge.net 【参考方案1】:

如果你想要一个快速的矢量类,那么使用模板来确定大小:

template<std::size_t size>
class Vector 
  double data[size];
public:
  double& operator[](std::size_t x)  return data[x]; 
;

template<std::size_t size>
Vector<size> operator+(Vector<size> lhs, const Vector<size>& rhs) 
  for (std::size_t i = 0; i < size; ++i)
    lhs[i] += rhs[i];
  return lhs;

仅当您想重新调整它们的大小或它们非常大时,才不需要将它们设置为动态大小。

有比这更快的方法,例如 SSE。如果你想要一些高度优化的东西,你应该使用专门的数学库。

【讨论】:

【参考方案2】:

首先,我建议通过 reference 而不是按值传递您的操作数,以避免不必要的对象复制:

Vector Vector::operator+(const Vector &v) 

其次,大多数编译器都实现了Return Value Optimization,这将有助于消除多维实现中的本地ret

当然,最好的方法是实现您的代码,对其进行基准测试,然后然后在必要时应用优化。 Scott Meyers 的Effective C++ 是您在这里尝试做的事情的绝佳参考。

【讨论】:

RVO 在此特定示例中不会被调用。 好吧,如果它实际上没有return ret;...但假设ret被返回,为什么不呢?

以上是关于使用 n 维 C++ Vector 类实现算术运算符重载的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章

c++里面的2维向量是啥意思????

在 O(1) 复杂度 C++ 中删除 vector<int> 的最后 n 个元素?

N维整型向量类

从C ++代码中提取算术运算信息[关闭]

C++基础入门丨3. 搞明白4类运算符——运算符

C++基础入门丨3. 搞明白4类运算符——运算符