Мне нужно распечатать все пары чисел из каждой строки, прочитанной из текстового документа. Пример текстового документа будет:
6 8
1 3 5
2 3 4
3 6 5
7 6 8
4 6
7 5
Где первая строка — количество сетей (6) и количество ячеек (8) для гиперграфа. Остальные строки — это ячейки в сети. Таким образом, сеть 1 состоит из ячеек 1, 3 и 5, сеть 2 состоит из ячеек 2, 3 и 4 и так далее. Чтобы превратить этот список соединений в реальный график, мне нужно пройти каждую строку и в основном взять все комбинации чисел в каждой строке. Поэтому после прочтения в первой сети я хотел бы иметь возможность составить график с (1,3), (1,5) и (3,5), а затем спуститься вниз по списку сетей и добавить в график. Пока я могу читать все из текстового файла и распечатывать отдельные ячейки, которые я помещаю в двумерный массив. Вот мой код для этого:
int main() {
ifstream infileHGR; // set stream for hypergraph text file
string inputFileName = "structP.hgr"; // input hypergraph filename here
infileHGR.open(inputFileName, ios::in);
clock_t start = clock(); // start clock
string line;
string data[2]; // initialize data array to take in # of nets and # of cells
int nets = 0;
int cells = 0;
// Reads in the first line of the text file to get # for nets and cells
getline(infileHGR, line);
stringstream ssin(line);
int i = 0;
while (ssin.good() && i < 2) { // error checking to make sure first line is correct format
ssin >> data[i];
i++;
}
nets = atoi(data[0].c_str()); // set first number to number of nets
cells = atoi(data[1].c_str()); // set second number to number of cells
freopen("output.txt", "w", stdout); // writes outptut to text file
// TESTING PURPOSES
cout << "Number of nets = " << nets << endl;
cout << "Number of cells = " << cells << endl;
// while loop to go through rest of the hgr file to make hypergraph (starts at line 2)
string str;
int count = 1; // counter for nets
while (infileHGR.good()) {
getline(infileHGR, str);
stringstream in(str);
int i = 0;
// have the line in str
int n = 1; // start at 1, spaces + 1 = number of nodes per net
for (int i = 0; i < str.length(); ++i) {
if (str.at(i) == ' ') {
n++; // n is number of cells in the net
}
}
// testing
//cout << "str = " << str << endl;
//cout << "n = " << n << endl;
int number;
vector<vector<int> > netList;
vector<int> temp;
while (in >> number){
temp.push_back(number);
}
netList.push_back(temp);
//printNetList(temp); // test to see if info is being put into the vectors
// loop through the 2d vector
for (const auto& inner : netList) {
cout << "net " << count << " = "; //TESTING PURPOSES
for (const auto& item : inner) {
cout << item << " ";
}
count = count + 1;
}
cout << endl;
}
clock_t stop = clock(); // end clock
infileHGR.close();
double elapsed = (double)(stop - start) * 1000.0 / CLOCKS_PER_SEC;
printf("Time elapsed in ms: %f", elapsed);
system("pause"); //for original testing
return 0;
}
Я использовал векторы, потому что каждый входной файл будет иметь разный размер, а некоторые содержат много сетей, а некоторые содержат до 20 ячеек. Мне нужна помощь в получении всех пар (координат) из списка соединений и распечатке их, чтобы показать их все. Я много возился с циклами for, но не могу найти что-то, что работает. Любая помощь будет принята с благодарностью, и просто спросите, нужно ли мне включить что-нибудь еще. Спасибо!
Если вы хотите распечатать все возможные индексы из массива. Вы смотрите в правильном направлении. Вы можете сделать это с помощью циклов for, и у меня фактически была эта проблема немного назад для назначения. Посмотрите на это, оно должно вернуть все возможные индексы:
int b, c = 0;
int userIndex_A;
int userIndex_B;
cin >> userIndex_A;
cin >> userIndex_B;
//This is so you can have variable array lengths
int Arr[userIndex_A][userIndex_B];
for(int a = 0; c < 10; a++){
//The reason I put c in the for loop, to tell it when to stop, is because when c is equal to 10, that's the last index being paired
cout << "Array Index: "<< b << ", "<< c << endl;
if(b == (userIndex_A - 1)){
//userIndex-A is the array length, but 10 doesn't exist, so subtract 1
b = 0;
c++;
//if b is equal to max index value entered, set it to zero and add one to c. You only add one to c when you want to start with the next set of index.
}
b++;
//after each loop, increment the variables
}
Это также работает для 3D и 4D массивов, просто добавьте больше переменных для увеличения каждого цикла и настройте циклы для сброса переменной, как только она достигнет соответствующей максимальной длины индекса массива.
Глядя на ваш пример,
for each line
for i = 1 to N-1th element
for j = i+1 to Nth element
print (i,j)
Я опубликую свой ответ здесь, потому что я смог понять его благодаря некоторым предложениям. Также спасибо за все отзывы о остальной части кода, я определенно сделал это лучше, чем оригинальный пост. Мой цикл for, хотя для циклического прохождения 2D-вектора и распечатки всех пар, таков (вы можете просто проигнорировать выводимую переменную веса):
for (vector<vector<int>> ::iterator i = netList.begin(); i != netList.end(); ++i) {
for (vector<int> ::iterator j = temp.begin(); j != temp.end() - 1; ++j) {
for (auto k = temp.begin() + 1; k != temp.end(); ++k) {
if (*j != *k) {
cout << *j << " " << *k << " " << weight << endl;
}
}
}
}