Było tu wiele odpowiedzi i prawie wszystkie z nich wykonają swoją pracę.
Jest jednak kilka mylących rad!
Oto opcje:
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());
}
Krótko mówiąc, metoda 4, wykorzystująca vector :: insert, jest najlepsza w scenariuszu bsruth.
Oto kilka krwawych szczegółów:
Metoda 1 jest prawdopodobnie najłatwiejsza do zrozumienia. Po prostu skopiuj każdy element z tablicy i wepchnij go z tyłu wektora. Niestety, jest powolny. Ponieważ istnieje pętla (implikowana z funkcją kopiowania), każdy element musi być traktowany indywidualnie; nie można poprawić wydajności na podstawie faktu, że wiemy, że tablica i wektory są ciągłymi blokami.
Metoda 2 to sugerowana poprawa wydajności w stosunku do Metody 1; po prostu zarezerwuj rozmiar tablicy przed jej dodaniem. W przypadku dużych tablic może to pomóc. Jednak najlepszą radą tutaj jest, aby nigdy nie używać rezerwy, chyba że profilowanie sugeruje, że możesz być w stanie uzyskać poprawę (lub musisz upewnić się, że twoje iteratory nie zostaną unieważnione). Bjarne zgadza się . Nawiasem mówiąc, zauważyłem, że ta metoda działała najwolniej przez większość czasu, chociaż staram się kompleksowo wyjaśnić, dlaczego regularnie była znacznie wolniejsza niż metoda 1 ...
Metoda 3 to stara szkoła - rzuć trochę C na problem! Działa dobrze i szybko w przypadku typów POD. W tym przypadku konieczne jest wywołanie resize, ponieważ memcpy działa poza granicami wektora i nie ma sposobu, aby powiedzieć wektorowi, że jego rozmiar się zmienił. Oprócz tego, że jest to brzydkie rozwiązanie (kopiowanie bajtów!), Pamiętaj, że może to być używane tylko dla typów POD . Nigdy bym nie skorzystał z tego rozwiązania.
Metoda 4 to najlepszy sposób. To znaczy jest jasne, jest (zwykle) najszybsze i działa na dowolnych obiektach. Nie ma wad korzystania z tej metody w tej aplikacji.
Metoda 5 to ulepszenie metody 4 - skopiuj tablicę do wektora, a następnie dołącz ją. Dobra opcja - ogólnie szybka i przejrzysta.
Wreszcie wiesz, że możesz używać wektorów zamiast tablic, prawda? Nawet jeśli funkcja oczekuje tablic w stylu c, możesz użyć wektorów:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
Mam nadzieję, że to pomoże komuś tam!