Здесь было много ответов, и почти все из них выполнят свою работу.
Однако есть один вводящий в заблуждение совет!
Вот варианты:
vector<int> dataVec;
int dataArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
unsigned dataArraySize = sizeof(dataArray) / sizeof(int);
// Method 1: Copy the array to the vector using back_inserter.
{
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 2: Same as 1 but pre-extend the vector by the size of the array using reserve
{
dataVec.reserve(dataVec.size() + dataArraySize);
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
}
// Method 3: Memcpy
{
dataVec.resize(dataVec.size() + dataArraySize);
memcpy(&dataVec[dataVec.size() - dataArraySize], &dataArray[0], dataArraySize * sizeof(int));
}
// Method 4: vector::insert
{
dataVec.insert(dataVec.end(), &dataArray[0], &dataArray[dataArraySize]);
}
// Method 5: vector + vector
{
vector<int> dataVec2(&dataArray[0], &dataArray[dataArraySize]);
dataVec.insert(dataVec.end(), dataVec2.begin(), dataVec2.end());
}
Короче говоря, метод 4, использующий vector :: insert, является лучшим для сценария bsruth.
Вот некоторые кровавые подробности:
Метод 1 , вероятно, самый простой для понимания. Просто скопируйте каждый элемент из массива и вставьте его в конец вектора. Увы, это медленно. Поскольку есть цикл (подразумевается функцией копирования), каждый элемент должен обрабатываться индивидуально; улучшения производительности невозможны, поскольку мы знаем, что массив и векторы являются смежными блоками.
Метод 2 является предложенным улучшением производительности по методу 1; просто предварительно зарезервируйте размер массива перед его добавлением. Для больших массивов это может помочь. Однако лучший совет здесь - никогда не использовать резерв, если профилирование не предполагает, что вы можете добиться улучшения (или вам нужно убедиться, что ваши итераторы не будут признаны недействительными). Бьярне соглашается . Кстати, я обнаружил, что этот метод выполнял самый медленный большую часть времени, хотя я изо всех сил пытаюсь всесторонне объяснить, почему он регулярно значительно медленнее, чем метод 1 ...
Метод 3 - это старое школьное решение - бросьте немного C в проблему! Работает нормально и быстро для типов POD. В этом случае необходимо вызывать изменение размера, так как memcpy работает за пределами вектора, и нет никакого способа сообщить вектору, что его размер изменился. Помимо того, что это уродливое решение (байтовое копирование!), Помните, что это может использоваться только для типов POD . Я бы никогда не использовал это решение.
Метод 4 - лучший путь. Смысл понятен, он (обычно) самый быстрый и работает для любых объектов. Нет недостатка в использовании этого метода для этого приложения.
Метод 5 - это настройка метода 4 - скопируйте массив в вектор, а затем добавьте его. Хороший вариант - как правило, быстрый и понятный.
Наконец, вы знаете, что вы можете использовать векторы вместо массивов, верно? Даже когда функция ожидает массивы в стиле c, вы можете использовать векторы:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
Надеюсь, это поможет кому-то там!