Для C ++, используя std :: vector
Нет смысла использовать C-массив. Std :: vector имеет (почти) ту же производительность, что и массив C, и он будет:
- расти по мере необходимости
- знаю его размер
- убедитесь, что вы действительно обращаетесь к нужной памяти (т. Е. Она может выдать исключение, если вы выйдете за ее пределы)
И это даже не касается универсального алгоритма, связанного с std :: vector.
Теперь, используя C
Вы можете написать это несколько лучше, по крайней мере, двумя способами. Во-первых, заменив определение истинной константной переменной:
// #define MAXPLAYERS 4
const unsigned int MAXPLAYERS = 4 ;
int playerscores[MAXPLAYERS];
for(i=0;i<MAXPLAYERS;++i)
{
.... do something with each player
}
Использование истинной переменной предложит вам несколько большую безопасность типов и не будет загрязнять глобальную область видимости. Чтобы минимизировать зависимости, вы даже можете объявить переменные в заголовке и определить их в источнике:
/* header.h */
extern const unsigned int MAXPLAYERS ;
extern int playerscores[] ;
/* source.c */
const unsigned int MAXPLAYERS = 4
int playerscores[MAXPLAYERS];
/* another_source.c */
#include "header.h"
for(i=0;i<MAXPLAYERS;++i)
{
.... do something with each player
}
Таким образом, вы сможете изменить размер массива в одном источнике, без необходимости перекомпиляции всех источников, использующих его. Недостатком является то, что MAXPLAYERS больше не известен во время компиляции (но разве это недостаток?)
Обратите внимание, что ваш второй тип массива не может расти динамически. Sizeof (по крайней мере в C ++) оценивается во время компиляции. Для растущих массивов malloc / realloc / free - это путь в C, а std :: vector (или любой другой универсальный контейнер STL) - это путь в C ++.