StructIntegerVector

{

int* m_pData;

intm_nUsed;

intm_nAllocated;

};

 

Следует отметить, что все переменные, входящие в состав структуры получили префикс “m_”, что означает членство (membership). Это не является обязательным требованием языка С++, а всего лишь рекомендуемой многими профессиональными программистами стилистической конвенцией. Такие идентификаторы легко отличить от других видов переменных благодаря префиксу, что повышает читабельность кода.

 

Типичные манипуляции со структурой-вектором следует выделить в отдельные функции с интуитивно понятным интерфейсом. Во-первых, необходима функция инициализации вектора, т.е., приведения его в начальное пригодное к использованию состояние:

 

voidIntegerVectorInit ( IntegerVector & _vector, int_allocatedSize = 10 )

{

_vector.m_pData = new int[ _allocatedSize ];

_vector.m_nAllocated = _allocatedSize;

_vector.m_nUsed = 0;

}

 

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

 

voidIntegerVectorDestroy ( IntegerVector & _vector )

{

delete[] _vector.m_pData;

}

 

В-третьих, необходима функция для добавления очередного числа в конец вектора, которая автоматически увеличивает размер вектора в случае необходимости:

 

voidIntegerVectorPushBack ( IntegerVector & _vector, int_data )

{

Закончилось ли место в векторе?

if( _vector.m_nUsed == _vector.m_nAllocated )

{

Выделяем новый блок, в 2 раза больше прежнего

intnAllocatedNew = _vector.m_nAllocated * 2;

int* pNewData = new int[ nAllocatedNew ];

Копируем данные из прежнего блока в новый

memcpy(

pNewData,

_vector.m_pData,

Sizeof( int) * _vector.m_nAllocated

);

// Освобождаем старый блок и подменяем адрес на новый блок

delete[] _vector.m_pData;

_vector.m_pData = pNewData;

// Обновляем количество выделенных ячеек

_vector.m_nAllocated = nAllocatedNew;

}

// Записываем данное в очередную ячейку

_vector.m_pData[ _vector.m_nUsed++ ] = _data;

}

Аргументы функций получили префикс в виде символа “_”, что также является одной из популярных стилистических конвенций.

 

Имея под рукой такие вспомогательные функции, выделенные из предыдущей версии программы, преобразуем основную программу в простую и очень читабельную:

 

intmain ()

{

Приглашение пользователя ко вводу

std::cout << "Input integers, stop with Ctrl+Z: ";

// Создаем вектор и инициализируем его одним вызовом

IntegerVector v;

IntegerVectorInit( v );

Пытаемся вводить числа с консоли одно за другим

while( true)

{

Попытка ввода числа

inttemp;

std::cin >> temp;

if( std::cin )

Просто просим вектор добавить новое данное в конец

IntegerVectorPushBack( v, temp );

Else

// Конец ввода

break;

}








Дата добавления: 2016-01-29; просмотров: 498;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.