00001 #ifndef ATLFAST_REMOVEDISTANT_H
00002 #define ATLFAST_REMOVEDISTANT_H
00003
00018
00019 #ifndef STD_VECTOR_H
00020 #include <vector>
00021 #define STD_VECTOR_H
00022 #endif
00023 namespace Atlfast{
00024 template<class IsClose, class Container, class Dist >
00025 Container removeDistant(const Container& v, Dist dist){
00026
00027 size_t size = v.size();
00028
00029 Container close;
00030 if(size<2) {return close;}
00031
00032 std::vector<bool> keep(size, false);
00033 bool somethingsClose = false;
00034
00035 const typename Container::const_iterator vbegin = v.begin();
00036 const typename Container::const_iterator vend = v.end();
00037 const typename std::vector<bool>::const_iterator kbegin = keep.begin();
00038
00039 typename Container::const_iterator voiter;
00040 typename Container::const_iterator viiter;
00041 std::vector<bool>::const_iterator kiter;
00042
00043 for(voiter = vbegin; voiter!=vend; ++voiter){
00044 IsClose close(dist, *voiter);
00045
00046 for(viiter=voiter+1; viiter!=vend; ++viiter){
00047 if(close(*viiter)){
00048 keep[viiter-vbegin] = true;
00049 keep[voiter-vbegin] = true;
00050 somethingsClose = true;
00051 }
00052
00053
00054
00055
00056
00057
00058 }
00059 }
00060
00061 if(somethingsClose){
00062 size_t pos = 0;
00063 for(kiter=kbegin; kiter!=keep.end(); ++kiter, ++pos){
00064 if(*kiter) {close.push_back(v[pos]);}
00065 }
00066 }
00067 return close;
00068 }
00069 }
00070 #endif
00071
00072
00073
00074
00075
00076
00077