你好:)我正在实现一些顶点是字符串的图形。我用它们做了很多事情,所以使用字符串会非常无效。这就是为什么我使用索引,简单的整数。但是虽然课程的其他部分工作得非常快,但我在下面复制的部分却遇到了麻烦。我已经读过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;
}
};
答案 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
}
优化是:
请告知我们有多大区别。如果您的密钥通常很小,另一个想法是使用像GCC vstring这样的自包含字符串类型,这避免了对一到二十个字符下的字符串进行异地内存分配。然后考虑您的数据是否足够大以从哈希表中受益,或者是否其他数据结构更有效。