Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2017, 16:36   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Очистка кастомного вектора

Мне нужно реализовать класс вектора и сейчас я работаю над функцией очистки вектора, но мне непонятно, каким должен стать вектор после вызова этой функции. Ясно, что в нем не должно остаться элементов. А что происходит с массивом элементов при очистке? Каким образом элементы очищаются?

Все, до чего я додумался, это:
1. Заполнить массив какими-то пустыми элементами
2. Удалить массив, но запомнить его размер и создать новый массив.

Как правильно сделать очистку?
Aoizora вне форума Ответить с цитированием
Старый 17.05.2017, 16:46   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Каким образом элементы очищаются?
Вызовом деструкторов, как всегда.

Цитата:
Заполнить массив какими-то пустыми элементами
Зачем?

Цитата:
Удалить массив, но запомнить его размер и создать новый массив.
Зачем?
p51x вне форума Ответить с цитированием
Старый 17.05.2017, 17:08   #3
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

>Вызовом деструкторов, как всегда.

То есть в цикле делать как-то так: elements[i].~TData()?
А если вектор состоит из int?
Aoizora вне форума Ответить с цитированием
Старый 17.05.2017, 17:27   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

С++ Standard 12.4 p16
Цитата:
16 [ Note: the notation for explicit call of a destructor can be used for any scalar type name (5.2.4). Allowing
this makes it possible to write code without having to know if a destructor exists for a given type. For
example,
typedef int I;
I* p;
p->I::~I();
— end note ]
p51x вне форума Ответить с цитированием
Старый 17.05.2017, 17:36   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Если класс основан на массиве, то в конце(в деструкторе класса) делаешь просто вот так и все:
Код:
delete[] Massiv
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 17.05.2017, 17:49   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Cuprum5, точно для любого массива прокатит? Точно вызовутся деструкторы всех элементов, а не только самого массива? Точно не будет замедления, если каждый раз пересоздавать?
p51x вне форума Ответить с цитированием
Старый 17.05.2017, 18:16   #7
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
Ясно, что в нем не должно остаться элементов. А что происходит с массивом элементов при очистке? Каким образом элементы очищаются?
Общий:
Код:
void vector::clear() noexcept
{
   while(!empty())
   {
      pop_back();
   }
}

Последний раз редактировалось Croessmah; 17.05.2017 в 18:19.
Croessmah вне форума Ответить с цитированием
Старый 18.05.2017, 08:49   #8
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Cuprum5, точно для любого массива прокатит?
- ясно-понятно, что только для одномерного, для двухмерного надо удалять так:
Код:
int z;
for(z = 0; z < n; z++)
    delete[] Massiv[z];
delete[] Massiv;
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 18.05.2017, 08:52   #9
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 735
По умолчанию

И кстати, этот способ должен использоваться только если Вы создали масси в при помощи оператора new. Если же Вы создали массив при помощи оператора malloc(), то удалять нужно free().
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 18.05.2017, 11:19   #10
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Переставайте путать операторы с функциями и new-expression с operator new,
а то загадите человеку мозг заведомо ложными данными.
Croessmah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi посчитать длину вектора по всем известной формуле (корень из суммы квадратов координат вектора) anna77777 Помощь студентам 2 06.01.2017 03:13
за максимальным элементом вектора С вставить максимальный элемент вектора А, иначе удалить все отрицательные элементы DIbmKa Паскаль, Turbo Pascal, PascalABC.NET 0 12.12.2016 20:09
Не отображается контент из кастомного ScrollViewer Joose WPF, UWP, WinRT, XAML 0 09.07.2015 21:44
Даны два вектора b=(b1,b2,...,b6),x=(x1,x2,...,x6) и матрица А(6х6).написать программу вычисления длины вектора Ax-b. infern_o Паскаль, Turbo Pascal, PascalABC.NET 10 21.03.2013 10:50
дано 3 вектора. определить максимальный чётный элемент каждого вектора и упорядочить по убыванию 3Doleg Паскаль, Turbo Pascal, PascalABC.NET 0 04.12.2012 01:45