@@ -193,14 +193,17 @@ class ColumnMapT : public ColumnMap {
193
193
}
194
194
const auto make_index = [](const auto & data) {
195
195
std::vector<size_t > result{data.Size ()};
196
- std::generate (result.begin (), result.end (), [i = 0 ] () mutable { return i++; });
196
+ std::generate (result.begin (), result.end (), [i = 0 ] () mutable {return i++;});
197
197
std::sort (result.begin (), result.end (), [&data](size_t l, size_t r) {return data[l] < data[r];});
198
198
return result;
199
199
};
200
- const auto l_index = make_index (data_);
201
- const auto r_index = make_index (other.data_ );
202
- return std::equal (l_index.begin (), l_index.end (), r_index.begin (), r_index.end (),
203
- [&l_data = data_, &r_data = other.data_ ](size_t l, size_t r) { return l_data[l] == r_data[r];});
200
+ const auto index = make_index (data_);
201
+ for (const auto & val : other.data_ ) {
202
+ if (!std::binary_search (index.begin (), index.end (), val,
203
+ [&data = data_](const auto & l, size_t r) {return l < data[r];})) {
204
+ return false ;
205
+ }
206
+ }
204
207
return true ;
205
208
}
206
209
@@ -221,14 +224,14 @@ class ColumnMapT : public ColumnMap {
221
224
222
225
template <typename T>
223
226
inline void Append (const T& value) {
224
- using BaseIter = typename T::const_iterator ;
227
+ using BaseIter = decltype (value. begin ()) ;
225
228
using KeyOfT = decltype (std::declval<BaseIter>()->first );
226
229
using ValOfT = decltype (std::declval<BaseIter>()->second );
227
230
using Functor = std::function<std::tuple<KeyOfT, ValOfT>(const BaseIter&)>;
228
231
using Iterator = ProjectedIterator<Functor, BaseIter>;
229
232
230
233
Functor functor = [](const BaseIter& i) {
231
- return std::make_tuple (i->first , i->second );
234
+ return std::make_tuple (std::cref ( i->first ), std::cref ( i->second ) );
232
235
};
233
236
234
237
typed_data_->Append (Iterator{value.begin (), functor}, Iterator{value.end (), functor});
0 commit comments