Как хранить неизвестное количество элементов в массиве C ++ - PullRequest
1 голос
/ 14 апреля 2011

Извините, если название неясно, но сейчас я объясню мою проблему. Я новичок в C ++.

Я создал класс на C ++. Экземпляры этого класса являются входными данными программы, и они должны храниться в массиве для выполнения вычислений. Проблема заключается в том, что количество экземпляров этого класса, которые должны быть определены пользователем, фиксировано для одного запуска, но может варьироваться от запуска к запуску. Вот пример:

#include <<blablah>blahblah>

int main()
{
int number_of_instances = 3;

MyClass first_instance(one_parameter_1, another_parameter_1);
MyClass second_instance(one_parameter_2, another_parameter_2);
MyClass third_instance(one_parameter_3, another_parameter_3);

///////////////////

СЕЙЧАС Я ДОЛЖЕН ХРАНИТЬ ВСЕ ТРИ В МОДУЛЕ, КАК

MyClass array[number_of_instances] = {first_instance, second_instance, third_instance};

Проблема в том, что я не знаю до того, как многие из них собираются ввести пользователя

///////////////////

performCalculations(array);
return 0;
}

Заранее большое спасибо.

Ответы [ 6 ]

6 голосов
/ 14 апреля 2011

Типичным решением C ++ является использование вектора .

vector<MyClass> v;
v.push_back(first_instance);  //add an already instantiated object to the end of the vector
v.push_back(second_instance);
v.push_back(third_instance);

Вам не придется беспокоиться об управлении памятью, и вы сможете получить доступ к вектору, как если бы выобычный массив:

v[0].classMember

Вы также можете добавлять элементы в вектор в цикле, если это необходимо, например:

for(int i = 0; i < 5; i++){
    v.push_back( MyClass(i, param2) );
}

И все объекты будут разрушены, когда вектор выйдет изscope, если вы храните объекты непосредственно в векторе.

Одним из недостатков хранения объектов непосредственно в векторе является передача вектора в качестве параметра функции.Это будет медленная операция, поскольку вектор (и все объекты, которые он содержит) должен быть скопирован.

2 голосов
/ 14 апреля 2011

Если вы знаете количество экземпляров до того, как прочитаете их все, вы можете выделить массив в куче, используя new[]. (Не забудьте delete[] их, когда вы закончите.) Обратите внимание, что для этого требуется, чтобы объект имел конструктор по умолчанию.

1 голос
/ 14 апреля 2011

Вы должны использовать std :: vector в этом случае, а не встроенный массив.

#include <vector>
...
std::vector<MyClass> v = {first_instance, second_instance, third_instance};
...
v.push_back(fourth_instance);
0 голосов
/ 14 апреля 2011
Шаблон

use std::vector<MyClass>, vector можно найти в заголовке <vector>.Вы должны немного научиться хорошо кодировать, прежде чем кодировать, используйте любой из онлайн доступных c ++ FAQs

0 голосов
/ 14 апреля 2011

Вам нужен класс Vector из стандартной библиотеки шаблонов, он ведет себя как массив, но он изменит свой размер, если вы заполните его внутреннее размещение.Если вам не нужен произвольный доступ к нему (т. Е. Используйте оператор []), вы можете вместо этого использовать класс List .Если вы используете List, вам нужно создать перечислитель, чтобы пройти через него.

0 голосов
/ 14 апреля 2011

Если вы не знаете, сколько элементов будет содержать массив, я бы использовал std::vector вместо простого массива, поскольку вектор будет увеличиваться для размещения дополнительных элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...