基于unordered_map性能的图(简短版本)

Graph based on unordered_map performance (short version)

本文关键字:版本 unordered map 性能 基于      更新时间:2023-10-16

你好:)我正在实现一些顶点是字符串的图。我用它们做了很多事情,所以使用字符串是非常无效的。这就是为什么我使用索引,简单的整数。但是,虽然其余的类工作相当快,我有麻烦的部分,我抄在下面。我在某处读到过,unordered_map需要一些哈希函数,我应该添加它吗?如果是,怎么做?下面的代码包含了我对unordered_map所做的一切。

提前感谢您的帮助:)

class Graph
{
private:
    unordered_map <string, int> indexes_of_vertices;
    int number_of_vertices;
    int index_counter;
    int get_index(string vertex)
    {
        if (indexes_of_vertices.count(vertex) == 0) // they key is missing yet
        {
            indexes_of_vertices[vertex] = index_counter;
            return index_counter++;
        }
        else
            return indexes_of_vertices[vertex];
    }
public:
    Graph(int number_of_vertices)
    {
        this->number_of_vertices = number_of_vertices;
        index_counter = 0;
    }
};

下面是对这个重要函数的快速优化:

int get_index(const string& vertex)
{
    typedef unordered_map <string, int> map_t;
    pair<map_t::iterator, bool> inserted =
        indexes_of_vertices.insert(map_t::value_type(vertex, index_counter));
    if (inserted.second) // the key was missing until now
        return index_counter++;
    else // inserted.second is false, means vertex was already there
        return inserted.first->second; // this is the value
}

优化是:

  1. 接受const-ref参数
  2. 做一个单一的地图查找而不是两个:我们推测插入(),然后看看它是否工作,这节省了冗余查找在任何情况下。

请让我们知道这有多大的不同。另一个想法是,如果您的键通常很小,则使用自包含的字符串类型,如GCC的vstring,这样可以避免为少于一打或二十几个字符的字符串分配非原位内存。然后考虑您的数据是否真的足够大,可以从哈希表中获益,或者其他数据结构是否会更有效。