从文件c ++

时间:2017-02-11 03:44:29

标签: c++ matrix

说我有一个包含内容的.txt文件

5
0 1 
1 2 
2 4 
3 2
4 0
1 3

第一个数字是文件中的集合数(NxN矩阵)。其余的是一组简单的图表。

我想知道从文件中存储数据集(表示简单图形的点)的最佳方法是什么。希望使用此数据创建和显示邻接矩阵。

例如:

0 1 0 0 1
1 0 1 1 0
0 1 0 1 1
0 1 1 0 0
1 0 1 1 1

我想从文件中提取它们,以某种方式存储它们,然后我可以将它们相互比较以进行邻接。

我希望能够单独阅读这两个数字,所以如果我看到集合4 0,我知道4与0相邻,反之亦然。我还希望能够在每个矩阵行中查看图中的每个集合(4& 0是相邻的,还有4个相邻的那个)

您如何存储这些数据以满足我的需求?堆?阵列?矢量?

干杯

2 个答案:

答案 0 :(得分:1)

要存储这对顶点,您可以使用std::pair

vector<pair<int, int> > vertices;
while(cin >> a >> b){
    vertices.push_back(make_pair(a, b));
}

将顶点存储在对向量中后,可以使用2-d matrix存储邻接列表。如果其中一对是(1,2),那么您将索引(1,2)处的矩阵以及(2,1)(因为图形似乎是无向的)初始化为1,表示它们具有common edge,否则将该索引初始化为0。

int **adjacency = new int *[n];
for(int i = 0;i < n;i++)
    adjacency = new int[n];
memset(adjacency, 0, sizeof(adjacency));
vector<pair<int, int> >::iterator it = vertices.begin();
while(it != vertices.end()){
    adjacency[it -> first][it -> second] = 1;
    adjacency[it -> second][it -> first] = 1;
}

答案 1 :(得分:1)

什么怪啊。与

std::map<unsigned, std::vector<unsigned>> sparse;

sparse是节点编号到相邻节点列表的映射。我和unsigned一起去了,因为大多数基于阵列的矩阵都讨厌负指数。这种布局不是问题,但重点似乎是建立一个高速查找的邻接矩阵。假设稀疏矩阵,这种结构较小,但与布尔值数组相比,它是sloooooooow。如果您有足够的RAM,请使用它。这就是它的用途。

unsigned a,b;
while(in >> a >> b)
{
    sparse[a].push_back(b);
    sparse[b].push_back(a);
}

ab相邻,因此会将它们添加到彼此的行中。 sparse[nodeNum]返回对nodeNum向量的引用,因此存在相邻节点列表。例如:

std::cout << "4 is adjacent to ";
for(unsigned val: sparse[4])
{
    std::cout << val << " ";
}

将在OP的示例中打印出所有4个邻居节点,2和0。

现在您已经阅读了所有内容,您可以轻松确定尺寸(如果您还没有通过记录读取文件时看到的最大数字)分配矩阵,并从穷人的稀疏矩阵中加载它如上所述。