C ++大向量搜索项

时间:2012-11-17 19:38:39

标签: c++ pointers vector reference erase

第一次在这里发帖,这让我抓狂!我无法解释它,所以我会尝试举例。

我正在尝试检索一个非常大的(100k)向量中的元素来擦除它。通过它需要很长时间......所以我尝试了这个:

这是我的清单的一个小例子。它存储在我的单例粒子发射器类中。

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;

现在我的问题:如果向量由粒子指针组成,是否仍然可以从列表中删除和删除粒子?

我不确定我的问题是否清楚,但我希望你能理解!

或者,如果有人知道更好的性能明智的解决方案,我想听听它!

提前致谢!

2 个答案:

答案 0 :(得分:1)

您打算如何使用此std::vector

你说迭代需要很长时间,但是如果你的目标是遍历所有值,你就不能比连续的数组做得更好。你谈到从容器中删除元素,这表明你需要一个动态数组,这正是std::vector的原因。

无论如何,你绝对不想存储原始指针的向量。如果您测量并发现由于使用某些操作而缺乏性能,那么您的两个选项应该是std::vector<Particle>(通常首选)或std::vector<unique_ptr<Particle>>(仅限C ++ 11)。根据您的使用情况,std::map<Particle>std::set<Particle>可能是好主意,但我们没有足够的信息。

您没有在堆栈中存储任何Particlestd::vector中的每个元素都已存在于免费商店中(&#34;堆&#34;)。

您的插入和删除代码也应与您的Particle课程无关。插入和删除是对容器的操作,而不是对包含的元素的操作。

要回答你的问题,我们需要了解一些事情。

首先,Particle有多大?这可能是最重要的信息。

其次,你在用容器做什么?您是否经常查看每个Particle并使用它们进行操作,或者您是否在整个容器中搜索特定的Particle?如果您正在搜索,是否尝试根据某种键进行查找(例如,每个Particle都有一个唯一的ID,您在该ID上查找整个Particle,或者您是抬头看一个Particle是否与另一个匹配(换句话说,你是根据Particle的身份查找的?)

如果您正在查找个人Particle,那么std::set应该是您易用的首选,因为它允许二进制搜索。如果您的用例是按键搜索粒子,那么您需要std::map<Key, Particle>

如果您有一堆粒子,并且想要从容器中删除一些粒子,那么对象的大小非常重要。但是,对于这种情况,您通常需要std::vector

简而言之,我需要更多信息才能完全回答您的问题。

答案 1 :(得分:-1)

如果您担心将矢量放在堆栈上,为什么不尝试这样的事情:

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

这将使向量持续到delete为止。此外,如果您担心性能问题,set将是一个好主意。这可以保证所有插入和删除都是对数时间,并且您不必使用自己的删除功能。要在C ++ 11中获得更好的性能,请尝试unordered_set