2010-03-13 10 views
7

Esto parece simple, pero estoy confundido: A mi modo de crear un vector de cien, por ejemplo, int s esqué constructor de std :: vector se utiliza en este caso

std::vector<int> *pVect = new std::vector<int>(100); 

Sin embargo, mirando std: : vector de documentation veo que su constructor es de la forma

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

Entonces, ¿cómo el trabajo previo? ¿new llama al constructor con un valor de inicialización obtenido del constructor predeterminado? Si ese es el caso, ¿

std::vector<int, my_allocator> *pVect = new std::vector<int>(100, my_allocator); 

donde paso mi propio asignador, también funciona?

+0

Además, sería genial si puede sugerir un recurso en línea que cubra estos aspectos de 'new' y ctors. Gracias. – recipriversexclusion

+0

Lo siento, no puedo obtener lo que 'nuevo' tiene que ver con su pregunta. – AraK

+0

Básicamente, lo que me pregunto es: ¿no 'nuevo' simplemente llama al ctor? Pero en este caso, no hay ningún ctor en esa forma. – recipriversexclusion

Respuesta

14

Lo estás haciendo todo mal. Basta con crear como un objeto automática si todo lo que necesita es un vector en el ámbito actual y la hora

std::vector<int> pVect(100); 

El constructor tiene argumentos predeterminados para el segundo y tercer parámetros. Por lo tanto, se puede llamar con solo un int. Si desea pasar un asignador propia, tiene que pasar un segundo argumento ya que no puede omitela

std::vector<int, myalloc> pVect(100, 0, myalloc(some_params)); 

Un ejemplo específico podría aclarar el asunto

void f(int age, int height = 180, int weight = 85); 

int main() { 
    f(25); // age = 25, height and weight taken from defaults. 
    f(25, 90); // age=25, height = 90 (oops!). Won't pass a weight! 
    f(25, 180, 90); // the desired call. 
} 
+0

Mi pregunta es exacta: ¿Por qué se puede omitir el segundo argumento en el primer caso y no el segundo? ? ¿Por qué el controlador no maneja el segundo valor como lo hizo en el primer caso? – recipriversexclusion

+0

@recipriversexclusion: El segundo y el tercer parámetro tienen argumentos predeterminados para que pueda llamar al constructor con uno, dos, o tres argumentos. Si desea pasar un argumento al tercer parámetro, también debe pasar un argumento al segundo parámetro (¿de qué otro modo podría saber el compilador que quería decir "omita el segundo parámetro y dé este valor al tercero?"). –

+0

@recip porque no tomará decisiones arbitrarias por sí mismo. El paso de argumentos funciona al igualar las posiciones de argumentos y parámetros, no al equiparar sus tipos. Imagine que crea un vector de 'float' y que su asignador puede crearse mediante una int (conversión). Luego, en 'vector v (10, 5)' el compilador no puede decir "en lugar de pasar el 5 al segundo parámetro como valor predeterminado de los 10 elementos para crear, lo pasaré al tercer parámetro, convirtiéndolo en un asignador ". Eso simplemente no funcionaría. ¿Cómo podrías decir claramente tu deseo, entonces? –

6

Para (quizás) aclarar:

para crear un objeto vector llamado v de 100 elementos:

std::vector <int> v(100); 

este utiliza el constructor vector que lleva el tamaño (100) como el primer parámetro. Para crear un vector asignado dinámicamente de 100 elementos:

std::vector <int> * p = new std::vector<int>(100); 

que utiliza exactamente el mismo constructor.

+0

Gracias, mi publicación original estaba algo distorsionada, corregida ahora. Mi pregunta es: ¿cómo sé que se pueden omitir los otros terceros parámetros del constructor porque el vector ctor en realidad tiene tres parámetros? Y, ¿por qué está bien omitir los argumentos segundo y tercero (se usan los valores predeterminados) pero no solo el segundo? Gracias. – recipriversexclusion

+0

Estos parámetros PUEDEN omitirse debido a la "construcción de parámetros predeterminada": const T & value = T(), const Allocator & = Allocator() –

0

Está creando un vector de cien elementos. Como se puede ver en la segunda muestra de código que envió:

vector explícita (size_type n, const T & valor = T(), Allocator const = & Allocator());

Este constructor toma la cantidad de elementos para poner en vector y una value que se insertará en el vector n veces. Si no especifica un value, se construye un value usando el constructor predeterminado de su tipo de vector T. Aquí sería el constructor "predeterminado" de int que lo inicializa en 0 (no existe un constructor predeterminado de int; sin embargo, el estándar C++ dice que int se inicializa a 0 en tales casos).

Cuestiones relacionadas