2016-05-24 1 views
0

私のコードでは多次元配列のベクトルを得ました。このベクトルには、輪郭の点の座標が格納されています。ポイントに基づいて輪郭を復元する前に、データを減らすために複製を消去する必要があります。ベクトルがソートされている場合、std::uniqueを使用できることがわかりました。しかし、並べ替えは必要ないので、ソートされていないベクトルから重複を削除したい。 'std::pair<_Ty1,_Ty2> std::set<_Kty>::insert(double &&) : cannot convert parameter 1 from std::array<_Ty,_Size> to 'double &&':だから、私は、このエラーメッセージが表示されますstd::set<double> set(matrix.begin(), matrix.end());重複2倍の配列のソートされていないベクトルから重複を取り除く

std::vector<std::array<double, 3>> matrix; 
rows = 2*lss.size(); 
matrix.resize(rows); 

int j=0; 

for(size_t i = 0;i<lss.size();i++) { 
    int k = j+1; 

    matrix[j][0]=lss[i].v[0].x; 
    matrix[j][1]=lss[i].v[0].y; 
    matrix[j][2]=lss[i].v[0].z; 
    matrix[k][0]=lss[i].v[1].x; 
    matrix[k][1]=lss[i].v[1].y; 
    matrix[k][2]=lss[i].v[1].z; 

    j=j+2; 
} 

std::set<double> set(matrix.begin(), matrix.end()); 

matrix.erase(std::remove_if(matrix.begin(), matrix.end(), [&set] (double item) {return !set.erase(item); }), matrix.end()); 

しかし、ラインのを取り除くためにstd::setを使用する必要があります。次の行のために

私はまた、エラーメッセージが表示されます、あなたは行列のセットを構築している

std::set<std::array<double, 3>> set(matrix.begin(), matrix.end()); 

'bool export::<lambda_c894aac2078f37151750793b2c6d0417>::operator()(double) const' : cannot convert parameter 1 from 'std::array<_Ty,_Size>' to 'double'

+2

'のstd ::設定セット()'ダブルスを期待::配列それに。 –

+0

重複を避けたいのであれば、最初にポイントをベクターに保存するのはなぜですか?それは特定の要件を満たすことですか? – Rerito

+0

セットにプッシュしてテールを消去することは、最初にソートして一意の値を見つけることとほとんど同じです。 –

答えて

0

を次のような行

std::set<double> set(matrix.begin(), matrix.end()); 

を変更する必要があります二倍にならない。あなたのセットへのテンプレートパラメータはあなたのベクトルと同じでなければなりません。

+0

私はすでにラインを変更しました。私のベクトルに 'double 'は含まれていないのを忘れましたが、' std:array' – user3794592

1

あなたのコンテナにはユニークなアイテムしか保管されておらず、これらのアイテムがソートされていても構わない場合は、常にstd::unordered_setを使用して座標を保持できます。

簡単な例:このanswerから取ら

#include <iostream> 
#include <unordered_set>  

struct Point 
{ 
    double x, y, z; 

    bool operator==(const Point& other) const 
    { 
     return (x == other.x) && (y == other.y) && (z == other.z); 
    } 
}; 

ハッシュ関数:あなたはSTDを渡している間、

struct Hash 
{ 
    size_t operator() (const Point &point) const 
    { 
     return ((std::hash<double>()(point.x) 
      ^(std::hash<double>()(point.y) << 1)) >> 1) 
      ^(std::hash<double>()(point.z) << 1); 
    } 
}; 

int main() 
{ 
    std::unordered_set<Point, Hash> uset; 
    uset.insert({ 100, 100, 200 }); 
    uset.insert({ 100, 100, 200 }); 
    uset.insert({ 100, 100, 200 }); 

    std::cout << uset.size() << '\n'; // prints 1 

    return 0; 
} 
関連する問題