C++ 如何提高邻接列表分配的速度?

C++ 如何提高邻接列表分配的速度?,c++,data-structures,graph,adjacency-list,C++,Data Structures,Graph,Adjacency List,在确定了80513个节点和5899882条边的邻接矩阵不适用之后,我决定应用邻接列表。这是我第一次实现邻接列表,基本上我决定应用向量向量的向量方法。因此,例如,向量[5]将包含邻居节点5的邻居。可以找到我正在使用的数据集 目前,我已经编写了这段代码,它可以正常工作,但在我的计算机上需要26秒(i5 2.4,6gbram,运行Win7)。我想知道我的代码是否可以改进以降低分配速度 PS:我正在使用fstream库并从.csv文件中读取 #包括 #包括 #包括 #包括 使用名称空间std; int

在确定了80513个节点和5899882条边的邻接矩阵不适用之后,我决定应用邻接列表。这是我第一次实现邻接列表,基本上我决定应用向量向量的向量方法。

因此,例如,向量[5]将包含邻居节点5的邻居。可以找到我正在使用的数据集

目前,我已经编写了这段代码,它可以正常工作,但在我的计算机上需要26秒(i5 2.4,6gbram,运行Win7)。我想知道我的代码是否可以改进以降低分配速度

PS:我正在使用fstream库并从.csv文件中读取

#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
ifstream文件(“edges.csv”);
字符串单词=”,数据=”;
getline(文件、word);
int ARRTTEMP[3];
int numberOfNodes=atoi(word.c_str());
维克托坦;
向量<向量>邻接列表;

对于(int i=0;i更好的方法是节点索引对的
无序集
(其中索引对总是首先列出较小的节点)。

您可以使用adjacencyList.reserve(numberOfNodes)为adjacencyList预先分配内存。这将减少不必要的内存分配和周围数据的复制


在Visual Studio处于调试模式的情况下,STL运行时会跟踪所有迭代器,这使得使用大型容器的工作有时会变慢。调试/发布之间的数量级并不少见。研究“调试迭代器支持”如果你想帮助选择适合你的问题的数据表示,你可以问。在CS上,你需要用英语或数学来解释你的问题,你不能指望人们知道C++。如果你想坚持这个数据表示,并寻找方法来实现C++的实现。“Gilles First,所有这些都是正确的地方。”谢谢大家的详细描述。但是我真正想要的是上面提到的最后一个。我想改进上面的代码,提高我的C++实现效率。总之,一个完全不同的数据结构对我来说是没有帮助的。只是一个想法:代码。对于解析,CSV应该与实际填充邻接列表的代码分开。请在代码中使用更多空格。
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>

using namespace std;

int main()
{
    ifstream file("edges.csv");
    string word="",data="";
    getline(file,word);
    int arrTemp[3];
    int numberOfNodes=atoi(word.c_str());
    vector<int>temp;
    vector< vector<int> >adjacencyList;

    for(int i=0;i<numberOfNodes;i++)
    {
        adjacencyList.push_back(temp);
    }
    while(file.good() && getline(file,word))
    {
        //cout<<word<<endl;
        if(word.size()>0)
        {
            for(int i=0;i<3;i++)
            {
                int cutFrom=word.find_first_of(',');
                arrTemp[i]=atoi(word.substr(0,cutFrom).c_str());
                word=word.substr(cutFrom+1,word.length());
            }
            //cout<<arrTemp[0]<<" "<<arrTemp[1]<<endl;
            adjacencyList[arrTemp[0]-1].push_back(arrTemp[1]-1);

        }
        else
            break;
    }

    cout<<"Vector size:"<<adjacencyList[1].size()<<endl;
    return 0;
}