请问这个功能用STL怎么实现?

tangxu12 2009-06-16 07:51:01
Point3d 是一个点的类,有三个变量X Y Z分别代表点的坐标
Class Point3d
{
public:
double X;
double Y;
double Z;
}

我有很多点的数据都存在了Point3d中
vector <Point3d> MyPointList;

请问用STL怎么求这些点之间距离的最小值? 今天搞了很久都没有搞出来。
...全文
92 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhao1zhong6 2009-06-18
  • 打赏
  • 举报
回复
不就是冒泡吗?
zhao1zhong6 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tangxu12 的回复:]
如果100个点 我就要求10000次 如果200个点就40000次 点再多些 就几何级的增加了
[/Quote]
不用那么多次吧?
对数组a[10]={5,6,2,8,4,7,9,6,2,0};排序难道要10000次吗?
tangxu12 2009-06-18
  • 打赏
  • 举报
回复
诶 最后也没有一个好方法
FreeMyself 2009-06-18
  • 打赏
  • 举报
回复
似乎可以将每一个点看作一个向量,然后两点之间的距离也是一个向量,这样两点之间的距离就可以转换为加减法运算,然后再求模最小的向量
pathuang68 2009-06-18
  • 打赏
  • 举报
回复
这个题目在如何减少计算量方面还是非常有难度的!
pathuang68 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tangxu12 的回复:]
如果100个点 我就要求10000次 如果200个点就40000次 点再多些 就几何级的增加了
[/Quote]
100个点应该是Combination(100,2)条线;
200个点应该是Combination(200,2)条线;

不过这位兄弟应该很懂几何级数的真正含义!
beyond071 2009-06-18
  • 打赏
  • 举报
回复
一眼看过去没想到什么好的提速方法,对于这种点与点之间距离的比较问题,感觉只能都求解出来,算法效率就如冒泡法一样(求N(N-1)/2次距离)。
yshuise 2009-06-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 antss 的回复:]
我真没想到楼上的都是一堆菜鸟.

加个谓词就得了.

LS的STL库没学好啊.


[/Quote]
这儿主要是效率的问题,不是什么STL的问题。
antss 2009-06-18
  • 打赏
  • 举报
回复
谓词

算法还接受谓词(predicate),谓词是指函数对象参数.函数对象是重载了operator()的类的对象,它作为回调函数参数传递给某个算法.算法为它所处理的容器中的每个对象调用谓词.
在某些情况下,谓词是布尔函数,它通过返回true/false告诉算法是否选择该对象.在其它情况下,谓词会处理算法所找到的对象并返回容器中该类型的某个对象.STL提供了一组标准的可以做谓词的算术,比较和逻辑函数对象.

关联式容器需要给模板实例提供谓词作为参数.谓词说明了元素是如何被存储和检索的.

谓词是STL用来确定容器中元素信息的一种函数.调用谓词的结果(真或者假)决定了容器中元素的排列方式.标准C++为用户定义了许多谓词,如:
std::less<>和std::greater<>等.然而,如果用户对容器所进行的操作不被标准的谓词所支持的话,那么用户可以定义和使用自己的谓词.
一个谓词不仅确定两个参数中哪个更小,而且显示被比较的两个参数.

注意,谓词实际是以一种小型类的形式定义的.这个类为谓词提供了名称compare,并重载了()运算符号.谓词的工作是由operator()函数完成的.每当程序为了维持std::map对象内容顺序而需要执行比较的时候,就调用这个函数.
改变谓词也就改变了STL对该映射的内容进行排序的方式.例如,可以通过反转谓词中的比较而颠倒std::map对象中元素的排列次序.为了达到这个目的,可以把谓词函数中的return c1<c2;改为return c1>c2;
antss 2009-06-18
  • 打赏
  • 举报
回复
我真没想到楼上的都是一堆菜鸟.

加个谓词就得了.

LS的STL库没学好啊.

yshuise 2009-06-18
  • 打赏
  • 举报
回复
Class Point3d
{
public:
double X;
double Y;
double Z;
}

首先,应该这个类就应该求出距离。
Class Point3d
{
public:
GetDistance(){ return ... }
private:
double X;
double Y;
double Z;
}
//然后把距离压入vector:

vector<double>DIS(....);
min_element(DIS.begin(),DIS.end());
Walf_ghoul 2009-06-18
  • 打赏
  • 举报
回复
mark,等待高手解决
ypb362148418 2009-06-17
  • 打赏
  • 举报
回复
自己翻翻STL源码剖析,看看有没有?????
tangxu12 2009-06-17
  • 打赏
  • 举报
回复
那不用STL 用什么方法啊?
tangxu12 2009-06-17
  • 打赏
  • 举报
回复
还没有解决

顶上
DreamFreeLancer 2009-06-16
  • 打赏
  • 举报
回复
这个命题和STL没有直接关系,STL中没有直接的算法可以满足你
tkminigame 2009-06-16
  • 打赏
  • 举报
回复
d =sqrt ( (a.x-b.x)^2+(a.y-b.y)^2+(a.z-b.xz)^2)

求点距比大小不用开方,可以省掉sqrt运算,节省好多时间。再利用空间划分。

比如把一个空间分成3x3x3个大小相等的格子,从其中一面看是这样。

1 2 3
4 5 6
7 8 9

每个格子的长度,比如是一百,把你的点放进每个格子里去。你要求距离在1,2之间的点,首先可以排除1和9,1和6,1和3,1和8 1和7之间的点的比较,只比较同一格子内的和其周边的格子里的点,这个空间可以不断细分,分到最后比如一个格子长度为3,里面只有三四个点,算起来速度就大大降低了。
red_berries 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tangxu12 的回复:]
如果100个点 我就要求10000次 如果200个点就40000次 点再多些 就几何级的增加了
[/Quote]
这个问题要找找相关具体算法来解决,STL是没有这些东西的
licry01 2009-06-16
  • 打赏
  • 举报
回复
计算量是够大的
关注一下
huangyu20072010 2009-06-16
  • 打赏
  • 举报
回复
这个要用动态规划来减少时间复杂度吧。
加载更多回复(7)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧