Какой конструктор из std :: vector используется в этом случае - PullRequest
7 голосов
/ 13 марта 2010

Это выглядит просто, но я запутался: способ, которым я создаю вектор из ста, скажем, int s, равен

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

Однако, глядя на документацию std :: vector Я вижу, что его конструктор имеет форму

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);

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

Ответы [ 3 ]

14 голосов
/ 13 марта 2010

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

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.
}
6 голосов
/ 13 марта 2010

Чтобы (возможно) уточнить:

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

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

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

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

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

0 голосов
/ 13 марта 2010

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

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

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

...