2012-02-11 2 views
-1

Как добавить элемент в конец массива динамически на C++?Добавление элемента в массив объектов в 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 должен иметь аргумент, но какой аргумент?

+7

«Однако векторы, похоже, не хотят обрабатывать массив объектов»? Не могли бы вы прояснить это, возможно, на примере того, где вы пытались это сделать, и что пошло не так? – Johnsyweb

+1

Можете ли вы объяснить, почему «векторы, похоже, не хотят обрабатывать массив объектов»? –

+3

'Векторы, похоже, не хотят обрабатывать массив объектов. Давайте сосредоточимся на этом. Это ваш реальный вопрос. Давайте выясним, что это означает, прежде чем перейти к выводу, что вам нужно переключиться на технологию, которая не предназначена для того, чтобы делать то, что вы хотите, от технологии, которая явно есть. –

ответ

1

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

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

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

добавить конструктор для установки я (просто чтобы дать ваш пример реального мира сенсорный) в вашем примере 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 
+1

Все контейнеры STL способны расти. –

+1

@NicolBolas не 'std :: array' :) –

+0

@ Никола: Я уточнил свою мысль. –

-2

EDIT: Вопрос заключается в том, как добавить элемент в массив, динамически распределенный, но OP фактически означает std :: vector. Под разделителем мой оригинальный ответ.

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

Вы всегда можете использовать Кассиопеян realloc и free. EDIT: (. Предполагая, что ваши объекты стручки)

По сравнению с требованием вручную, выделяя копирование и перераспределить с помощью new и delete, это удивительно Страуструп не добавить ключевое слово, как обновить.

+3

Не в C++, в общем. Это неопределенное поведение. –

+0

Не могли бы вы дать мне источник для этого? Я не нашел НИЧЕГО о том, что malloc является неопределенным поведением с google, и если это должно быть правдой, не будет ли #including библиотек C в вашем коде на C++ сломать его? Я даже помню, что читал, что имплантированию нового компилятора разрешено вызывать malloc. Кроме того, если вы правы, то C++ не обратно совместим с C, что было основным выбором дизайна. – SplinterOfChaos

+2

'realloc' проблематично, потому что вам не разрешено перемещать память объекта (предположим, что объект хранит указатель на один из его членов). Это прямое следствие 3.8 (1) (время жизни объекта). –

1

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

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

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

Смежные вопросы