c++ - 在指针 vector 中添加非重复值的最有效方法

标签 c++ vector unique

我有这样的 vector

vector<Point*> points;

我想给这个 vector 添加一个新的点。但是我最多有 50 个内部 vector 点,但其中很多都是重复的。实现添加非重复值的最有效方法是什么。到目前为止,我是这样做的:

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() );

然而,两种代码的结果是不同的。排序/删除在指针 vector 上运行良好吗?

有什么解决这个问题的建议吗?

最佳答案

假设您的 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 的特化),尽管使用具有最终排序的 vector 并删除重复项总体上可能更快。正如@PorkyBrain 指出的那样,您可以使用 std::lower_bound 对 vector 进行排序。插入时避免最后排序。

所有这些中最高效的完全取决于您的用例,因为总是首先使用最简单的方法编写您的程序,然后分析它是否需要改进。

关于c++ - 在指针 vector 中添加非重复值的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24989745/

相关文章:

C++ LoadLibrary 抛出 First-Chance Exception,但有效吗?

sqlite - 从sqlite表中选择唯一记录

r - 即使值的数量不相同,如何将数据帧列中的唯一值放入数据帧中

c# - 在两个点之间创建一条曲线,每个点都具有归一化向量

C++,从另一个 vector 唯一的 vector 中快速删除元素

java - JNI 和事件函数

c++ - 尝试创建 posix 线程并获得从 'void*' 到 'void* (__attribute__((__cdecl__)) *)(void*) 错误的无效转换

c++ - 设置<字符串> : how to list not strings starting with given string and ending with `/` ?

c++ - vector::emplace_back结果两次调用析构函数

C++ 排序 STL vector 失败 (SIGTRAP)