Eu posso criar uma matriz e inicializá-la assim:
int a[] = {10, 20, 30};
Como crio std::vector
e inicializo de forma semelhante elegante?
A melhor maneira que eu sei é:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Existe uma maneira melhor?
c++
vector
stl
initialization
Agnel Kurian
fonte
fonte
tr1::array
é útil porque as matrizes comuns não fornecem a interface de recipientes STLRespostas:
Um método seria usar a matriz para inicializar o vetor
fonte
static
ouconst
, no entanto, ambos tornam mais explícitos como devem ser usados e permitem que o compilador faça otimizações adicionais.Se o seu compilador suportar C ++ 11, você pode simplesmente:
Está disponível no GCC a partir da versão 4.4 . Infelizmente, o VC ++ 2010 parece estar atrasado nesse aspecto.
Como alternativa, a biblioteca Boost.Assign usa magia não macro para permitir o seguinte:
Ou:
Mas lembre-se de que isso tem alguma sobrecarga (basicamente,
list_of
constrói umstd::deque
sob o capô); portanto, para um código crítico de desempenho, seria melhor fazer o que Yacoby diz.fonte
this->vect = {};
:?std::vector<T> vector;
std::vector<int> v = {1, 2, 3, 4};
, vetor doinitializer list constructor
será chamado para este tipo de inicialização, o seu doc pode ser encontrar naC++ 11
seção .Se você puder, use o modo C ++ [11,14,17, ...] moderno:
A velha maneira de fazer um loop em uma matriz de comprimento variável ou usar
sizeof()
é realmente terrível para os olhos e completamente desnecessária em termos de sobrecarga mental. Que nojo.fonte
No C ++ 0x, você poderá fazer da mesma maneira que fez com uma matriz, mas não no padrão atual.
Com apenas suporte ao idioma, você pode usar:
Se você pode adicionar outras bibliotecas, tente o boost :: assignment:
Para evitar codificar o tamanho de uma matriz:
fonte
int another[size_of_array(array)]
enquanto você pode fazerint another[ARRAY_SIZE(array)]
.sizeof
expressão que não precisa de uma definição. Embora você possa realmente fornecer uma definição, fazê-lo corretamente exigiria a alocação estática de uma matriz e retornaria uma referência a ela, e a próxima pergunta seria o que faria sentido como valores para a matriz? (Observe também que isso significa uma matriz por combinação de tipo / tamanho das instanciações da função!) Como o uso não é sensato, prefiro evitá-lo.No C ++ 11:
Usando boost list_of:
Usando o boost assign:
STL convencional:
STL convencional com macros genéricas:
STL convencional com uma macro de inicialização de vetor:
fonte
std::begin
estd::end
para array, para que um vetor também possa ser inicializadostatic const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));
.Só pensei em jogar meus $ 0,02. Costumo declarar isso:
em um cabeçalho de utilitário em algum lugar e, em seguida, tudo o que é necessário é:
Mas mal posso esperar pelo C ++ 0x. Estou preso porque meu código também deve ser compilado no Visual Studio. Vaia.
fonte
const T (&data)[N]
parte? Como é deduzido o tamanho da matriz na sua chamadamakeVector(values)
?Antes do C ++ 11:
Método 1 =>
Método 2 =>
C ++ 11 em diante também é possível
fonte
Começando com:
Se você não possui um compilador C ++ 11 e não deseja usar o boost:
Se você não possui um compilador C ++ 11 e pode usar o boost:
Se você possui um compilador C ++ 11:
fonte
Para inicialização de vetor -
Isso pode ser feito se você tiver o compilador c ++ 11.
Senão, você pode ter uma matriz de dados e usar um loop for.
Além disso, existem várias outras maneiras descritas acima usando algum código. Na minha opinião, essas maneiras são fáceis de lembrar e rápidas de escrever.
fonte
A maneira mais fácil de fazer isso é:
fonte
Eu construo minha própria solução usando
va_arg
. Esta solução é compatível com C ++ 98.Demo
fonte
Se o seu compilador suportar macros Variadic (o que é verdadeiro para a maioria dos compiladores modernos), você poderá usar a macro a seguir para transformar a inicialização de vetor em uma linha única:
Com essa macro, você pode definir um vetor inicializado com código como este:
Isso criaria um novo vetor de ints chamado my_vector com os elementos 1, 2, 3, 4.
fonte
Se você não deseja usar o impulso, mas deseja desfrutar de sintaxe como
basta incluir este pedaço de código
fonte
((((v+=1),2),3),4),5)
É assim que funciona: primeiro,vector<T> += T
retorna um vetor_inserter, vamos chamá-lovi
que encapsula o vetor original e depoisvi,T
adiciona T ao vetor original quevi
encapsula e retorna a si próprio para que possamos fazervi,T
novamente.No C ++ 11:
fonte
vector<int> arr = {10, 20, 30};
.você pode fazer isso usando boost :: assign.
detalhe aqui
fonte
+=
existe uma aderência a 1,2,3,4 .. no final dos valores ou adiciona 1 ao 1º elemento, 2 ao 2º elemento, 3 ao 3º elemento (como uma sintaxe como essa no MATLAB- como idiomas)Uma pergunta duplicada mais recente tem essa resposta de Viktor Sehr . Para mim, é compacto, visualmente atraente (parece que você está 'empurrando' os valores), não requer c ++ 11 ou um módulo de terceiros e evita o uso de uma variável extra (escrita). Abaixo está como eu o uso com algumas alterações. Eu posso mudar para estender a função de vetor e / ou va_arg no futuro.
fonte
Os métodos abaixo podem ser usados para inicializar o vetor em c ++.
int arr[] = {1, 3, 5, 6}; vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
vector<int>v; v.push_back(1); v.push_back(2); v.push_back(3);
e assim por diantevector<int>v = {1, 3, 5, 7};
O terceiro é permitido apenas no C ++ 11 em diante.
fonte
Há muitas respostas boas aqui, mas desde que cheguei sozinha antes de ler isso, achei que jogaria as minhas aqui de qualquer maneira ...
Aqui está um método que estou usando para isso que funcionará universalmente em compiladores e plataformas:
Crie uma estrutura ou classe como um contêiner para sua coleção de objetos. Defina uma função de sobrecarga do operador para <<.
Você pode criar funções que tomam sua estrutura como um parâmetro, por exemplo:
Em seguida, você pode chamar essa função, assim:
Dessa forma, você pode criar e transmitir uma coleção de objetos de tamanho dinâmico para uma função em uma única linha limpa!
fonte
Se você deseja algo na mesma ordem geral que o Boost :: assign sem criar uma dependência do Boost, o seguinte é pelo menos vagamente semelhante:
Embora eu deseje que a sintaxe para usá-lo seja mais limpa, ainda não é particularmente terrível:
fonte
Para compilar, use:
fonte
fonte
Se a matriz for:
fonte
É bastante conveniente criar um vetor embutido sem definir variável ao escrever teste, por exemplo:
fonte
Relacionado, você pode usar o seguinte se quiser ter um vetor completamente pronto para uma declaração rápida (por exemplo, passar imediatamente para outra função):
função de exemplo
exemplo de uso
embora tenha cuidado com o decltype, verifique se o primeiro valor é claramente o que você deseja.
fonte
Existem várias maneiras de codificar um vetor, compartilharei algumas maneiras:
fonte
"Como crio um vetor STL e o inicializo como acima? Qual é a melhor maneira de fazer isso com o mínimo esforço de digitação?"
A maneira mais fácil de inicializar um vetor quando você inicializou sua matriz interna é usando uma lista de inicializadores que foi introduzida no C ++ 11 .
ivec tem 3 elementos em tamanho após a execução de Assigning (instrução rotulada).
fonte
B. Stroustrup descreve uma boa maneira de encadear operações na 16.2.10 Selfreference na página 464 na edição C ++ 11 do Prog. Lang. onde uma função retorna uma referência, modificada aqui para um vetor. Dessa forma, você pode encadear como,
v.pb(1).pb(2).pb(3);
mas pode ser muito trabalhoso para ganhos tão pequenos.fonte
A maneira mais simples e ergonômica (com C ++ 11 ou posterior):
fonte
Caso você queira tê-lo em sua própria classe:
fonte