Qual é a maneira mais simples de converter array em vetor?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
Eu quero converter x de matriz int em vetor de maneira mais simples.
Qual é a maneira mais simples de converter array em vetor?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
Eu quero converter x de matriz int em vetor de maneira mais simples.
Respostas:
Use o vector
construtor que leva dois iteradores, observe que os ponteiros são iteradores válidos e use a conversão implícita de matrizes em ponteiros:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);
ou
test(std::vector<int>(x, x + sizeof x / sizeof x[0]));
onde sizeof x / sizeof x[0]
está obviamente 3
neste contexto; é a maneira genérica de obter o número de elementos em uma matriz. Observe que x + sizeof x / sizeof x[0]
aponta um elemento além do último elemento.
sizeof x / sizeof x[0] == std::extent<decltype(x)>::value
Pessoalmente, gosto bastante da abordagem C ++ 2011 porque não requer que você use sizeof()
nem se lembre de ajustar os limites do array se você alterar os limites do array (e você pode definir a função relevante no C ++ 2003 se quiser também ):
#include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));
Obviamente, com C ++ 2011 você pode querer usar listas de inicializadores de qualquer maneira:
std::vector<int> v({ 1, 2, 3, 4, 5 });
std::vector<T>
sempre possui os T
objetos. Isso tem duas implicações: ao inserir um objeto em um vetor, eles são copiados e colocados na memória. Para objetos razoavelmente pequenos, por exemplo, sequências de strings curtas, a colocação é um grande ganho de desempenho. Se seus objetos são grandes e caros para copiar, você pode querer armazenar ponteiros [de alguma forma gerenciados por recursos] para os objetos. Qual abordagem é mais eficiente depende dos objetos, mas você tem a escolha.
Os ponteiros podem ser usados como qualquer outro iterador:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
const size_t X_SIZE = 3;
para denotar o tamanho do array ou calculá-lo a partir de sizeof. Omiti essa parte por uma questão de legibilidade.
Você está fazendo a pergunta errada aqui - em vez de forçar tudo em um vetor, pergunte como você pode converter teste em trabalho com iteradores em vez de um contêiner específico. Você também pode fornecer uma sobrecarga para manter a compatibilidade (e lidar com outros contêineres ao mesmo tempo gratuitamente):
void test(const std::vector<int>& in) {
// Iterate over vector and do whatever
}
torna-se:
template <typename Iterator>
void test(Iterator begin, const Iterator end) {
// Iterate over range and do whatever
}
template <typename Container>
void test(const Container& in) {
test(std::begin(in), std::end(in));
}
O que permite que você:
int x[3]={1, 2, 3};
test(x); // Now correct
Uma maneira simples pode ser o uso de uma assign()
função pré-definida na vector
aula.
por exemplo
array[5]={1,2,3,4,5};
vector<int> v;
v.assign(array, array+5); // 5 is size of array.
vector<int> a(5,10);
significamake room for 5
int` e inicializo-os com 10. Mas como o seu x, x + ... funciona? você pode explicar?