C++大矢量搜索项

C++ Big vector search item

本文关键字:搜索 C++      更新时间:2023-10-16

第一次在这里发帖,这让我疯了!我不能很好地解释,所以我试着举个例子。

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

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

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

或者,如果有人知道一个更好的性能解决方案,我很想听听!

提前感谢!

您计划如何使用此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

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

如果你担心把向量放在堆栈上,为什么不试试这样的东西:

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

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