C++ C++;大向量搜索项

C++ C++;大向量搜索项,c++,pointers,vector,reference,erase,C++,Pointers,Vector,Reference,Erase,第一次在这里发帖,这让我抓狂!我不能很好地解释它,所以我试着举个例子 我试图在一个非常大(100k)的向量中检索一个元素来擦除它。但这需要很长时间。。。所以我试了一下: 这是我列表中的一个小例子。它存储在我的单粒子发射器类中 vector<Particle> particles; particles.reserve(100); 这一切都很好,但我不想保存堆栈上的每个粒子,所以我想更改它 vector<Particle> particles; 矢量粒子; 进入 矢量粒

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

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

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

vector<Particle> particles;
particles.reserve(100);

这一切都很好,但我不想保存堆栈上的每个粒子,所以我想更改它

vector<Particle> particles;
矢量粒子;
进入

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

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

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


提前谢谢

如果您担心将向量放在堆栈上,为什么不尝试以下方法:

vector <Particle> * particles = new vector <Particle>;
矢量*粒子=新矢量;

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

您计划如何使用此
std::vector

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

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

您没有在堆栈上存储任何
粒子。
std::vector
中的每个元素都已在空闲存储(“堆”)中

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

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

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

第二,你用这个容器做什么?您通常是在查看每个
粒子
并对其进行处理,还是在整个容器中搜索特定的
粒子
?如果您正在搜索,您是否尝试基于某种键进行查找(例如,每个
粒子
都有一个唯一的ID,您在该ID上查找整个
粒子
),或者您是否在查找一个
粒子是否与另一个匹配(换句话说,您是基于
粒子
的标识进行查找)

如果您正在查找单个
粒子
,那么
std::set
可能是易于使用的首选,因为它允许二进制搜索。如果用例要求按键搜索粒子,则需要
std::map

如果你有一堆粒子,你想从容器中移除一些,那么物体的大小就相当重要了。然而,对于这种情况,您通常需要一个
std::vector


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

您的
Particle
类不应该了解它所在的容器。Particle有多大?如果复制构造很昂贵,那么您应该存储为指针,但使用指针容器(如
boost::ptr_vector
),我同意chris的观点,将容器的知识灌输到类中不是一个好主意……此外,为了减少搜索时间,您可以拥有一个排序的向量吗?“但我不想保存堆栈上的每个粒子
std::vector
的存储在堆上。@chris:一般来说,这是个好建议,但有时出于性能原因,您需要偏离最佳做法。
std::vector
已经在堆上分配了。你的改变并没有真正实现什么,只是意识到了这一点。但是,由于他似乎是在函数中声明它,因此如果有必要,执行
new/delete
方法将保留它所需的时间。保留它所需的时间应该是可行的,特别是对于C++11移动语义。另外,OP显然是全局声明的,这很可怕,但绝对不需要复制/移动。哈哈,不是全局,但我把它放在我的粒子发射器类中存储指向std::vector的指针而不是std::vector本身没有什么真正的优势。std::vector通常会在堆栈上分配
sizeof(pointer)*3
,而不管std::vector中包含多少元素。好的,谢谢您提供的信息,我将首先考虑您的建议,看看是否可以从中获得一些东西!
vector<Particle*> particles;
vector <Particle> * particles = new vector <Particle>;