указатели — C ++ Большой векторный предмет поиска

Первое размещение здесь, и это сводит меня с ума! Я не могу объяснить это очень хорошо, поэтому я попытаюсь привести пример.

Я пытаюсь получить элемент в очень большом (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;

Теперь мой вопрос: возможно ли удалить и удалить частицу из списка, если вектор состоит из указателей частиц?

Я не уверен, что мне понятен мой вопрос, но я надеюсь, что вы поймете!

Или, если кто-то знает лучшее решение с точки зрения производительности, я бы хотел услышать это!

Заранее спасибо!

1

Решение

Как именно вы планируете использовать это 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 для такой ситуации.

Короче, мне нужно больше информации, чтобы полностью ответить на ваш вопрос.

1

Другие решения

Если вы беспокоитесь о том, чтобы поместить вектор в стек, почему бы вам не попробовать что-то вроде этого:

vector <Particle> * particles = new vector <Particle>;

Это сделает вектор последним, пока вы delete Это. Кроме того, если вы обеспокоены проблемами с производительностью, set было бы хорошей идеей. Это гарантирует, что все вставки и удаления будут логарифмическими, и вам не придется использовать собственную функцию удаления. Для еще лучшей производительности в C ++ 11, попробуйте unordered_set,

-1

По вопросам рекламы [email protected]