C++大矢量搜索项
C++ Big vector search item
第一次在这里发帖,这让我疯了!我不能很好地解释,所以我试着举个例子。
我试图在一个非常大(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>
可能是个好主意,但我们没有足够的信息。
您没有在堆栈上存储任何Particle
。std::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
。
- 有根的二进制搜索树.保留与其父级的链接
- 在C++中搜索嵌套多映射值
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 为什么二进制搜索在我的测试中不起作用
- 正在尝试重载二进制搜索树分配运算符
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 向量上的线性搜索
- 如何在动态数组上使用搜索函数
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- cmake:添加要搜索头文件的目录
- 使用C++创建特殊的二叉搜索树
- 在C++的字符串中搜索和删除某些字符
- std::unordered_map 搜索算法是如何实现的?
- 使用不变量来确定二分搜索中的边界条件
- 二叉搜索如何比线性搜索更快?
- 按边长度递归搜索图中所有可行路径
- QStackWidget - 按名称搜索
- 在递归二叉搜索树中搜索
- 我的二进制搜索程序只是关闭了