迭代器"指向"一个对象的成员

det*_*zed 7 c++ iterator stl

我承认我很难找到合理的描述.我想不出一个能够准确描述我正在寻找什么的好词.也许这可以称为切片迭代器.

假设我有这样的事情:

struct S
{
    int i;
    char *s;
    float f;
};

std::vector<S> v(10);
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一种构造迭代器的方法,它将指向一个成员S.我希望能够将它传递给类似于std::min_element在每种情况下都不创建谓词的东西.可能看起来像这样的东西:

std::min_element(slicing_iterator(v.begin(), S::f), slicing_iterator(v.end(), S::f));
Run Code Online (Sandbox Code Playgroud)

有没有我可以用来实现这个的模板技巧?或许它已经在Boost或其他一些图书馆的某个地方完成了?

Cub*_*bbi 13

如果你正在寻找一个将S转换为S :: f的迭代器,那么肯定可以使用boost来实现(不可能是什么?):

std::cout << *std::min_element(
               boost::make_transform_iterator(v.begin(), boost::bind(&S::f, _1)),
               boost::make_transform_iterator(v.end(), boost::bind(&S::f, _1))
              ) << '\n';
Run Code Online (Sandbox Code Playgroud)

测试:https: //ideone.com/jgcHr

但是如果你正在寻找其S :: f在向量中最小的S,则谓词是最合理的方法.