我正在研究图论问题并使用邻接列表实现。我有很长的文本文件,它们代表N> 100个顶点的图形的邻接列表。
文本文件以下列方式编写:
1 2 3
2 3 1
3 2
这将代表三个顶点的图形。第一个数字是顶点,该行中的其余数字代表相邻的顶点。
我目前已将邻接列表声明为
vector<vector<int> > adjList(N);
我的目标是将每一行复制到adjList的每个元素中。
之前我使用ifstream读过文件,但这些文件只是将大量数据集复制到数组中,我觉得这个问题不同。
我该怎么做?
我目前的代码如下:
ifstream inFile;
int N=200;
vector<vector<int> > adj(N);
inFile.open("/Users/davidvillarreal/Desktop/aaa.txt");
cout << "opened " << endl;
if (inFile.fail()) {
cerr << "error encountered" << endl;
exit(1);
}
答案 0 :(得分:1)
你可以简单地这样做..如果文件格式严格是一个空格和一个整数......并且在最后的新行...
vector<int> v;
vector<vector<int>> vv;
int i;
char c = ' ' ;
//repeat next until the eof
while(c != '\n') {
f >> skipws >> i;
v.push_back(i);
f >> noskipws >> c;
}
vv.push_back(v);
答案 1 :(得分:1)
这个小例子应该表明这样做的一种方式:
#include <vector>
#include <sstream>
#include <iostream>
#include <string>
#include <iterator>
//...
int main()
{
// use a typedef to simplify things a bit
typedef std::vector<int> Int1D;
typedef std::vector<Int1D> Int2D;
// declare the adjacency list
Int2D adjList;
std::string line;
std::ifstream infile;
//...
//..assume that infile has been opened successfully
//...
while (std::getline(infile, line))
{
// use a string stream to help parse the ints
std::istringstream strm(line);
int n;
// add an empty row
adjList.push_back(Int1D());
// now fill in the last row we added by reading in the ints
while (strm >> n)
adjList.back().push_back(n);
}
// output results
for (size_t i = 0; i < adjList.size(); ++i)
{
std::copy(adjList[i].begin(), adjList[i].end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}
}
请注意,我们有两个循环 - “读取”循环,以及将每个int
添加到adjList
的最后添加向量的循环。 vector::back()
的使用为我们提供了添加到列表中的最后一个向量。
答案 2 :(得分:1)
又一个解决方案:
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <sstream>
int main() {
std::vector< std::vector<int> > data;
std::ifstream file("data.txt");
std::string line;
if ( file ) {
while(std::getline(file, line)) {
std::stringstream sline(line);
data.push_back(std::vector<int>( std::istream_iterator<int>( sline ), std::istream_iterator<int>() ));
}
}
return 0;
}