C++ 对非基本对象使用Boost过滤器迭代器

C++ 对非基本对象使用Boost过滤器迭代器,c++,boost,C++,Boost,假设我有一个从Boost的Multi-Index返回的迭代器,其中每个记录都包含一个age和一个name字段 我用 auto& index = get<age>(m_records); auto ibegin = index.begin(); auto iend = index.end(); 我会使用过滤适配器,使内容更具可读性: for (auto& r : get<age>(m_records) | filtered(name_equal_to("J

假设我有一个从Boost的Multi-Index返回的迭代器,其中每个记录都包含一个age和一个name字段

我用

auto& index = get<age>(m_records);
auto ibegin = index.begin();
auto iend = index.end();

我会使用过滤适配器,使内容更具可读性:

for (auto& r : get<age>(m_records) | filtered(name_equal_to("John"))
    std::cout << r << "\n";
为了使其更加优雅,请使用Phoenix在适当的位置定义名为_john的谓词

auto named_john = phx::bind(&record::name, arg1) == "John";
请参见它,其中它打印了按年龄索引排序的两条记录:

2 John 40
4 John 57
完整示例代码
#包括
#包括
#包括
#包括
#包括
使用boost::multi_index_容器;
使用名称空间boost::multi_索引;
结构记录{
int-id;
std::字符串名;
智力年龄;

friend std::ostream&operator我会使用过滤适配器,以使内容更具可读性:

for (auto& r : get<age>(m_records) | filtered(name_equal_to("John"))
    std::cout << r << "\n";
为了使其更加优雅,请使用Phoenix在适当的位置定义名为_john的谓词

auto named_john = phx::bind(&record::name, arg1) == "John";
请参见它,其中它打印了按年龄索引排序的两条记录:

2 John 40
4 John 57
完整示例代码
#包括
#包括
#包括
#包括
#包括
使用boost::multi_index_容器;
使用名称空间boost::multi_索引;
结构记录{
int-id;
std::字符串名;
智力年龄;

friend std::ostream&operator@sehe的答案绝对正确,但如果您关心效率,那么这并不是检索按年龄排序的所有john的最快方法。假设您的容器有N个元素,其中有M个john。因此:

  • 遍历按年龄排序的所有元素并按“John”过滤需要N个步骤
  • 检索所有Johns并按年龄排序(如中所述)需要(大致)2个log(N)步骤来检索Johns的范围,一个临时向量的分配,M个步骤来填充它,O(M·log(M))来排序它,M来遍历它

  • 因此,它是O(N)对O(log(N)+M·log(M))。我打赌当M@sehe的答案绝对正确时,2比1快,但如果您关心效率,那么这不是检索所有按年龄排序的john的最快方法。假设您的容器有N个元素,其中有M个john。因此:

  • 遍历按年龄排序的所有元素并按“John”过滤需要N个步骤
  • 检索所有Johns并按年龄排序(如中所述)需要(大致)2个log(N)步骤来检索Johns的范围,一个临时向量的分配,M个步骤来填充它,O(M·log(M))来排序它,M来遍历它

  • >这是O(n)vs. O(log(n)+m·log(m))。当m是可怕的时,我猜2比快1,但是i in(Auto&R:GET(MyRead)”过滤(NAMEDJEY JON)如何工作?我不认为我可以在我使用的C++版本中使用每一个;(取名约翰)工作?我认为我不能在我使用的C++版本中使用A;或者,它本身会造成语法错误。我可以用它来学习,我只是好奇,因为我一直在学习Boost。这是FoT,我只选择忽略这个问题,因为它显然不是问题的焦点。为了确保OP意识到所涉及的权衡。顺便说一句,你提出的代码非常优雅。很好,我可以使用它,我只是好奇,因为我一直在尝试了解Boost。这是正确的,我只是选择忽略这个问题,因为这显然不是问题的重点。@sehe绝对,只是想确保OP是正确的注意所涉及的权衡。顺便说一句,你提出的代码非常优雅。