Puedo crear una matriz e inicializarla así:
int a[] = {10, 20, 30};
¿Cómo creo un std::vector
e inicializo un estilo igualmente elegante?
La mejor manera que sé es:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
¿Hay una mejor manera?
c++
vector
stl
initialization
Agnel Kurian
fuente
fuente
tr1::array
es útil porque las matrices ordinarias no proporcionan la interfaz de los contenedores STLRespuestas:
Un método sería usar la matriz para inicializar el vector
fuente
static
oconst
, sin embargo, ambos lo hacen más explícito sobre cómo debe usarse y permiten que el compilador realice optimizaciones adicionales.Si su compilador admite C ++ 11, simplemente puede hacer:
Está disponible en GCC a partir de la versión 4.4 . Desafortunadamente, VC ++ 2010 parece estar rezagado a este respecto.
Alternativamente, la biblioteca Boost.Assign usa magia no macro para permitir lo siguiente:
O:
Pero tenga en cuenta que esto tiene algo de sobrecarga (básicamente,
list_of
construye unstd::deque
bajo el capó), por lo que para un código crítico de rendimiento sería mejor que haga como dice Yacoby.fuente
this->vect = {};
:?std::vector<T> vector;
std::vector<int> v = {1, 2, 3, 4};
, los vectoresinitializer list constructor
se llamarán para este tipo de inicialización, su documento se puede encontrar en laC++ 11
sección .Si puede, use el moderno C ++ [11,14,17, ...]:
La antigua forma de bucle sobre una matriz de longitud variable o uso
sizeof()
es realmente terrible a los ojos y completamente innecesaria en términos de sobrecarga mental. Yuckfuente
En C ++ 0x podrá hacerlo de la misma manera que lo hizo con una matriz, pero no en el estándar actual.
Con solo soporte de idiomas puede usar:
Si puede agregar otras bibliotecas, puede intentar aumentar :: asignación:
Para evitar codificar el tamaño de una matriz:
fuente
int another[size_of_array(array)]
, mientras que puedes hacerint another[ARRAY_SIZE(array)]
.sizeof
expresión que no necesita una definición. Si bien puede proporcionar una definición, hacerlo correctamente requeriría la asignación estática de una matriz y devolverle una referencia, y la siguiente pregunta sería ¿qué tendría sentido como valores para la matriz? (¡Tenga en cuenta también que esto significa una combinación de matriz por tipo / tamaño de las instancias de la función!) Dado que no es un uso razonable para ella, prefiero evitarla.En C ++ 11:
Usando boost list_of:
Usando la asignación de impulso:
STL convencional:
STL convencional con macros genéricos:
STL convencional con una macro de inicializador de vector:
fuente
std::begin
ystd::end
para array, por lo que un vector también se puede inicializar comostatic const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));
.Solo pensé en tirar mis $ 0.02. Tiendo a declarar esto:
en un encabezado de utilidad en algún lugar y luego todo lo que se requiere es:
Pero no puedo esperar a C ++ 0x. Estoy atascado porque mi código también debe compilarse en Visual Studio. Abucheo.
fuente
const T (&data)[N]
parte? ¿Cómo se deduce el tamaño de la matriz en su llamadamakeVector(values)
?Antes de C ++ 11:
Método 1 =>
Método 2 =>
C ++ 11 en adelante a continuación también es posible
fuente
Empezando con:
Si no tiene un compilador de C ++ 11 y no desea usar boost:
Si no tiene un compilador de C ++ 11 y puede usar boost:
Si tienes un compilador de C ++ 11:
fuente
Para la inicialización del vector:
se puede hacer si tienes el compilador de c ++ 11.
De lo contrario, puede tener una matriz de datos y luego usar un bucle for.
Además de estos, hay varias otras formas descritas anteriormente utilizando algún código. En mi opinión, estas formas son fáciles de recordar y rápidas de escribir.
fuente
La forma más fácil de hacerlo es:
fuente
Construyo mi propia solución usando
va_arg
. Esta solución es compatible con C ++ 98.Manifestación
fuente
Si su compilador admite macros Variadic (lo cual es cierto para la mayoría de los compiladores modernos), puede usar la siguiente macro para convertir la inicialización de vectores en una línea:
Con esta macro, puede definir un vector inicializado con un código como este:
Esto crearía un nuevo vector de entradas llamado my_vector con los elementos 1, 2, 3, 4.
fuente
Si no quieres usar boost, pero quieres disfrutar de sintaxis como
solo incluye este fragmento de código
fuente
((((v+=1),2),3),4),5)
así es como funciona: Primero,vector<T> += T
devuelve un vector_inserter, lo llamamosvi
que encapsula el vector original, luegovi,T
agrega T al vector original quevi
encapsula y lo devuelve a sí mismo para que podamosvi,T
volver a hacerlo .En C ++ 11:
fuente
vector<int> arr = {10, 20, 30};
.puedes hacerlo usando boost :: asignar.
detalle aquí
fuente
+=
Se agrega el valor 1,2,3,4 al final de los valores o se agrega 1 al primer elemento, 2 al segundo elemento, 3 al tercer elemento (como la sintaxis como esta debería en MATLAB- lenguajes similares)Una pregunta duplicada más reciente tiene esta respuesta de Viktor Sehr . Para mí, es compacto, visualmente atractivo (parece que está 'introduciendo' los valores), no requiere c ++ 11 o un módulo de terceros, y evita el uso de una variable adicional (escrita). A continuación se muestra cómo lo estoy usando con algunos cambios. Puedo cambiar a extender la función de vector y / o va_arg en el futuro intead.
fuente
Los siguientes métodos se pueden usar para inicializar el vector en 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);
y asívector<int>v = {1, 3, 5, 7};
El tercero solo está permitido en C ++ 11 en adelante.
fuente
Hay muchas buenas respuestas aquí, pero como llegué a mi propia pregunta antes de leer esto, pensé que arrojaría la mía aquí de todos modos ...
Aquí hay un método que estoy usando para esto que funcionará universalmente en compiladores y plataformas:
Cree una estructura o clase como contenedor para su colección de objetos. Defina una función de sobrecarga del operador para <<.
Puede crear funciones que tomen su estructura como parámetro, por ejemplo:
Entonces, puede llamar a esa función, así:
¡De esa manera, puede construir y pasar una colección de objetos de tamaño dinámico a una función en una sola línea limpia!
fuente
Si desea algo en el mismo orden general que Boost :: asignar sin crear una dependencia en Boost, lo siguiente es al menos vagamente similar:
Si bien deseo que la sintaxis para usarla sea más limpia, todavía no es particularmente horrible:
fuente
Para compilar el uso:
fuente
fuente
Si la matriz es:
fuente
Es bastante conveniente crear un vector en línea sin definir una variable al escribir una prueba, por ejemplo:
fuente
Relacionado, puede usar lo siguiente si desea tener un vector completamente listo para ir en una declaración rápida (por ejemplo, pasar inmediatamente a otra función):
función de ejemplo
ejemplo de uso
aunque tenga cuidado con el decltype, asegúrese de que el primer valor sea claramente el que desea.
fuente
Hay varias formas de codificar un vector, compartiré algunas formas:
fuente
"¿Cómo creo un vector STL e inicializo como el anterior? ¿Cuál es la mejor manera de hacerlo con el mínimo esfuerzo de escritura?"
La forma más fácil de inicializar un vector como ha inicializado su matriz incorporada es usar una lista de inicializador que se introdujo en C ++ 11 .
ivec tiene 3 elementos de tamaño después de ejecutar Asignación (declaración etiquetada).
fuente
B. Stroustrup describe una buena manera de encadenar operaciones en 16.2.10 Self Reference en la página 464 en la edición C ++ 11 del Prog. Lang. donde una función devuelve una referencia, aquí modificada a un vector. De esta manera puede encadenar,
v.pb(1).pb(2).pb(3);
pero puede ser demasiado trabajo para ganancias tan pequeñas.fuente
La forma más simple y ergonómica (con C ++ 11 o posterior):
fuente
En caso de que quieras tenerlo en tu propia clase:
fuente