不包含连续值集合的数据结构被称为稀疏或压缩数据结构。看来,这是你正在寻找的。
如果是这种情况,你想要一个稀疏矢量。有一个在boost中实现,请参阅link text
稀疏结构通常用于节省内存。从你的问题描述中可以得知,你实际上并不关心内存的使用,而是关于寻址那些还不存在的元素(你想要一个自动调整大小的容器)。在这种情况下,没有外部依赖关系的简单解决方案如下:
创建一个模板类,该类包含一个向量并将所有向量方法转发给它。如果索引超出范围,请更改您的运算符[]以调整矢量大小。
// A vector that resizes on dereference if the index is out of bounds.
template<typename T>
struct resize_vector
{
typedef typename std::vector<T>::size_type size_type;
// ... Repeat for iterator/value_type typedefs etc
size_type size() const { return m_impl.size() }
// ... Repeat for all other vector methods you want
value_type& operator[](size_type i)
{
if (i >= size())
resize(i + 1); // Resize
return m_impl[i];
}
// You may want a const overload of operator[] that throws
// instead of resizing (or make m_impl mutable, but thats ugly).
private:
std::vector<T> m_impl;
};
正如在其他答案中指出的那样,当矢量调整大小时,元素不会被清除。相反,当通过调整大小添加新元素时,会调用其默认构造函数。因此,您需要知道何时使用此类operator[]
可能会返回给您一个默认的构造对象引用。因此,<T>
的默认构造函数应该将该对象设置为适合此目的的合理值。例如,如果您需要知道该元素是否先前已被赋值,则可以使用一个定点值。
建议使用std::map<size_t, T>
作为解决方案也有其优点,前提是您不介意额外的内存使用,非连续的元素存储和O(logN)查找,而不是O(1)。这一切都归结为您是否想要稀疏表示或自动调整大小;希望这个答案涵盖两个。
来源
2009-05-30 19:16:47
Jon
这不是更好的使用地图吗? – Silfverstrom 2009-05-30 15:47:26
你为你的任务选择了一个矢量的原因是什么?你是否需要所有的元素存在于连续的内存中?你是否需要一个数组来连接C api? – 2009-05-30 15:51:00
我认为你说得对,地图比较适合这个任务。谢谢。 – Saobi 2009-05-30 17:46:53