2010-03-13 2 views
7

Это выглядит просто, но я смущен: Как я создать вектор сто, скажем, int s являетсяКакой конструктор станд :: вектор используется в этом случае

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

Однако, глядя на станд: : вектор documentation я вижу, что его конструктор имеет вида

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

Итак, как предыдущую одну работы? new вызывает конструктор с значением инициализации, полученным из конструктора по умолчанию? Если это так, будет

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

где я передаю свой распределитель, также работаю?

+0

Также было бы здорово, если бы вы предложили онлайн-ресурс, который охватывает эти аспекты 'new' и ctors. Благодарю. – recipriversexclusion

+0

Извините, я не могу получить, что «новый» имеет отношение к вашему вопросу. – AraK

+0

В принципе, мне интересно: не 'новый' просто позвонить в ctor? Но в этом случае в этой форме нет ctor. – recipriversexclusion

ответ

14

Вы делаете все это неправильно. Просто создайте его как автоматический объект, если все, что вам нужно, это вектор в текущей области видимости и время

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

Конструктор имеет аргументы по умолчанию для второго и третьего параметров. Таким образом, он может быть вызван только с int. Если вы хотите передать собственный аллокатора, вы должны пройти второй аргумент, так как вы не можете просто пропустить его

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

Выделенный пример может прояснить этот вопрос

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

Мой вопрос: почему вы можете пропустить второй аргумент в первом случае, а не второй ? Почему ctor не обрабатывает второе значение, как это было в первом случае? – recipriversexclusion

+0

@recipriversexclusion: Второй и третий параметры имеют аргументы по умолчанию, так что вы можете вызвать конструктор с одним, двумя, _or_ тремя аргументами. Если вы хотите передать аргумент третьему параметру, вам также нужно передать аргумент второму параметру (как еще компилятор знал бы, что вы имели в виду «пропустить второй параметр и передать это значение третьему?»). –

+0

@recip, потому что он не будет принимать произвольные решения самостоятельно. Пропускание аргументов работает, приравнивая позиции аргументов и параметров, а не приравнивая их типы. Представьте, что вы создаете вектор 'float' и что ваш распределитель может быть создан с помощью int (преобразования). Затем в 'vector v (10, 5)' компилятор не может просто сказать 'вместо того, чтобы передать 5 во второй параметр как значение по умолчанию для 10 элементов, которые нужно создать, я передам его третьего параметра, преобразуя его в распределитель ». Это просто не сработает. Как вы могли бы четко указать свое желание? –

6

Для того, чтобы (возможно) уточнить:

Чтобы создать вектор объект, называемый v 100 элементов:

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

это использует вектор конструктор, который принимает размер (100) в качестве первого параметра. Чтобы создать динамически выделенный вектор из 100 элементов:

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

, который использует точно такой же конструктор.

+0

Спасибо, мой оригинальный пост был немного искажен, исправил это сейчас. Мой вопрос: откуда я могу узнать, что другие третьи параметры конструктора могут быть пропущены, потому что вектор ctor фактически имеет три параметра? И почему это нормально, чтобы пропустить 2-й и 3-й аргументы (используются по умолчанию), но не только второй? Благодарю. – recipriversexclusion

+0

Эти параметры МОГУТ пропустить из-за «конфигурации параметров по умолчанию»: const T & value = T(), const Allocator & = Allocator() –

0

Вы создаете vector из ста элементов. Как видно во втором примере кода вы писали:

явный вектор (size_type п, константный Т & значение = Т(), Const Распределитель & = Распределитель());

Этот конструктор принимает количество элементов, чтобы положить в vector и value, который будет вставлен в вектор n раз. Если вы не указали value, то value построен с использованием конструктора по умолчанию вашего типа вектора T. Здесь он будет конструктором по умолчанию int, который инициализирует его 0 (нет такой вещи, как конструктор по умолчанию int, однако стандарт C++ говорит, что int в таких случаях инициализируется 0).

Смежные вопросы