1

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

我正在尝试检索一个非常大( 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;

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

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

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

提前致谢!

4

2 回答 2

1

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

您说迭代需要很长时间,但如果您的目标是迭代所有值,那么您根本无法比连续数组做得更好。你谈到从容器中删除元素,这表明你需要一个动态数组,这正是它的本质std::vector

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

您没有Particle在堆栈上存储任何内容。a 中的每个元素std::vector都已经在空闲存储区(“堆”)中。

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

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

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

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

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

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

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

于 2012-11-17T20:43:34.603 回答
-1

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

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

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

于 2012-11-17T19:51:13.577 回答