C++ 从向量中排序和删除重复项<;向量<;双倍>&燃气轮机;

C++ 从向量中排序和删除重复项<;向量<;双倍>&燃气轮机;,c++,sorting,vector,floating-point,C++,Sorting,Vector,Floating Point,您好,我知道有一些类似的问题,但我一直无法解决我的问题。 我需要以笛卡尔坐标在球体上生成一组唯一的点,即从球体到笛卡尔坐标的变换。当我这样做时,我将点存储在一个向量向量中。然而,一些重复创建和删除他们,我已经尝试使用排序擦除和独特的功能。问题是排序不能对整个向量进行排序,我不明白为什么?它适用于我刚刚将数字推回的向量向量,但不适用于由笛卡尔函数生成的向量向量。我知道这很简单,我已经被困了3天了,我确信它正盯着我的脸!!!代码和输出如下所示 #include <iostream> #i

您好,我知道有一些类似的问题,但我一直无法解决我的问题。 我需要以笛卡尔坐标在球体上生成一组唯一的点,即从球体到笛卡尔坐标的变换。当我这样做时,我将点存储在一个向量向量中。然而,一些重复创建和删除他们,我已经尝试使用排序擦除和独特的功能。问题是排序不能对整个向量进行排序,我不明白为什么?它适用于我刚刚将数字推回的向量向量,但不适用于由笛卡尔函数生成的向量向量。我知道这很简单,我已经被困了3天了,我确信它正盯着我的脸!!!代码和输出如下所示

#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stdio.h>  

int main(int argc, const char * argv[]){
  std::vector<double> locations;    //center of the bubble
  locations.push_back(1.0);
  locations.push_back(1.0);
  locations.push_back(1.0);
  std::vector<std::vector<double> > points;   //set of points to be created around the bubble
  double PI=atan(1)*4;

 for(int dr=1; dr<2; dr++){
     for (int phi=0; phi<180; phi+=90){
         for (int theta=0; theta<360; theta+=90){

             std::vector<double>  row;
             double x=locations[0]+(dr*sin(theta*(PI/180))*cos(phi*(PI/180)));
             double y=locations[1]+(dr*cos(theta*(PI/180)));
             double z=locations[2]+(dr*sin(theta*(PI/180))*sin(phi*(PI/180)));
             row.push_back(x);
             row.push_back(y);
             row.push_back(z);

             points.push_back(row);


         }
     }
 }



std::sort(points.begin(), points.end());    //sort points
std::cout<<"sorted points \n";
for (int i =0; i<points.size(); i++){
    std::cout<<points[i][0]<<" "<<points[i][1]<<" "<<points[i][2]<<"\n";
}

points.erase(std::unique(points.begin(), points.end()), points.end());  //erase duplicates

 std::cout<<"duplicates removed \n";
 for (int i =0; i<points.size(); i++){
    std::cout<< points[i][0]<<" "<<points[i][1]<<" "<<points[i][2]<<"\n";
}

如果更改行:

std::cout << points[i][0] << " " << points[i][1] << " " << points[i][2] << "\n";
因此考虑到近似值向量已正确排序


PS您可以在
std::sort()
调用中使用自定义比较器,在
std::unique
调用中使用自定义二进制谓词。

是的,浮点比较很麻烦。
(int dr=1;drI建议创建一个封装点的方面的类/结构。然后您可以重载运算符进行排序和比较。这将使您更容易看到您试图执行的操作。您在这种比较中有什么意义?您是如何判断
1 0 1这没有正确排序的呢
?poi如何处理nts
{0,1,1}
{1,1,0}
{1,0,1}
是小于还是大于彼此?编译器如何知道您的确切意思?您好,感谢您的建议,我意识到在本例中我不需要dr循环,但这只是最简单的版本,所以问题很清楚。在最终代码中,我需要3个dr步骤,θ和φ每10度都有点。我担心的是s点的truct是一个有效的方法。实际的代码需要这样做几百次,然后我需要使用这些点来计算穿过球体的通量。所以,你认为这个问题会被解决吗?例如,用
int
替换
double
?@Drop是的,我想会的(至少在具体的例子中)。哦,我明白了!我有一种感觉,这与圆周率的近似值有关。好吧,因为我不能更改为
int
,因为在实际代码中,我需要每10度修改一次,我会按照你的建议尝试,非常感谢!!
std::cout << points[i][0] << " " << points[i][1] << " " << points[i][2] << "\n";
std::cout << std::fixed << std::setprecision(std::numeric_limits<double>::digits10+2) << points[i][0] << " " << points[i][1] << " " << points[i][2] << "\n";
sorted points
0.00000000000000000 0.99999999999999978 1.00000000000000000
0.99999999999999989 0.99999999999999978 0.00000000000000000
1.00000000000000000 0.00000000000000000 1.00000000000000022
1.00000000000000000 1.00000000000000000 2.00000000000000000
1.00000000000000000 2.00000000000000000 1.00000000000000000
1.00000000000000000 2.00000000000000000 1.00000000000000000
1.00000000000000022 0.00000000000000000 1.00000000000000000
2.00000000000000000 1.00000000000000000 1.00000000000000000
duplicates removed 
0.00000000000000000 0.99999999999999978 1.00000000000000000
0.99999999999999989 0.99999999999999978 0.00000000000000000
1.00000000000000000 0.00000000000000000 1.00000000000000022
1.00000000000000000 1.00000000000000000 2.00000000000000000
1.00000000000000000 2.00000000000000000 1.00000000000000000
1.00000000000000022 0.00000000000000000 1.00000000000000000
2.00000000000000000 1.00000000000000000 1.00000000000000000