【发布时间】:2020-09-06 14:27:04
【问题描述】:
假设我有以下数据结构,其中包含 2 个 int 值 key_x 和 key_y + 一些附加字段。
struct data_object {
int key_x;
int key_y;
//....
};
并使用composite_key 提升multi_index_container,包括key_x 和key_y 成员。
struct by_xy;
typedef multi_index_container<
data_object,
indexed_by<
// ....
ordered_non_unique< tag<by_xy>,
composite_key< data_object,
member<data_object, int, &data_object::key_x>,
member<data_object, int, &data_object::key_y>,
>
>
>
> data_object_multi_index_type;
typedef generic_index<data_object, data_object_multi_index_type> data_index;
我需要获取所有data_object's,其值key_x == 0 和key_y < 100 并设置key_x = 100。
所以问题是迭代索引并使用下面的函数修改它是否正确?是否会导致索引重建、重大性能问题或非预期行为?
解决这个问题的正确方法是什么?
void foo() {
const auto& data_idx = get_index_type<data_index>().indices().get<by_xy>();
const auto range = data_idx.equal_range( boost::make_tuple( 0 ) );
for( const data_object& data_obj : boost::make_iterator_range( range.first, range.second ) ) {
if( data_obj.key_y < 100 ) {
modify( data_obj, []( data_object& var ) { var.key_x = 100; } );
}
}
}
UPD:有时此解决方案会导致内存访问冲突并且无法正常工作,因为索引重建和范围内的迭代器变得无效。迭代和修改的解决方案是什么?
【问题讨论】:
标签: c++ boost boost-multi-index