1

1つsequencedのビューからのみ値を削除できる、2 つのビューを持つマルチインデックスを構築したいと考えています。

コード内:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/sequenced_index.hpp>

#include <algorithm>
#include <iterator>
#include <vector>

using namespace boost::multi_index;

typedef multi_index_container<
  int,
  indexed_by<
    sequenced<>,
    sequenced<> 
    > 
  > container;

int main()
{
  container c;
  std::vector<int> 
    // complete
    data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 
    // only uneven
    uneven_data;
  std::copy_if(begin(data), end(data), 
               std::back_inserter(uneven_data), 
               [](int i) { return i % 2 != 0; });

  container cont;
  std::copy(begin(data), end(data), std::back_inserter(cont));

  auto& idx0 = cont.get<0>();
  auto& idx1 = cont.get<1>();
  // remove all uneven from idx1
  idx1.remove_if([](int i) { return i % 2 == 0; });

  // behavior I would like to be true, but now both idx0 and idx1 are
  // equal to uneven_data
  assert(std::equal(begin(data), end(data), begin(idx0)));
  assert(std::equal(begin(uneven_data), end(uneven_data), begin(idx1)));

  return 0;
}

このようなことは可能boost::multi_indexですか?

4

2 に答える 2

2

いいえ。ブースト multi_index_container では、インデックスは同じ値の個別のビューとして結合されます。これは、ブースト multi_index_containers の重要な保証です。

「Boost.MultiIndex を使用すると、要素の同じコレクションへの異なるインターフェイスを持つ 1 つ以上のインデックスで構成される multi_index_containers を指定できます」( boost multi_index チュートリアル)。

2 つの異なる sequenced<> インデックスを使用すると、2 つの異なる方法で順序を並べ替えることができますが、両方にすべての値が含まれている必要があります。

ブール述語 (例: 値が奇数) に従って要素のサブセットを表示する場合は、boost::filter_iteratorの使用を検討してください。これは、コンテナー内の値を消去しようとはしませんが、反復中にそれらをスキップします。

または、選択/フィルタリングは、適切なキー エクストラクタを使用して multi_index ordered_non_uniqueインデックスを使用して順序付けすることによって取得できます。

たとえば、キー エクストラクタ:[](int i) { return i % 2; }に基づく順序付けられた_非固有のインデックスは、奇数と偶数の値を個別のグループに配置するため、すべての奇数の値に対するイテレータ範囲は、equal_rangeを使用して取得できます。

于 2013-04-20T02:08:28.537 に答える