在指针向量中添加非重复值的最有效方法
Most efficient way to add non-duplicate values in vector of pointers
我有一个这样的矢量
vector<Point*> points;
我想给这个向量添加一个新的点。然而,我有最多50个内部向量点,但其中许多是重复的。实现添加非重复值的最有效方法是什么?到目前为止,我是这样做的:
boolean add_point(vector<Point*> *p, int x, int y){
for(vector<Point*>::iterator i = p->begin(); i != p->end(); i++){
if((*i)->x == x && (*i)->y == y)
return false;
}
p->push_back(new Point(x,y));
return true;
}
然而,当我调用这个函数百万次时,我的应用程序的执行时间增加了很多。
根据堆栈主题之一,我已经尝试过了:
sort( points.begin(), points.end() );
points.erase( unique( points.begin(), points.end() ), points.end() );
但是两种代码的结果是不同的。排序/擦除工作很好对指针矢量?
有什么建议可以解决这个问题吗?假设您的Point
结构类似于
struct Point { int x, y; }
则仅将Points
本身存储在vector中,并提供比较函数
bool operator==(Point const& p1, Point const& p2)
{
return p1.x == p2.x && p1.y == p2.y
}
bool operator<(Point const& p1, Point const& p2)
{
return p1.x != p2.x ? p1.x < p2.x : p1.y < p2.y;
}
之后,您可以使用以下命令删除重复项:
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
如果您希望您的容器自动防止重复使用std::set<Point>
/std::unordered_set<Point>
(您需要为后者提供std::hash
的专门化),尽管使用具有最终排序和删除重复的向量总体上可能更快。正如@PorkyBrain指出的那样,你可以在插入时使用std::lower_bound
来保持向量排序,并避免最终排序。
所有这些方法中最有效的方法完全取决于您的用例,因为总是首先使用最简单的方法编写程序,然后配置文件查看是否需要改进。
使用std::unordered_map
。
这些点将被散列,因此在检查大量重复项时存储速度应该更快。
直接将点放入向量中可能更快。在处理POD类型时,保持排序向量(通过使用lower_bounds添加)通常是最快的,因为它是最适合缓存的。下面是一个例子:
void addToSortedVector(std::vector<Point>& v, Point p){
auto it = std::lower_bound(v.begin(),v.end(),p);
if(it == v.end() || !(*it == p)){
v.emplace(it,std::move(p));
}
}
您可以在这里看到大约1.5倍的速度差异:http://ideone.com/E2gqOd但是您的速度差异将根据缓存效果和架构而变化,因此对此测量持保留态度
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法