社区
C++ 语言
帖子详情
请问这个功能用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怎么求这些点之间距离的最小值? 今天搞了很久都没有搞出来。
...全文
93
27
打赏
收藏
请问这个功能用STL怎么实现?
Point3d 是一个点的类,有三个变量X Y Z分别代表点的坐标 Class Point3d { public: double X; double Y; double Z; } 我有很多点的数据都存在了Point3d中 vector MyPointList; 请问用STL怎么求这些点之间距离的最小值? 今天搞了很久都没有搞出来。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
【C++】
STL
中vector常见
功能
的模拟
实现
本文详细解析了
STL
中Vector容器的内部
实现
原理及常用操作方法,包括构造函数、迭代器、容量调整等核心
功能
。
【C++】
STL
中List的基本
功能
的模拟
实现
本文详细介绍了
STL
中List的模拟
实现
过程,包括结点类、迭代器类及List类的
实现
细节,深入探讨了构造函数、迭代器操作符重载、插入、删除等关键
功能
。
c++
stl
的迭代器部分
功能
可以这样
实现
本文探讨了C++
STL
容器迭代器的
功能
,包括作为指针使用、提供容器元素成员子集、控制访问权限及容器内部特殊权限等。通过实例代码展示了如何
实现
这些
功能
。
用
STL
实现
单词统计
功能
本文介绍了一个使用
STL
实现
单词统计的应用程序。该程序接收用户输入的单词,将它们转换为小写并排序,然后统计每个单词出现的频率。通过利用
STL
中的数据结构如map和set,以及算法如transform和count,程序能够简洁高效地完成任务。
【C++】
STL
之string
功能
及模拟
实现
文章详细介绍了C++标准库中的string类,包括构造函数、常用接口(如构造、容量操作、访问遍历、修改等)、非成员函数,以及在VS下的结构说明。此外,还提供了string类的模拟
实现
,涵盖了构造、析构、拷贝构造、赋值运算符重载和比较运算符等关键
功能
。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章