【发布时间】:2011-08-24 16:16:37
【问题描述】:
我在 C++ 中有一个向量类,它依赖于原始指针。我不使用 std::vector 因为我需要为特殊情况从原始指针创建向量对象。这是我的课程非常简单的示例:
template <typename T>
class Vector
{ ...
private:
T * m_data; int m_size; bool dontFree; ...
public:
Vector(T *const ptr, int size) { m_data = ptr; m_size = size; dontFree = true; }
Vector(int size, T val) { ... dontFree = false; }
~Vector(): { if(!dontFree) delete [] m_data; }
T& operator[](const size_type index);
};
同样,我有矩阵数据类型,它也将数据存储在原始指针中,并且可以使用向量来支持 [][],因为它在 C++ 中是不允许的,例如:
template<typename T>
class Matrix
{
private:
T * m_data; ...
public:
...
Vector<T>& operator[](const int rowIndex)
{
return Vector<T>(&m_data[rowSize * rowIndex], rowSize);
}
}
我怎样才能有效地实现 operator[] 矩阵返回向量,以便我可以编写代码,如下所示:
Matrix<int> m(5,5);
m[1][1] = 10;
int temp = m[1][2];
请建议考虑复制构造函数等的开销。
【问题讨论】:
-
通过拷贝返回向量,而不是通过引用返回,无效。复制成本很低,甚至可以完全优化。
-
你能更好地解释为什么你不能使用
std::vector吗?内存范围 [m_data,m_data + size] 是否已经分配?可能一个 c++1x 移动构造函数可以解决您的问题。 -
@Wiso:我认为这里的想法是创建矩阵的“切片视图”,它允许您将行和列视为一维向量。使用辅助类来做这件事很好,而且应该很高效,因为您不需要移动任何实际数据。