1,比如图数据集格式如下:
12 24
1 2
1 3
1 4
1 9
3 8
3 12
........
2,我想转换为如下这种格式
12 24
1 4 2 3 4 9
3 3 9 8 12
.......
3,转换思想:先读进来存储后再写出去
#pragma once
#include <vector>
using namespace std;
class Node
{
public:
Node(void);
Node(int x):vertex(x){};
~Node(void);
public:
int vertex;
vector<int> vec;
};
#pragma once
#include <fstream>
#include <iostream>
#include "Node.h"
using namespace std;
class Graph
{
public:
Graph(void);
~Graph(void);
void Readfile(Graph &g);
void outtotxt(Graph g);
void Readfile1(Graph &g);
public:
int vernum;
int arcnum;
Node* AdjVector;
};
Graph,cpp内容如下:
#include "StdAfx.h"
#include "Graph.h"
#include <sstream>
Graph::Graph(void)
{
}
Graph::~Graph(void)
{
}
int count = 0;//记录转换后txt中的行数
void Graph::Readfile(Graph &g)
{
ifstream infile("E:\\1234.txt");
infile >> g.vernum >> g.arcnum;//这需要两次访存
cout << g.vernum << ' ' << g.arcnum << endl;
g.AdjVector = new Node[g.vernum + 1];//建立邻接vector
int tail, head;
for (int i = 1; i <= g.arcnum; i++)
{
infile >> tail >> head;
g.AdjVector[tail].vertex = tail;
g.AdjVector[tail].vec.push_back(head);
}
infile.close();
}
void Graph::outtotxt(Graph g)
{
ofstream outfile("E:\\result1234.txt");
outfile << g.vernum << ' ' << g.arcnum << endl;
for (int i = 1; i <= g.vernum; i++)
{
if (!g.AdjVector[i].vec.empty())
{
outfile << g.AdjVector[i].vertex << ' ' << g.AdjVector[i].vec.size() << ' ';
for (unsigned int j = 0; j < g.AdjVector[i].vec.size(); j++)
{
outfile << g.AdjVector[i].vec[j] << ' ';
}
count++;
outfile << endl;
}
}
outfile.close();
}
void Graph::Readfile1(Graph &g)
{
ifstream infile("E:\\result1234.txt");
string temp;
stringstream ss;
getline(infile, temp);
ss << temp;
ss >> g.vernum >> g.arcnum;
cout << g.vernum << ' ' << g.arcnum << endl;
g.AdjVector = new Node[g.vernum + 1];
int tail = 1;
unsigned int num = 0;
for (int i = 0; i < count; i++)
{
ss.clear();//需要这个
getline(infile, temp);
ss << temp;
ss >> tail >> num;
//cout << tail << ' ' << num << endl;
g.AdjVector[tail].vertex = tail;
g.AdjVector[tail].vec.resize(num);
for (int j = 0; j < num; j++)
{
ss >> g.AdjVector[tail].vec[j];
}
}
infile.close();
}
#include "stdafx.h"
#include "Graph.h"
#include "Node.h"
#include <Windows.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Graph G1,G2;
double start1 = GetTickCount();
G1.Readfile(G1);
double end1 = GetTickCount();
cout << "第一次读入时间为:" << end1 - start1 << "毫秒!" << endl;
G1.outtotxt(G1);
double start2 = GetTickCount();
G2.Readfile1(G2);
double end2 = GetTickCount();
cout << "第二次读入时间为:" << end2 - start2 << "毫秒!" << endl;
system("pause");
return 0;
}