Struct IntegerVector

{

int * m_pData;

int m_nUsed;

int m_nAllocated;

};

 

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

 

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

 

void IntegerVectorInit ( IntegerVector & _vector, int _allocatedSize = 10 )

{

_vector.m_pData = new int[ _allocatedSize ];

_vector.m_nAllocated = _allocatedSize;

_vector.m_nUsed = 0;

}

 

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

 

void IntegerVectorDestroy ( IntegerVector & _vector )

{

delete[] _vector.m_pData;

}

 

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

 

void IntegerVectorPushBack ( IntegerVector & _vector, int _data )

{

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

if ( _vector.m_nUsed == _vector.m_nAllocated )

{

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

int nAllocatedNew = _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;

}

 

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

 

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

 

int main ()

{

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

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

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

IntegerVector v;

IntegerVectorInit( v );

 

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

while ( true )

{

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

int temp;

std::cin >> temp;

if ( std::cin )

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

IntegerVectorPushBack( v, temp );

Else

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

break;

}

 








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


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

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

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

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