从矢量<vectors <double =“”>&gt; </vectors <>中排序和删除重复项

时间:2014-02-20 16:04:41

标签: c++ sorting vector floating-point

您好我知道有一些类似的问题,但我无法解决我的问题。 我需要在笛卡尔坐标上的球体上生成一组独特的点,即从球面变换到笛卡尔坐标。当我这样做时,我将点存储在矢量矢量中。然而,创建了一些重复项并删除它们我尝试使用排序擦除和唯一函数。问题是排序没有看到我整个矢量排序,我不明白为什么?它适用于矢量矢量我只是将数字推回去,而不是我的笛卡尔函数生成的矢量矢量。我知道这很简单我已经被困了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";
}

}

输出

sorted points 
0 1 1
1 1 0
1 0 1         THIS HASN'T BEEN SORTED CORRECTLY
1 1 2
1 2 1
1 2 1
1 0 1          THIS HASN'T BEEN SORTED CORRECTLY
2 1 1
duplicates removed 
0 1 1
1 1 0
1 0 1
1 1 2
1 2 1
1 0 1
2 1 1

1 个答案:

答案 0 :(得分:2)

如果您更改了该行:

std::cout << points[i][0] << " " << points[i][1] << " " << points[i][2] << "\n";

with(您还需要包含<limits><iomanip>):

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

所以考虑近似,向量已经正确排序。

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