我在C++中有一个依赖于原始指针的向量类。我不使用std :: vector,因为我需要从特定情况下的原始指针创建矢量对象。这是我的类的非常简单的例子:C++和运算符中的自定义向量和矩阵类[]
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 []的矩阵returing一个向量,这样我可以写代码,东西如下:
Matrix<int> m(5,5);
m[1][1] = 10;
int temp = m[1][2];
请建议考虑到c的开销opy构造函数等。
通过复制返回载体,而不是引用,这是无效的几个原因。复印很便宜,甚至可能完全被优化。 –
你能更好的解释为什么你不能使用'std :: vector'吗?内存范围['m_data','m_data + size']是否已分配?可能是一个C++ 1x移动构造函数解决你的问题。 –
@Wiso:我认为这里的想法是创建矩阵的“切片视图”,它允许您将行和列视为一维向量。用辅助类做这件事很好,它应该是有效的,因为你不需要移动任何实际的数据。 –