Resolve vector<bool>::iterator crash (#5642)

This commit is contained in:
Rory Mitchell 2020-05-07 21:18:01 +12:00 committed by fis
parent 751160b69c
commit c42f533ae9

View File

@ -82,14 +82,16 @@ template <typename BinIdxType>
class DenseColumn: public Column<BinIdxType> { class DenseColumn: public Column<BinIdxType> {
public: public:
DenseColumn(ColumnType type, common::Span<const BinIdxType> index, DenseColumn(ColumnType type, common::Span<const BinIdxType> index,
uint32_t index_base, uint32_t index_base, const std::vector<bool>& missing_flags,
const std::vector<bool>::const_iterator missing_flags) size_t feature_offset)
: Column<BinIdxType>(type, index, index_base), : Column<BinIdxType>(type, index, index_base),
missing_flags_(missing_flags) {} missing_flags_(missing_flags),
bool IsMissing(size_t idx) const { return missing_flags_[idx]; } feature_offset_(feature_offset) {}
bool IsMissing(size_t idx) const { return missing_flags_[feature_offset_ + idx]; }
private: private:
/* flags for missing values in dense columns */ /* flags for missing values in dense columns */
std::vector<bool>::const_iterator missing_flags_; const std::vector<bool>& missing_flags_;
size_t feature_offset_;
}; };
/*! \brief a collection of columns, with support for construction from /*! \brief a collection of columns, with support for construction from
@ -208,10 +210,8 @@ class ColumnMatrix {
column_size }; column_size };
std::unique_ptr<const Column<BinIdxType> > res; std::unique_ptr<const Column<BinIdxType> > res;
if (type_[fid] == ColumnType::kDenseColumn) { if (type_[fid] == ColumnType::kDenseColumn) {
std::vector<bool>::const_iterator column_iterator = missing_flags_.begin();
advance(column_iterator, feature_offset); // increment iterator to right position
res.reset(new DenseColumn<BinIdxType>(type_[fid], bin_index, index_base_[fid], res.reset(new DenseColumn<BinIdxType>(type_[fid], bin_index, index_base_[fid],
column_iterator)); missing_flags_, feature_offset));
} else { } else {
res.reset(new SparseColumn<BinIdxType>(type_[fid], bin_index, index_base_[fid], res.reset(new SparseColumn<BinIdxType>(type_[fid], bin_index, index_base_[fid],
{&row_ind_[feature_offset], column_size})); {&row_ind_[feature_offset], column_size}));