C++ C++;使用无序_映射向量的图,在访问时添加随机数据,如图[i][j]

C++ C++;使用无序_映射向量的图,在访问时添加随机数据,如图[i][j],c++,graph,unordered-map,C++,Graph,Unordered Map,我试图浏览一个包含2009年facebook数据的txt文件,将人表示为图表上的顶点,将友谊表示为边。使图形完美运行的代码。我用它来计算这个数据集中人们的平均朋友数。但是当试图找到他们朋友的平均值时,事情变得很奇怪。当我尝试获取某个朋友的朋友数时,该表的大小急剧增加(有一次从10个增加到988个),它一直这样做,直到我遇到一个严重的alloc错误,我不知道为什么。如何在不更改图形的情况下访问元素 while (FacebookInfo >> V1 >> V2 >&

我试图浏览一个包含2009年facebook数据的txt文件,将人表示为图表上的顶点,将友谊表示为边。使图形完美运行的代码。我用它来计算这个数据集中人们的平均朋友数。但是当试图找到他们朋友的平均值时,事情变得很奇怪。当我尝试获取某个朋友的朋友数时,该表的大小急剧增加(有一次从10个增加到988个),它一直这样做,直到我遇到一个严重的alloc错误,我不知道为什么。如何在不更改图形的情况下访问元素

 while (FacebookInfo >> V1 >> V2 >> garbage) {

        unordered_map<int, int>::const_iterator got = graph[V1].find(V2);

        if (got == graph[V1].end()) {
            graph[V1].insert(make_pair(V2, (int)graph[V1].size()));
            graph[V2].insert(make_pair(V1, (int)graph[V2].size()));
        }
    }


//This is the loop that breaks it
    for (int i = 1; i < 63732; i++) {

        int averageFriendsOfFriendsForV = 0;

        for (int j = 0; j < graph[i].size(); j++) {
            int friendOfFriend = graph[graph[i][j]].size(); //this is the line specifically the graph[i][j]
            averageFriendsOfFriendsForV += friendOfFriend;
        }

        averageFriendsOfFriendsForV /= graph[i].size();

        totalAvg += averageFriendsOfFriendsForV;
    }




修复它

这总是让我感到困惑,如果您查看for
std::unordered\u映射
,您会发现它将:

... perform an insertion if such key does not already exist.
所以在你怀疑的那条线上的循环中:

int friendOfFriend = graph[graph[i][j]].size();
您可能每次都在创建新条目,这最终变得不可能。如果您发布更多的代码,可能更容易诊断(因为我不确定首先是什么类型的
graph

与其使用
操作符[]
,不如执行以下操作:

auto friend = graph.find(i);
if (friend == graph.end()) return;
auto other_friend = graph.find(friend->second);
if (other_friend == graph.end()) return;

或者沿着这些思路,你明确地检查朋友的存在。

63732
似乎有点武断。如果这不仅仅是一个快速的压力测试,你应该把这个数字变成一个带有描述性名称的常数。跟随你的人会感谢你。或者至少不要用你的名字作为诅咒词。啊,谢谢你,佛陀,这是有道理的!63732是数据集中有多少个元素,我把它改成一个变量来解释,谢谢你的建议!是的,这是因为
graph[i]
的键不一定是从
0
graph[i].size()-1
的整数。你应该在实际的键上迭代。@JonathonFord一个地图神秘地获得了更多的元素,这表明你正在使用地图的
操作符[]
来搜索地图。如果未找到条目,则映射将添加该条目。这是人们在使用
操作符[]
进行地图搜索时经常犯的错误。如果您的目标是确保不会无意中添加条目,请使用映射的
find()
函数。如果结果表明键顺序良好且不是稀疏的,则使用数组或
向量
可能是更好的选择。使用整数键和更少的开销,数组或
向量
将具有更快的查找速度。
auto friend = graph.find(i);
if (friend == graph.end()) return;
auto other_friend = graph.find(friend->second);
if (other_friend == graph.end()) return;