【问题标题】:modify() boost multi-index keys during iterationmodify() 在迭代期间提升多索引键
【发布时间】:2020-09-06 14:27:04
【问题描述】:

假设我有以下数据结构,其中包含 2 个 intkey_xkey_y + 一些附加字段。

struct data_object {
    int key_x;
    int key_y;

    //....
};

并使用composite_key 提升multi_index_container,包括key_xkey_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 == 0key_y &lt; 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


    【解决方案1】:

    您没有提供MCVE,所以很难说是哪里出了问题。特别是,您使用的这个 modify 函数不是 Boost.MultiIndex 接口的一部分,因此我们需要您在此处提供它的定义。

    考虑到这一点,可能发生的情况是修改data_obj 以使key_x==100 导致指向它的(隐式)迭代器跳出key_x==0 定义的范围.您需要进行遍历,确保您的范围的下一个位置在 修改之前得到保护,例如:

    for(auto it=data_idx.lower_bound(0);it!=data_idx.end()&&it->key_y<100;) {
        data_idx.modify(it++, []( data_object& var ) { var.key_x = 100; } );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2018-10-22
      • 2023-03-28
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多