Лучший способ извлечь подвектор из вектора? - PullRequest
246 голосов
/ 07 января 2009

Предположим, у меня есть std::vector (назовем это myVec) размера N. Какой самый простой способ построить новый вектор, состоящий из копии элементов от X до Y, где 0 <= X <= Y <= N-1? Например, от <code>myVec [100000] до myVec [100999] в векторе размером 150000.

Если это невозможно сделать эффективно с вектором, есть ли другой тип данных STL, который я должен использовать вместо этого?

Ответы [ 14 ]

0 голосов
/ 29 июня 2018

Еще один вариант: Полезно, например, при перемещении между thrust::device_vector и thrust::host_vector, когда нельзя использовать конструктор.

std::vector<T> newVector;
newVector.reserve(1000);
std::copy_n(&vec[100000], 1000, std::back_inserter(newVector));

Также должна быть сложность O (N)

Вы можете комбинировать это с верхним кодом ответа

vector<T>::const_iterator first = myVec.begin() + 100000;
vector<T>::const_iterator last = myVec.begin() + 101000;
std::copy(first, last, std::back_inserter(newVector));
0 голосов
/ 24 июня 2018

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

vector<pair<int, int> > v(n);

//we want half of elements in vector a and another half in vector b
vector<pair<lli, lli> > a(v.begin(),v.begin()+n/2);
vector<pair<lli, lli> > b(v.begin()+n/2, v.end());


//if v = [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
//then a = [(1, 2), (2, 3)]
//and b = [(3, 4), (4, 5), (5, 6)]

//if v = [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)]
//then a = [(1, 2), (2, 3), (3, 4)]
//and b = [(4, 5), (5, 6), (6, 7)]


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

vector<pair<int, int> > a(v.begin()+10, v.begin+16);

и если вы хотите, чтобы элементы от индекса 10 до некоторого индекса от конца, то в этом случае

vector<pair<int, int> > a(v.begin()+10, v.end()-5);

надеюсь, это поможет, просто запомните в последнем случае v.end()-5 > v.begin()+10

0 голосов
/ 27 апреля 2017

Может быть, array_view / span в библиотеке GSL - хороший вариант.

Вот также реализация одного файла: array_view .

0 голосов
/ 19 ноября 2013

Опоздание только для других ... Бьюсь об заклад, первый кодер уже сделан. Для простых типов данных копирование не требуется, просто вернитесь к старым добрым методам кода C.

std::vector <int>   myVec;
int *p;
// Add some data here and set start, then
p=myVec.data()+start;

Затем передайте указатель p и len всему, что нуждается в подвекторе.

notelen должно быть !! len < myVec.size()-start

...