Хотя у вас есть хороший ответ от @Achal для динамического размещения, как уже упоминалось, вам действительно следует использовать контейнер vector
, предоставляемый C ++, чтобы сделать вещи намного проще и надежнее.Все контейнеры C ++ обеспечивали автоматическое управление памятью, освобождая вас от необходимости выделять вручную (и с гораздо меньшей вероятностью ошибиться)
При использовании контейнеров, таких как вектор векторов, для хранения ваших данных, вы можете просто прочитатьи откажитесь от своих "//elements in universal set"
, "//no. of subset"
и "//Elements in each subset"
.Эти значения не требуются при использовании контейнеров.Вы просто читаете значение, которое хотите, и добавляете его в свой контейнер, контейнер будет увеличиваться по мере необходимости.
Хотя неясно на 100%, как выглядят ваши входные данные, мы можем вывести их из вашего файла.выглядит примерно так:
Пример входного файла
Где ваши первые целые числа - это "//elements in universal set"
, который не нужен для чтения данных.Как и во второй строке, ваш "//no. of subset"
не имеет значения для чтения данных.Наконец, 1-й элемент в каждой строке данных, ваш "//Elements in each subset"
также не нужен.Каждое из этих значений просто читается и отбрасывается для получения окончательного набора данных.
$ cat dat/universal_sub.txt
5
4
5 1 2 3 4 5
3 1 2 3
4 1 2 3 4
6 1 2 3 4 5 6
Окончательный набор данных, который вы хотите сохранить
Из полного файла,Похоже, что это фактические значения данных, которые вы хотите сохранить (может быть четное число, но для этого нет необходимости)
1 2 3 4 5
1 2 3
1 2 3 4
1 2 3 4 5 6
Существует множество различных способов объединения частей.Краткий пример того, как получить окончательный набор данных из входного файла:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <limits>
int main (void) {
std::string line; /* string for reading each line */
std::vector<std::vector <int>> subset; /* vector<vector<int>> */
int universal, nsubsets; /* two int to read/discard */
if (!(std::cin >> universal >> nsubsets)) { /* read/dicard 2 values */
std::cerr << "error: failed to read universal.\n";
return 1;
}
/* read/discard '\n' (any chars) left in input buffer line by cin above */
std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
while (getline (std::cin, line)) { /* read each remaining data line */
int unneeded, i; /* 1st value and i for rest */
std::vector<int> tmp; /* vector<int> for each line */
std::stringstream ss (line); /* stringstream to read from */
if (ss >> unneeded) { /* read/discard 1st value */
while (ss >> i) /* read rest from stringstream */
tmp.push_back(i); /* add to tmp vector */
subset.push_back(tmp); /* add tmp vector to subset */
}
}
for (auto& i : subset) { /* loop over subsets */
for (auto& j : i) /* loop over each value in subset */
std::cout << " " << j; /* output value */
std::cout << '\n'; /* tidy up with newline */
}
}
( примечание: в выходных циклах используется цикл for на основе диапазона .(начиная с C ++ 11) , но вы можете использовать контейнерные функции .begin()
и .end()
с традиционным циклом for
, если ваша компиляция не поддерживает std=c++11
)
Пример использования / вывода
Считывание ваших данных в вектор векторов позволяет получить доступ к каждому элементу:
$ ./bin/vector_2d_subset < dat/universal_sub.txt
1 2 3 4 5
1 2 3
1 2 3 4
1 2 3 4 5 6
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы илиесли я неверно истолковал ваш формат файла данных.