использование operator[]
public:
list* H;
list* temp;
long MaxCount;
Array() {
MaxCount=10;
H = new list[MaxCount];
}
list& operator[] (int index) {
if (index==MaxCount) {
temp=H;
//delete[] H;
MaxCount+=3000;
H = new list[MaxCount];
H=temp;
}
return H[index];
}
};
//...
H=temp;
Ну так что ж вы делаете? Вы ведь, по сути, возвращаете указатель на старое место, а нововыделенная память просто теряется. Вам нужно запомнить старое содержимое H (не указатель на него, а сам список), потом выделить память, а потом скопировать в начало новой памяти то, что вы запомнили раньше.
Еще момент: цифра 3000, я так понимаю, взялась от фонаря. Вам нужно гарантировать, что при _любых_ обстоятельствах (даже если вы напишете arrayInstance[100000]) вы не выйдете за границу диапазона. Иначе теряется смысл того, что вы делаете.
Давай проанализируем, что нужно сделать, чтобы сделать так как сказал ты. Если я где-то не прав, можешь меня поправить.
Порядок действий:
1. Выделить память для резервного храненения содержимого списка(запасной список).
2. Скопировать содержимое из старого списка в запасной список.
3. Выделить память большего размера для нового списка.
4. Скопировать из старого(резервного) списка в новый.
Перечисляю все это даже без операций delete[]. Повторю вопрос: целесообразно ли по времени так делать или проще выделить сразу ОЧЕНЬ МНОГО памяти?
Порядок действий:
1. Выделить память для резервного храненения содержимого списка(запасной список).
2. Скопировать содержимое из старого списка в запасной список.
3. Выделить память большего размера для нового списка.
4. Скопировать из старого(резервного) списка в новый.
Перечисляю все это даже без операций delete[]. Повторю вопрос: целесообразно ли по времени так делать или проще выделить сразу ОЧЕНЬ МНОГО памяти?
Неправильно.
1. Выделить память большего размера под новый список с указателем temp
2. Скопировать содержимое старого списка в новый (а не указатель как у тебя в примере) (memcpy например из указателя H в указатель temp)
3. Удалить старый список (указатель H)
4. Присвоить указателю H новое значение (H=temp)
Основной минус такого подхода: при выделении памяти большего размера старая ещё используется, поэтому необходимо в 2 раза больше памяти свободной.
Варианты решения:
1. Использовать готовые классы списков (из тогоже stl например) и не париться по этому поводу.
2. Сделать массив указателей списков list**, с фиксированным количеством элементов, так при обращении к элементу N возвращаем референс на list[N/фиксированное_число][N%фиксированное_число]
Ну и ещё один недочёт в твоём примере - ты выделяешь доп. память только при обращении к первому элементу за границами массива, а если обратиться к например 10-му (list[MaxCount+9]) у тебя вернёт полную хрень и не выделит память.
Целесообразнее всего при каждом выходе за границы диапазона выделять настолько много новой памяти, чтобы в следующий раз выйти за границы не скоро. Конечно, проще действительно выделить сразу "ОЧЕНЬ МНОГО", но это некрасивое решение.