Добавление элемента в массив объектов в C ++ - PullRequest
0 голосов
/ 12 февраля 2012

Как добавить элемент в конец массива динамически в C ++?

Я привык использовать векторы для динамического добавления элемента.Однако векторы, похоже, не хотят обрабатывать массив объектов.

Итак, моя главная цель - иметь массив объектов, а затем иметь возможность добавить элемент в конец массива для получения другого объекта..

EDIT ** Извините, именно pushback () вызывает у меня проблемы.

class classex
{
private:
    int i;

public:
    classex() { }
    void exmethod()
    {
        cin >> i;
    }
};

void main()
{
    vector <classex> vectorarray;
    cout << vectorarray.size();
    cout << vectorarray.push_back();
}

Теперь я знаю, что push_back должен иметь аргумент, но какой аргумент?

Ответы [ 3 ]

1 голос
/ 12 февраля 2012

Теперь я знаю, что push_back должен иметь аргумент, но какой аргумент?

Аргумент - это то, что вы хотите добавить к вектору. Что может быть проще или ожидаемее?

Кстати, вы действительно действительно действительно не хотите exmethod в качестве фактического метода classex в 99% случаев. Это не так, как работают классы. Сбор информации для создания экземпляра не является частью работы класса. Класс просто создает экземпляр из этой информации.

1 голос
/ 12 февраля 2012

Массивы - это контейнеры фиксированного размера. Поэтому их расширение невозможно. Вы обходите это и копируете один массив в больший и получаете пространство позади старого конца, но это все.

Вы можете создать массив больше, чем вам нужно в данный момент, и запомнить, какие элементы пусты . Конечно, они никогда не бывают пустыми (они по крайней мере содержат нули), но это другая история.

Подобно массивам, существует много контейнеров, некоторые из которых могут расти, например контейнеры stl: списки, векторы, запросы, наборы и т. Д.

добавьте конструктор, чтобы установить i (просто чтобы дать вашему примеру прикосновение к реальному миру) к вашему примеру classex, например:

class classex {
public:
    classex(int& v) : i(v) {}
private:
    int i;
};

Пример для растущего контейнера выглядит следующим образом:

vector <classex> c; // c for container
// c is empty now. c.size() == 0

c.push_back(classex(1));
c.push_back(classex(2));
c.push_back(classex(3));
// c.size() == 3
0 голосов
/ 12 февраля 2012

РЕДАКТИРОВАТЬ: Вопрос был в том, как добавить элемент в массив, динамически размещаемый, но OP на самом деле означает std :: vector. Ниже разделителя мой оригинальный ответ.

std::vector<int> v;
v.push_back( 5 ); // 5 is added to the back of v.

Вы всегда можете использовать C realloc и free. РЕДАКТИРОВАТЬ: (Предполагая, что ваши объекты являются POD.)

Если сравнивать с требованием ручного размещения, копирования и перераспределения с использованием new и delete, то удивительно, что Страуструп не добавил ключевое слово, например renew.

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