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;