new double [x] против вектора <double>(x), где целое число x задано пользователем - PullRequest
1 голос
/ 09 сентября 2011

Предположим, в коде я хочу, чтобы пользователь указал целое число (скажем, х), а затем выделил те много последовательных ячеек в памяти компьютера, на которых я выполняю какую-то обработку.

Мой вопрос: «лучше» выделить эту память как new double[x] или vector<double>(x).

Я знаю, что оба метода работают нормально (т.е. компилируются и запускаются, по крайней мере, в этом маленьком крошечном коде)

  int x; int* p;
  cout<<"Enter integer x:";cin>>x;
  vector<double> v(x);
  p=new double[x]

Если вы думаете, что ответ использует new, то возможно ли каким-то волшебным образом преобразовать память выделена через new в вектор? Потому что векторы дадут мне больше возможностей для манипулирования данными.

Ответы [ 3 ]

9 голосов
/ 09 сентября 2011

Лучше использовать vector всякий раз, когда вы можете, из-за множества преимуществ, которые он предоставляет (автоматическое управление памятью, проверка границ и т. Д.).

Кроме того, чтобы вектор резервировал для вас несколько элементов.чтобы использовать (т. е. выделять столько всего сразу в памяти вместо того, чтобы в конечном итоге изменять его размер при добавлении элементов), вы можете передать это число конструктору вектора:

int x;
cout<<"Enter integer x:";cin>>x;
vector<double> v(x);

Или, если вы ужесоздал вектор, используйте vector::resize:

// created v somewhere up here and we want to reuse it
int x;
cout << "Enter integer x: "; cin >> x;
v.resize(x);

И нет, нет никакого способа указать вектору использовать память, которую вы уже распределили, если вы не используете пользовательский распределитель [R.Мартиньо Фернандес, комментарии].

1 голос
/ 09 сентября 2011

Как уже упоминали другие, обычно всегда лучше использовать вектор.Однако, чтобы дать контрапункт, вот некоторые возможные ситуации, когда массив может быть лучше:

  • Память чрезвычайно ограничена (например, во встроенном программировании с простыми микроконтроллерами).Vector обычно резервирует больший массив, чем требуется для хранения своих элементов, а также имеет некоторые дополнительные ресурсы памяти для отслеживания таких вещей, как количество элементов в списке.
  • Вам необходимо взаимодействовать с кодом C, который не имеетпонимание векторного класса.В этом случае вам нужно будет скопировать данные из вектора в массив, передать массив в код C, а затем освободить массив, как только код C будет сделан с ним.
  • Вы знаете точныйколичество элементов в списке, и это число никогда не изменится.Даже в этом случае, вероятно, лучше использовать вектор.

Если вам нужно использовать массив, лучше всего разместить его в стеке, если это возможно.Например ...

char my_array[ 100 ]; // allocated on stack - better
char* my_array_2 = new char[ 100 ]; // allocated on heap - worse

Первый пример лучше, потому что память будет автоматически освобождена, как только ваш код покинет блок, в котором определен массив. Однако вы можете разместить в стеке только еслизаранее знать размер массива.Если размер может измениться во время выполнения, к сожалению, вы должны выделить его в куче.

int x = 20 + some_num;
char my_array[ x ];  // error - won't compile
0 голосов
/ 09 сентября 2011

Вы всегда должны предпочитать vector, а не new, потому что это избавляет вас от беспокойства об управлении памятью.Vector использует новое под обложками, но скрывает детали от вас.

Невозможно заставить вектор использовать буфер, который вы уже выделили с новым, и действительно нет причин пытаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...