2012-11-17 37 views
1

第一次发布在这里,这让我疯狂!我无法很好地解释它,所以我会尝试举个例子。C++大矢量搜索项目

我试图在非常大的(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; 

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

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

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

在此先感谢!

+7

你的'粒子'类不应该知道什么容器持有它。 – chris

+1

粒子有多大?如果复制构造函数的代价很高,那么你应该把它作为指针存储,但是使用一个指针容器(比如'boost :: ptr_vector'),并且我同意克里斯的观点,将容器的知识传授给这个类并不是一个好主意... – Nim

+0

另外,为了减少搜索时间,可能是你可以有一个排序的向量? – Nim

回答

-1

如果你担心把你的矢量在栈上,你为什么不尝试这样的事:

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

这将使最后,直到你delete它的载体。另外,如果您担心性能问题,则set将是一个好主意。这保证了所有的插入和删除操作都是对数时间,并且你不必使用自己的删除功能。为了在C++ 11中获得更好的性能,请尝试unordered_set

+4

'std :: vector'已经分配在堆上。你的改变并没有完成任何事情。 –

+0

刚刚意识到这一点。但是,由于他似乎是在一个函数中声明它,因此如果必要的话,执行'new/delete'方法将会在需要的时间内保留它。 – jma127

+0

无论如何,只要需要保留它,尤其是使用C++ 11移动语义。此外,OP显然宣布它是_globally_,这太可怕了,但绝对不需要复制/移动。 – leftaroundabout

1

你打算如何使用这个std::vector

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

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

您没有在堆栈上存储任何Particlestd::vector中的每个元素都已经在免费商店(“堆”)中。

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

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

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

二,你在做什么容器?您是否一般都在查看每个Particle并与他们合作,或者您是否在整个容器中搜索特定的Particle?如果您正在搜索,是否尝试根据某种关键字查找(例如,每个Particle都有一个唯一的ID,并且您在该ID上查找整个Particle),或者您是否正在查看是否有一个Particle匹配另一个(换句话说,你根据Particle的身份查找)?

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

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

总之,我需要更多的信息才能完全回答你的问题。

+0

好的谢谢你的信息,将首先处理你的建议,看看我能不能从它做出一些东西! – user1832422