至于选项 2,如果您使用表示二维的一维向量,请使用包装器,例如
class Vector2D{
private:
vector<int> m_data;
unsigned int m_width;
unsigned int m_height;
unsigned int index_transformation((const unsigned int i, const unsigned int j) const;
public:
Vector2D(const int default_value = 0);
Vector2D(const unsigned int width, const unsigned int height, const int default_value = 0);
void resize(const unsigned int width, const unsigned int height);
int& operator() (const unsigned int i, const unsigned int j);
const int& operator() (const unsigned int i, const unsigned int j) const;
const unsigned int& width() const;
const unsigned int& height() const;
}
(在我的示例中首先进行私有化,以便您轻松理解结构)
重点是,宽度优先或高度优先几乎是任意的,如何做到这一点的责任应该放在一个地方,比如在包装器中。在这种情况下,它甚至被简化为一个方法,index_transformation。
edit:Andy T 问我为什么喜欢这种结构,事实是,我不喜欢。基本上,我是说如果你这样做,那么......但你可以轻松地使用vector<vector<int> >,而不是在那里,没有问题。也就是说,您可能还想包装一个二维向量,原因很简单,这可以确保向量保持规则(例如,与 {{1,2},{3}} 不同,它的子向量长度为2 和长度 1) 之一 - 也就是说,如果向量被大量传递。一个简单的二维向量在小范围内或在任何可以轻松确保规律性的上下文中都是完全可以的。
也就是说,对于您的一般问题:初始化很可能不会受到伤害。也就是说,您可以简单地使用预期数量的元素(或者,更好地说,它的上边界)初始化您的向量。这当然会导致 O(n) 的工作量,但很可能,与之后的工作量相比,这个工作量会很小。如果不是,因为您的预期可能远远大于实际使用量,或者如果在后面的算法中只完成了一些动作,是的,保留,这里没有问题。缺点是你仍然需要调整你可以忘记的向量的大小,但这很容易检测到。