2012-02-27 2 views
0

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

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

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

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

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

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

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

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

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

+2

Если вы постоянно 'pop_front' и не хотите использовать' list', то почему бы не 'std :: deque'? –

+0

проблема в том, что у меня есть много утилит, которые используют std :: vector, поэтому мне нужно открыть репозиторий утилиты, вилки и шаблона (или переписать) все, что принимает вектор, чтобы сделать его пригодным для списка или deque – nkint

+0

Является ли создание Точка тяжеловесным? Вы храните объекты, а не указатели на объекты в векторе. Если вы хотите сохранить объекты в пуле, рекомендуется сохранить их как указатели, а не объекты. – Jagannath

ответ

2

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

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

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

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

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

1

Я не уверен, чтобы понять, что вы хотите сделать, но это должно быть functionnally эквивалентно тому, что вы написали, без построения временного 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; 

EDIT: Как Майк Сеймур отметил в комментариях, ни это решение, ни подход, предложенный в вопросе, не вызывают никакого нового распределения памяти.

+0

Последние 2 утверждения должны находиться внутри условия if? – Jagannath

+0

Просто удалите условие if и вам нужно будет хотеть @nkint хочет. – Jagannath

+0

@ Jagannath в обоих направлениях должен быть эквивалентным, но вы правы: ваш более элегантный и компактный. – Francesco

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

  • Нет связанных вопросов^_^