Houve muitas respostas aqui e quase todas elas farão o trabalho.
No entanto, existem alguns conselhos enganosos!
Aqui estão as opções:
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());
}
Para encurtar a história, o Método 4, usando vector :: insert, é o melhor para o cenário de bsruth.
Aqui estão alguns detalhes sangrentos:
Método 1 é provavelmente o mais fácil de entender. Basta copiar cada elemento da matriz e colocá-lo na parte de trás do vetor. Infelizmente, é lento. Como há um loop (implícito na função de cópia), cada elemento deve ser tratado individualmente; nenhuma melhoria de desempenho pode ser feita com base no fato de que sabemos que a matriz e os vetores são blocos contíguos.
O Método 2 é uma sugestão de melhoria de desempenho para o Método 1; apenas pré-reserve o tamanho do array antes de adicioná-lo. Para matrizes grandes, isso pode ajudar. No entanto, o melhor conselho aqui é nunca usar reserva, a menos que a criação de perfil sugira que você possa obter uma melhoria (ou você precisa garantir que seus iteradores não sejam invalidados). Bjarne concorda . A propósito, descobri que esse método tinha desempenho mais lento na maioria das vezes, embora eu esteja lutando para explicar de forma abrangente por que era regularmente significativamente mais lento do que o método 1 ...
O método 3 é a solução da velha escola - jogue um pouco de C no problema! Funciona bem e rápido para tipos de POD. Nesse caso, resize deve ser chamado, pois memcpy funciona fora dos limites do vetor e não há como dizer a um vetor que seu tamanho mudou. Além de ser uma solução feia (cópia de bytes!), Lembre-se de que isso só pode ser usado para tipos POD . Eu nunca usaria essa solução.
O Método 4 é o melhor caminho a seguir. O significado é claro, é (geralmente) o mais rápido e funciona para qualquer objeto. Não há nenhuma desvantagem em usar este método para esta aplicação.
O Método 5 é um ajuste no Método 4 - copie a matriz em um vetor e, em seguida, anexe-a. Boa opção - geralmente rápido e claro.
Finalmente, você está ciente de que pode usar vetores no lugar de matrizes, certo? Mesmo quando uma função espera matrizes de estilo c, você pode usar vetores:
vector<char> v(50); // Ensure there's enough space
strcpy(&v[0], "prefer vectors to c arrays");
Espero que ajude alguém por aí!