c++索引到索引映射

C++ index-to-index map

本文关键字:索引 映射 c++      更新时间:2023-10-16

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

9382
297832
92
83723
173934

(这个排序在我的应用程序中非常重要)。

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

例如,ID 9382的某些值位于someevectorb[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:我正在寻找一些简单的东西,可以很容易地从文件中读取,也可以很容易地序列化到文件。

如果你想要一个从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];

通常,stl中的std::map是使用红黑树实现的,它的查找速度为O(log n)。这比你从巨大的数组中获得的O(1)稍慢,但是它实质上更好地利用了空间,除非你存储真正巨大的数字或做大量的查找,否则你不太可能注意到实践中的差异。

编辑:

作为对一些评论的回应,我认为有必要指出,从O(1)到O(log n)的移动会对应用程序的速度产生重大影响,更不用说从固定内存块到基于树的结构的实际速度问题了。然而,我认为重要的是首先表示你想说的(int-to-int)映射,以避免过早优化的陷阱。

在您表示了这个概念之后,您应该使用分析器来确定速度问题是否存在以及在哪里。如果你发现地图正在引起问题,那么你应该考虑用你认为更快的东西替换你的地图。确保测试优化是否有帮助,并且不要忘记包含一个大注释,说明您正在表示的内容以及为什么需要更改

如果没有其他工作,您可以在构造函数中动态分配数组。这将移动堆上的大数组并避免页面堆栈错误。你还应该记得在破坏clsUnitsUnitIDToArrayIndex时释放资源

但是其他成员也建议使用std::vector或std::map

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

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