83 void add(Index_ i, Distance_ d) {
85 my_nearest.emplace(d, i);
86 if (my_nearest.size() == my_neighbors) {
90 my_nearest.emplace(d, i);
109 void report(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances, Index_ self) {
112 size_t num_expected = my_nearest.size() - 1;
113 if (output_indices) {
114 output_indices->clear();
115 output_indices->reserve(num_expected);
117 if (output_distances) {
118 output_distances->clear();
119 output_distances->reserve(num_expected);
122 bool found_self =
false;
123 while (!my_nearest.empty()) {
124 const auto& top = my_nearest.top();
125 if (!found_self && top.second == self) {
128 if (output_indices) {
129 output_indices->push_back(top.second);
131 if (output_distances) {
132 output_distances->push_back(top.first);
140 if (output_indices) {
141 std::reverse(output_indices->begin(), output_indices->end());
143 if (output_distances) {
144 std::reverse(output_distances->begin(), output_distances->end());
150 if (output_indices) {
151 output_indices->pop_back();
153 if (output_distances) {
154 output_distances->pop_back();
170 void report(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances) {
171 size_t position = my_nearest.size();
172 if (output_indices) {
173 output_indices->resize(position);
175 if (output_distances) {
176 output_distances->resize(position);
179 while (!my_nearest.empty()) {
180 const auto& top = my_nearest.top();
182 if (output_indices) {
183 (*output_indices)[position] = top.second;
185 if (output_distances) {
186 (*output_distances)[position] = top.first;