элемент pop-push из std :: vector и повторное использование элементов - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть проект на C ++ 03, у которого есть проблема со структурой данных: я использую вектор вместо списка, даже если мне нужно постоянно pop_front-push_back.но сейчас это нормально, потому что сейчас мне нужно переписать слишком много кода.

Мой подход заключается в том, что буфер последней точки frame_size всегда обновляется.поэтому в каждом кадре мне нужно выскочить спереди и оттолкнуться.(возможно, есть название для этого подхода?)

, поэтому я использую этот код:

Point apoint;  // allocate new point
apoint.x = xx;
apoint.y = yy;

int size = points.size()
if (size > frame_size) {
    this->points.erase( points.begin() );  // pop_front
}
this->points.push_back(apoint);

У меня есть некоторый готовый код для пула объектов, и поэтому я подумал:это не очень хорошая оптимизация, но я могу хранить фронт в пуле, и поэтому я могу получить время выделения точки.

хорошо, это не так полезно, и, вероятно, это не имеет смысла, но я прошу только для образованиялюбопытство: как я могу это сделать?

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

.. потому что стирание не возвращает стертый вектор, оно возвращает:

Итератор произвольного доступа, указывающий на новое местоположение элемента, который следовал за последнимэлемент, стертый при вызове функции, то есть конец вектора, если операция стерла последний элемент в последовательности.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

у меня есть готовый код для пула объектов ... как я могу это сделать?

Используя вектор, вы не можете.Вектор хранит свои элементы в непрерывном массиве, поэтому их нельзя размещать по одному, только в блоках произвольного размера.Следовательно, вы не можете использовать пул объектов в качестве распределителя для std::vector.

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

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

Пока вы используете вектор, вы можетене перемещайте все элементы, когда вы стираете первый;если это слишком неэффективно, вместо этого используйте deque (или, возможно, list).

1 голос
/ 27 февраля 2012

Я не уверен, что понимаю, что вы хотите сделать, но это должно быть функционально эквивалентно тому, что вы написали, без создания временного Point экземпляра:

// don't do this on an empty vector
assert (points.size() > 0);

// rotate elements in the vector, erasing the first element
// and duplicating the last one
copy (points.begin()+1, points.end(), points.begin());

// overwrite the last element with your new data
points.back().x = xx;
points.back().y = yy;

РЕДАКТИРОВАТЬ: Как отметил Майк Сеймур в комментариях, ни это решение, ни подход, предложенный в вопросе, не вызывают какого-либо нового выделения памяти.

...