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

时间:2014-08-26 11:30:32

标签: c++ performance

你好:)我正在实现一些顶点是字符串的图形。我用它们做了很多事情,所以使用字符串会非常无效。这就是为什么我使用索引,简单的整数。但是虽然课程的其他部分工作得非常快,但我在下面复制的部分却遇到了麻烦。我已经读过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;
    }
};

1 个答案:

答案 0 :(得分: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. 进行参数
  3. 执行单个地图查找而不是两个:我们推测性地插入()然后查看它是否有效,这可以在任何一种情况下保存冗余查找。
  4. 请告知我们有多大区别。如果您的密钥通常很小,另一个想法是使用像GCC vstring这样的自包含字符串类型,这避免了对一到二十个字符下的字符串进行异地内存分配。然后考虑您的数据是否足够大以从哈希表中受益,或者是否其他数据结构更有效。