2010-03-13 11 views
7

Wygląda to proste, ale jestem zdezorientowany: Sposób utworzyć wektor sto, powiedzmy, int s jestKtóry konstruktor std :: vector jest stosowany w tym przypadku

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

Jednak patrząc na std : vECTOR documentation widzę, że jego konstruktor ma postać

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

Tak, jak poprzedniej pracy? Czy new wywołuje konstruktor z wartością inicjalizacyjną uzyskaną z domyślnego konstruktora? Jeśli tak, to czy

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

gdzie przekazać mój własny przydział, również działać?

+0

Byłoby świetnie, gdybyś zaproponował zasób online obejmujący te aspekty "nowych" i lekarzy. Dzięki. – recipriversexclusion

+0

Niestety, nie mogę uzyskać tego, co "nowe" ma wspólnego z twoim pytaniem. – AraK

+0

Zasadniczo zastanawiam się: czy "nowe" nie nazywa po prostu ctor? Ale w tym przypadku nie ma ctor w tej formie. – recipriversexclusion

Odpowiedz

14

Robisz to wszystko źle. Wystarczy utworzyć go jako automatyczny obiektu, jeśli wszystko czego potrzebujesz to wektor w bieżącym zakresie i czas

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

Konstruktor ma domyślnych argumentów dla drugiego i trzeciego parametrów. Więc można go wywołać tylko z int. Jeśli chcesz przekazać własne przydzielania, trzeba przejść przez drugi argument, ponieważ nie można po prostu pominąć to

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

Dedykowany Przykładem może wyjaśnić sprawę

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

Moje pytanie: Dlaczego można pominąć drugi argument w pierwszym przypadku, a nie drugi ? Dlaczego ctor nie obsługuje drugiej wartości, tak jak w pierwszym przypadku? – recipriversexclusion

+0

@recipriversexclusion: Drugi i trzeci parametr mają domyślne argumenty, dzięki czemu można wywołać konstruktor za pomocą jednego, dwóch, _ lub trzech argumentów. Jeśli chcesz przekazać argument do trzeciego parametru, musisz również przekazać argument do drugiego parametru (jak inaczej kompilator wiedział, że masz na myśli "pomiń drugi parametr i podaj tę wartość trzeciemu?"). –

+0

@recip, ponieważ sam nie podejmie arbitralnych decyzji. Przesyłanie argumentów działa poprzez zrównanie pozycji argumentów i parametrów, a nie przez zrównanie ich typów. Wyobraź sobie, że tworzysz wektor 'float' i że twój alokator może być utworzony przez int (konwersję). Następnie w 'vector v (10, 5)' kompilator nie może po prostu powiedzieć "zamiast przekazywania 5 do drugiego parametru jako domyślnej wartości 10 elementów do utworzenia, przekażę to do trzeci parametr, konwersja do alokatora ". To po prostu nie zadziałałoby. Jak więc możesz jasno wyrazić swoje pragnienie? –

6

do (prawdopodobnie) wyjaśnienie:

celu utworzenia obiektu wektor nazwie V 100 elementów:

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

używa konstruktora wektor, które ma wielkość (100) pierwszego parametru. Aby utworzyć dynamicznie alokowany wektor 100 elementów:

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

który używa dokładnie tego samego konstruktora.

+0

Dzięki, mój oryginalny wpis był nieco zniekształcony, poprawiono to teraz. Moje pytanie brzmi: skąd mam wiedzieć, że pozostałe trzecie parametry konstruktora można pominąć, ponieważ wektor ctor faktycznie ma trzy parametry? I dlaczego można pominąć drugi i trzeci argument (używane są wartości domyślne), ale nie tylko drugi? Dzięki. – recipriversexclusion

+0

Te parametry MOGĄ być pomijane z powodu "domyślnego konstruktu parametru": const T & value = T(), const Allocator & = Allocator() –

0

Ty tworzysz vector stu elementów. Jak widać w drugiej próbce kod pisał:

wyraźny wektor (size_type n, const T & wartość = T() const Allocator & = Allocator());

Konstruktor wykonuje ilość elementów w celu wprowadzenia vector i value który zostanie wstawiony do wektora n razy. Jeśli nie podasz wartości value, zostanie utworzona value przy użyciu domyślnego konstruktora typu wektorowego T. Tutaj będzie to "domyślny" konstruktor z int, który zainicjuje go na 0 (nie ma czegoś takiego jak domyślny konstruktor z int, jednak standard C++ mówi, że w takich przypadkach int jest inicjowane na 0).

Powiązane problemy