KNNSearchResultAdaptor(Neighborhood<ScalarT> &results, size_t k, ScalarT max_radius = std::numeric_limits<ScalarT>::max())
: results_(results), k_(k), count_(0)
这里总结一下:的使用:
其实冒号后的内容是初始化成员列表,一般有三种情况:
1、对含有对象成员的对象进行初始化,例如,
类line有两个私有对象成员startpoint、endpoint,line的构造函数写成:
line(int sx,int sy,int ex,int ey):startpoint(sx,sy),endpoint(ex,ey){……}
初始化时按照类定义中对象成员的顺序分别调用各自对象的构造函数,再执行自己的构造函数
2、对于不含对象成员的对象,初始化时也可以套用上面的格式,例如,
类rectangle有两个数据成员length、width,其构造函数写成:
rectangle():length(1),width(2){}
rectangle(int x,int y):length(x),width(y){}
3、对父类进行初始化,例如,
CDlgCalcDlg的父类是MFC类CDialog,其构造函数写为:
CDlgCalcDlg(CWnd* pParent ): CDialog(CDlgCalcDlg::IDD, pParent)
其中IDD是一个枚举元素,标志对话框模板的ID
使用初始化成员列表对对象进行初始化,有时是必须的,有时是出于提高效率的考虑
这段代码其实是对类的私有的数据成员进行初始化;
完整的代码如下:
template <typename ScalarT>
class KNNSearchResultAdaptor {
public:
KNNSearchResultAdaptor(Neighborhood<ScalarT> &results, size_t k, ScalarT max_radius = std::numeric_limits<ScalarT>::max())
: results_(results), k_(k), count_(0)
{
results_.resize(k_);
results_[k_-1].value = max_radius;
}
inline size_t size() const { return count_; }
inline bool full() const { return count_ == k_; }
inline bool addPoint(ScalarT dist, size_t index) {
size_t i;
for (i = count_; i > 0; --i) {
if (results_[i-1].value > dist) {
if (i < k_) {
results_[i].index = results_[i-1].index;
results_[i].value = results_[i-1].value;
}
} else {
break;
}
}
if (i < k_) {
results_[i].index = index;
results_[i].value = dist;
}
if (count_ < k_) count_++;
return true;
}
inline ScalarT worstDist() const { return results_[k_-1].value; }
private:
Neighborhood<ScalarT>& results_;
const size_t k_;
size_t count_;
};