Здесь было много ответов, и почти все из них выполнят свою работу.
Однако есть несколько вводящих в заблуждение советов!
Вот варианты:
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");
Надеюсь, это поможет кому-то там!