Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查点是否已在向量/列表中--性能_C++_Performance - Fatal编程技术网

C++ 检查点是否已在向量/列表中--性能

C++ 检查点是否已在向量/列表中--性能,c++,performance,C++,Performance,这与 例如,我有一个点向量,它将存储100K+个点 std::vector<Point> point_vec; 但是,我想检查list/vector中的x是否x将是一项代价高昂的操作。我想知道是否有更好的方法来检查a)点是否相等(可能是类点上的运算符“=”,(b)是否有其他比“vector”更好的数据结构,我应该使用。或者是否有一种对vector的操作可以加快检查“相同点” 对于(b),请注意,我还需要对这些点进行std::排序。因此,您可能建议的任何其他数据结构都应该能够对这些

这与

例如,我有一个点向量,它将存储100K+个点

std::vector<Point> point_vec; 
但是,我想检查list/vector中的x是否
x将是一项代价高昂的操作。我想知道是否有更好的方法来检查a)点是否相等(可能是类点上的运算符“=”,(b)是否有其他比“vector”更好的数据结构,我应该使用。或者是否有一种对vector的操作可以加快检查“相同点”

对于(b),请注意,我还需要对这些点进行std::排序。因此,您可能建议的任何其他数据结构都应该能够对这些点进行排序

更新


我只想要处于排序状态的点,只是向量不排序(因此,我需要执行排序操作。我应该使用
std::set point\u set
而不是
std::vector point\u vec
?如果是这样:将每个点添加到集合中是一个代价高昂的操作吗?还是我最终执行的“向量”排序总体上成本更高?

点的集合总是排序的,还是有时必须在一个集合中n未排序状态?如果是前者,则一组标准点将快速确定点是否已存在,并将按排序顺序维护点。您必须提供合适的排序函数(而不是相等函数),这可能比您的相等性测试快。

点集合总是排序的还是有时必须处于未排序状态?如果是前者,则std:;点集将快速确定点是否已经存在,并将按排序顺序保持点。您必须提供适当的排序功能(不是相等测试),它可能比相等测试快。

std::set
在内部对项目进行排序。您只需要提供比较函数。

std::set
在内部对项目进行排序。您只需要提供比较函数。


或者,您也可以使用四叉树或八叉树。

STL集或哈希集可能会有所帮助。 构建结构要比构建向量或列表慢,但查找点要快得多


或者,你也可以使用四叉树或八叉树。

我担心,尽管Niel和Vlad的想法是正确的,但他们遗漏了一个特别重要的细节:如果你只想在ε范围内而不是完全正确,你就不能用一维比较器合理地对N维点进行排序

Patrick使用quad/oct树是正确的,但使用散列是错误的——散列隐式地需要一个映射,其中所有在3D中接近的项都必须在1D(沿着散列)中接近映射,这是不可能的

因此,假设您可以从使用比较器(如


x1我担心,尽管Niel和Vlad的想法是正确的,但他们遗漏了一个特别重要的细节:如果你只想在ε范围内而不是完全正确,你就不能用一维比较器合理地对N维点进行排序

Patrick使用quad/oct树是正确的,但使用散列是错误的——散列隐式地需要一个映射,其中所有在3D中接近的项都必须在1D(沿着散列)中接近映射,这是不可能的

因此,假设您可以从使用比较器(如


x1注意:散列集只有在点有整数坐标时才有效。@尼尔,我实际上是指集合和散列集,而不是贴图(我在这方面有点太快了)。注意:散列集只有在点有整数坐标时才有效。@尼尔,我实际上是指集合和散列集,而不是贴图(我在这方面有点太快了)@Neil:嗨!点集合从一开始就不是处于排序状态。但是,最后,我确实希望所有点都“排序”,因此,我并不真正需要“未排序”的点。那么,您是否首先使用
std::set point\u set
而不是
std::vector point\u vec
来重新编译?如果排序和查找速度是m是的,但集合不支持其他操作,例如使用op[]进行随机访问这是您可能需要的。另一种方法是保持向量的排序顺序,并使用二进制搜索检查是否存在特定点。@尼尔:对不起,您所说的“合适的排序函数”是什么意思?@memC您需要提供与运算符@memC等价的std::find_,如果算法执行此操作,但它只会执行线性搜索如果你对向量进行了排序,你可以使用std::binary\u search或std::equal\u range。但是很明显,如果你进行了排序,min元素将是第一个:-)@尼尔:嗨!点的集合从一开始就不是处于排序状态。但是,最后,我确实希望所有的点都是“排序”的,因此,我真的不需要“未排序”的点。那么你建议使用
std::set point\u set
而不是
std::vector point\u vec
来重新编译吗?@memC如果排序和查找速度是最重要的最重要的是,是的。但是集合不支持其他操作,例如使用op[]进行随机访问这是您可能需要的。另一种方法是保持向量的排序顺序,并使用二进制搜索检查是否存在特定点。@尼尔:对不起,您所说的“合适的排序函数”是什么意思?@memC您需要提供与运算符@memC等价的std::find_,如果算法执行此操作,但它只会执行线性搜索如果你对向量进行了排序,你可以使用std::binary\u search或std::equal\u range。但是很明显,如果你进行了排序,min元素将是第一个:-)
bool samePoints(const Point& p1, 
                const double x1, 
                const double y1, 
                const double z1) {

     return fabs(p1.x - x1) < EPSILON &&
            fabs(p1.y - y1) < EPSILON &&
            fabs(p1.z - z1) < EPSILON;
}