c++ - boost multi_index_container、范围变异算法和常量

标签 c++ algorithm boost boost-multi-index boost-range

我使用的是 boost multi_index_container,它由 equal_range 查询,并使用 range::join 和 boost::any_range 从函数返回结果
any_range 引用参数被定义为对该类型的 const 引用 - 由于 multi_index_container 性质,必须是 const,不太确定该引用。示例:

typedef boost::any_range<TestData, boost::random_access_traversal_tag,
                         const TestData &, std::ptrdiff_t> TestRange;

现在我需要的是使用变异范围算法,如 boost::sort、unique 等,由于范围内元素的常量性,这些算法显然不能在范围上运行。
除了将元素复制到新容器之外还有其他解决方法吗?

编辑1:
结构体和MIC示例:

struct TestData {
  TestData()
      : m_strMem01("test"), m_intMem02(rand()),
        m_boolMem03(rand() < RAND_MAX / 2) {}
  std::string m_strMem01;
  int m_intMem02;
  bool m_boolMem03;
};

typedef boost::multi_index_container<
    TestData,
    bmi::indexed_by<
        bmi::random_access<bmi::tag<struct RndKey1>>,
        bmi::ordered_non_unique<
            bmi::tag<struct Key1>,
            bmi::composite_key<
                TestData,
                bmi::member<TestData, std::string, &TestData::m_strMem01>,
                bmi::member<TestData, bool, &TestData::m_boolMem03>>>,
        bmi::ordered_non_unique<
            bmi::tag<struct Key4>,
            bmi::composite_key<
                TestData,
                bmi::member<TestData, std::string, &TestData::m_strMem01>,
                bmi::member<TestData, bool, &TestData::m_intMem02>>>,
        bmi::ordered_non_unique<
            bmi::tag<struct Key2>,
            bmi::member<TestData, int, &TestData::m_intMem02>>,
        bmi::ordered_non_unique<
            bmi::tag<struct Key3>,
            bmi::member<TestData, bool, &TestData::m_boolMem03>>>>
    TestDataContainer;

最佳答案

好吧,一旦你有了你的范围,你真的无法对它进行排序或以某种方式重新排列它,因为元素的顺序是由索引固定的——这是由元素的常量强制执行的绝对基本的索引不变量,就像你会发现有一个std::set。您可以使用对原始元素的指针或引用创建一个更轻量的 View ,而不是对外部容器进行完整复制,以后可以根据需要对其进行操作。这是一个将 View 构造为元素的 std::reference_wrapperstd::vector 的示例:

Live On Coliru

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/range/algorithm/sort.hpp>
#include <boost/range/join.hpp>
#include <functional>
#include <iostream>
#include <vector>

using namespace boost::multi_index;

struct X
{
  int x,y;
};

std::ostream& operator<<(std::ostream& os,const X& a)
{
  return os<<"{"<<a.x<<","<<a.y<<"}";
}

typedef multi_index_container<
  X,
  indexed_by<
    ordered_non_unique<member<X,int,&X::x>>
  >
> multi_t;

struct view:std::vector<std::reference_wrapper<const X>>
{
  using base=std::vector<std::reference_wrapper<const X>>;

  template<typename InputIterator>
  view(InputIterator first,InputIterator last):base(first,last){}

  template<typename InputIterator>
  view(const std::pair<InputIterator,InputIterator> p):base(p.first,p.second){}  
};

int main()
{
  multi_t m={{0,1},{0,0},{0,2},{1,3},{1,1},{2,0},{2,1}};

  view v1=m.equal_range(0); // elements with x==0
  view v2=m.equal_range(2); // elements with x==2
  auto v3=boost::range::join(v1,v2); // join them
  boost::range::sort(v3,[](const X& a,const X& b){return a.y<b.y;}); // sort them by y
  for(const auto& x:v3)std::cout<<x<<" "; // output
}

输出:

{0,0} {2,0} {0,1} {2,1} {0,2} 

关于c++ - boost multi_index_container、范围变异算法和常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27405973/

相关文章:

确定文件身份的算法

c++ - 与 Boost.Bind 相比,Boost.Functional 有什么好处?

c++ - 对 boost Spirit/phoenix/C++11 交互感到困惑

c++ - boost spirit 2:在 qi::parser 上跟随进度百分比。我的代码有什么问题?

c++ - 如何获取被覆盖窗口的像素?

c++ - 调试复杂的返回语句

c++ - libavcodec:ffprobe 对使用 FFV1 编解码器编码的文件报告 "read_quant_table error"

algorithm - 寻找具有最大最小度数的生成树

c++ - Release模式下的访问冲突

algorithm - 如何教电脑做推论