Как правильно скопировать заданный диапазон вектора в другой вектор, используя std :: copy? - PullRequest
1 голос
/ 27 марта 2019

Я нашел несколько страниц о перемещении диапазона векторов к другому вектору, однако я изо всех сил стараюсь заставить его работать.

Я бы хотел переместить элементы с sourceVect на destVect, а элементы с sourceVect[1] до sourceVect[1+numToCopy] были бы перемещены в начало sourceVect. Я попытался сделать это следующим образом:

vector<int> destVect;
vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
int numToCopy = 7;

vector<int>::iterator itSource = sourceVect.begin();
vector<int>::iterator itSourceEnd = sourceVect.begin();
advance(itSource, 1);
advance(itSourceEnd, 1+numToCopy);

std::copy(itSource, itSourceEnd, destVect.begin());             //copy(first,last,output vector ite)


for (vector<int>::iterator it = destVect.begin(); it != destVect.end(); ++it)
    cout << ' ' << *it;

Но я получаю Отладочное Сбой Утверждения, векторный итератор + смещение вне диапазона в Visual Studio. Обратите внимание, что я пробую это только в Visual Studio 2015, в конце он должен быть реализован на C ++ 98 для mbed, то есть, например, я не могу использовать std::next.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

vector::iterator всегда поддерживает +, вам не нужно next или advance.Самым простым способом является инициализация с помощью пары итераторов.

 std::vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
 std::vector<int>::iterator first = sourceVect.begin() + 1;
 std::vector<int>::iterator last = first + numToCopy;
 std::vector<int> destVect(first, last); // contains 2,3,4,5,6,7,8

Если вы не можете избежать задержки объявления destVect до точки, где у вас есть соответствующий инициализатор, вы можете использовать assign

 destVect.assign(first, last); // contains 2,3,4,5,6,7,8 overwriting whatever was there before
1 голос
/ 27 марта 2019

std::copy() не будет создавать новые элементы в контейнере назначения.Это означает, что вам нужно создать destVect с правильным размером:

vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
vector<int> destVect(sourceVect.size() - 1);

Если вы не можете создать его с правильным размером, просто измените его размер позже, в точке, где вы знаете размер:

destVect.resize(sourceVect.size() - 1);

Теперь вы можете скопировать:

copy(sourceVect.begin() + 1, sourceVect.end(), destVect.begin());

Однако вы можете просто создать destVect с правильным содержимым для начала.Вам не нужно ничего копировать вручную:

vector<int> sourceVect = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
vector<int> destVect(sourceVect.begin() + 1, sourceVect.end());

Это самый быстрый способ сделать это и (что еще важнее) не подвержен ошибкам.Если вы делаете std::copy, но размер контейнера назначения не достаточно велик, вы в конечном итоге записываете в нераспределенную память (переполнение буфера.)

...