2015-05-08 2 views
2

Я не могу понять преимущества или различия между конструкторами векторной копии и конструкторами диапазонов. Когда я построить три вектора, как это:C++ 11 векторный конструктор копия vs range?

vector<int> FirstVec(3, 911); //fill constructor 
    vector<int> SecondVec(FirstVec.begin(), FirstVec.end()); //range constructor 
    vector<int> ThirdVec(FirstVec); //copy constructor 

Содержимое SecondVec и ThirdVec точно так же. Существуют ли какие-либо сценарии, в которых использование одного из них имеет свои преимущества? Спасибо.

+4

В случае, если 'FirstVec' фактически не является« std :: vector », а каким-то другим типом контейнера, например,« std :: list », конструктор на основе итератора абсолютно необходим. –

+2

, когда необходимо скопировать поддиапазоны. – 911

ответ

12

Конструктор диапазона весьма полезен, если вы хотите скопировать элементы контейнера другого типа или не хотите копировать полный диапазон. Например

int a[] = {1,2,3,4,5}; 
std::set<int> s{3, 911}; 
std::vector<int> v0{1,2,3,4,5}; 

std::vector<int> v1(std::begin(a), std::end(a)); 
std::vector<int> v2(a+1, a+3); 
std::vector<int> v3(s.begin(), s.end()); 
vector<int> v4(v0.begin(), v0.begin() + 3); 
0

Я считаю, что распределитель копируется в одном случае, но не в другом.

В общем, если вы хотите сделать копию вектора, тогда вы должны скопировать вектор.

5

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

Конструктор копирования проще и потенциально более эффективным; но подходит только тогда, когда вы хотите скопировать весь вектор другого.

Так что используйте конструктор копирования, если вы хотите скопировать тот же контейнер, что и вы здесь; и конструктор диапазона для более общих диапазонов.

1

В дополнение к вышеприведенным ответам есть еще одно важное соображение, если вы заботитесь о последнем цикле процессора и байта кода.

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

С помощью спецификатора диапазона метод должен выполнять больше проверок и становится обобщенным. Как вы легко можете себе представить, конец диапазона может не совпадать с концом вектора источника.

Давайте предположим, что мы разрабатываем код библиотеки и посмотреть, что различия:

  • Dest. вектор и src. вектор будет иметь одинаковые размеры.
  • dest. распределение векторного хранилища - просто для _src.size.
    • Для копирования диапазона, это конец-начало + 1.
  • фактическое копирование данных проще тоже:
    • например, Представьте себе копию, основанную на циклах, от источника до места назначения.
    • вы начинаете с первого элемента источника и скопировать все.
    • цикл копирования заканчивается в конце исходного вектора, а не range.end.

Компилятор писатель, вероятно, придумать больше очков.

+0

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

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