Первое размещение здесь, и это сводит меня с ума! Я не могу объяснить это очень хорошо, поэтому я попытаюсь привести пример.
Я пытаюсь получить элемент в очень большом (100 КБ) векторе, чтобы стереть его. Через итерации это займет целую вечность … поэтому я попробовал это:
Это небольшой пример моего списка. Который хранится в моем синглтоне.
vector<Particle> particles;
particles.reserve(100);
Это раздетая версия моей Частицы
class Particle
{
Particle:
~Particle:
void Delete
{
int listNum = (this - &particles[0]);
particles.erase(particles.begin+listNum);
}
};
Это работает отлично и все, но я не хочу сохранять каждую частицу в стеке, поэтому я хочу изменить это
vector<Particle> particles;
в
vector<Particle*> particles;
Теперь мой вопрос: возможно ли удалить и удалить частицу из списка, если вектор состоит из указателей частиц?
Я не уверен, что мне понятен мой вопрос, но я надеюсь, что вы поймете!
Или, если кто-то знает лучшее решение с точки зрения производительности, я бы хотел услышать это!
Заранее спасибо!
Как именно вы планируете использовать это std::vector
?
Вы говорите, что итерация займет много времени, но если ваша цель состоит в том, чтобы перебирать все значения, вы просто не можете добиться большего успеха, чем непрерывный массив. Вы говорите об удалении элементов из контейнера, что предполагает, что вам нужен динамический массив, что именно std::vector
является.
Тем не менее, вы определенно не хотите хранить вектор необработанных указателей. Ваши два варианта должны быть std::vector<Particle>
(обычно предпочтительнее) или std::vector<unique_ptr<Particle>>
(Только C ++ 11), если вы измеряете и обнаруживаете, что производительности не хватает из-за использования определенных операций. В зависимости от вашего варианта использования, std::map<Particle>
или же std::set<Particle>
могут быть хорошие идеи, но у нас недостаточно информации.
Вы не храните какие-либо Particle
в стеке. Каждый элемент в std::vector
уже в бесплатном магазине («куча»).
Ваш код вставки и удаления не должен иметь ничего общего с вашим Particle
класс тоже. Вставка и удаление — это операция над вашим контейнером, а не над содержащимися элементами.
Чтобы ответить на ваш вопрос, нам нужно знать несколько вещей.
Во-первых, насколько большой Particle
? Это, наверное, самая важная информация.
Во-вторых, что ты делаешь с контейнером? Вы вообще смотрите на каждого Particle
и делать что-то с ними, или вы ищете определенный Particle
во всем вашем контейнере? Если вы ищете, пытаетесь ли вы искать на основе какого-то ключа (например, каждый Particle
имеет уникальный идентификатор, и вы смотрите на весь Particle
на этом удостоверении личности), или вы смотрите, чтобы увидеть, если один Particle
соответствует другому (так, другими словами, вы смотрите вверх на основе идентичности Particle
)?
Если вы ищете человека Particle
, затем std::set
вероятно, должен быть вашим первым выбором для простоты использования, так как он позволяет бинарный поиск. Если в вашем сценарии использования вы искали частицы по ключу, то вам нужно std::map<Key, Particle>
,
Если у вас есть куча частиц, и вы хотите удалить несколько из контейнера, тогда размер объекта имеет большое значение. Тем не менее, вы обычно хотите std::vector
для такой ситуации.
Короче, мне нужно больше информации, чтобы полностью ответить на ваш вопрос.
Если вы беспокоитесь о том, чтобы поместить вектор в стек, почему бы вам не попробовать что-то вроде этого:
vector <Particle> * particles = new vector <Particle>;
Это сделает вектор последним, пока вы delete
Это. Кроме того, если вы обеспокоены проблемами с производительностью, set
было бы хорошей идеей. Это гарантирует, что все вставки и удаления будут логарифмическими, и вам не придется использовать собственную функцию удаления. Для еще лучшей производительности в C ++ 11, попробуйте unordered_set
,