C ++索引到索引映射

时间:2013-04-18 05:30:12

标签: c++ vector

我有一个ID列表(整数)。 它们以非常有效的方式排序,以便我的应用程序可以轻松处理它们,例如

9382
297832
92
83723
173934

(这在我的申请中非常重要)。

现在我面临着必须在另一个向量中访问ID的某些值的问题。

例如,ID 9382的某些值位于someVectorB [30]。

我一直在使用

const int UNITS_MAX_SIZE = 400000;

class clsUnitsUnitIDToArrayIndex : public CBaseStructure
{
private:
    int m_content[UNITS_MAX_SIZE];
    long m_size;
protected:
    void ProcessTxtLine(string line);
public:
    clsUnitsUnitIDToArrayIndex();
    int *Content();
    long Size();
};

但是现在我把UNITS_MAX_SIZE提高到400.000,我得到了页面堆栈错误,这告诉我我做错了什么。我认为整个方法并不是很好。

如果“位置”不同,我想在不同的矢量中找到ID,我该怎么用?

ps:我正在寻找一些简单的东西,可以从文件中轻松读入,也可以轻松地序列化为文件。这就是为什么我之前一直在使用这种蛮力方法。

3 个答案:

答案 0 :(得分:3)

如果你想要从int到int的映射和非连续的索引号,你应该考虑std::map。在这种情况下,您可以将其定义为:

std::map<int, int> m_idLocations;

地图表示两种类型之间的映射。第一种类型是“密钥”,用于查找称为“值”的第二种类型。对于每个id查找,您可以将其插入:

m_idLocations[id] = position;
// or
m_idLocations.insert(std::pair<int,int>(id, position));

您可以使用以下语法查找它们:

m_idLocations[id];

通常,使用red-black trees实现stl中的std::map,其具有更差的查找速度O(log n)。这比O(1)稍微慢一点,你将从大阵列中获得,但它更好地利用了空间,你不太可能注意到实践中的差异,除非你存储了真正庞大的数字或做了大量的查找。

修改

在回应一些评论时,我认为重要的是要指出从O(1)转到O(log n)会对应用程序的速度产生显着影响,更不用说转移到实际的速度问题了。固定的内存块到基于树的结构。但是我认为最初代表你想要说的(int-to-int)映射并避免过早优化的陷阱是很重要的。

在您表示概念之后,您应该使用分析器来确定速度问题是否以及在何处。如果您发现地图导致问题,那么您应该考虑用您认为会更快的内容替换您的地图。 确保测试优化有帮助,并且不要忘记包含关于您所代表的内容以及需要更改的原因的重要评论。

答案 1 :(得分:1)

由于int m_content [UNITS_MAX_SIZE],可能会出现stackoverflow错误。数组在堆栈上分配,400000是堆栈的相当大的数字。您可以使用std :: vector,它是动态分配的,您可以返回vector成员的引用以避免复制操作:

std::vector<int> m_content(UNITS_MAX_SIZE);

const std::vector<int> &clsUnitsUnitIDToArrayIndex::Content() const
{
   return m_content;
}

答案 2 :(得分:1)

如果没有其他工作,你可以在构造函数中动态分配数组。这将移动堆上的大型数组并避免页面堆栈错误。您还应该记住在销毁clsUnitsUnitIDToArrayIndex

时释放资源

但建议的用法是其他成员建议的,使用std :: vector或std :: map