gpt4 book ai didi

c++ - 使用 boost::bind() 在 std::min_element() 的自定义函数中填充结构

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:23 24 4
gpt4 key购买 nike

尝试在我的 vector 上保存一次迭代。

我有一个 vector<T>我需要在 vector 中找到最小元素。

我正在使用 std::min_element .现在需要创建一个自定义结构,其元素为 <T>加上一些额外的,即时计算的。

所以我正在尝试使用 boost::bind() 的函数像这样:

std::vector<MyStruct> myStructObj;
typename std::vector< T >::iterator it = std::min_element(V.begin(), V.end(), boost::bind(BuildStructAndFindMin, myStructObj, _1, _2));

但是我应该如何定义 BuildStructAndFindMin 函数呢?到现在为止,我从来不需要创建这样的自定义函数。

  1. _1 和 _2 表示 V 内容的两个 ref 对象。但是它们中哪个是最小的?我的意思是:std::min_element()'s定义将迭代一个 vector 。对于拳头调用,它只会发送前两个元素。对于第二次调用,将发送 vector 中的第三个元素和 last_found_min 元素。 _1 或 _2 将是 last_found_min?如何返回一个迭代器?我模糊的草图是这样的:

    std::vector< T >::iterator BuildStructAndFindMin (std::vector<MyStruct>& myStructObj, const T &a, const T &b)
    {
    if(<a_min_condition>) // I am aware of this if statement. Just assume it to be a<b
    {
    // the point which is greater - create a struct object for that
    // and push_back in myStructObj

    return //what?;
    }
    else
    {
    // the point which is greater - create a struct object for that
    // and push_back in myStructObj

    return //what?
    }
    }

调用此函数后,我将得到一个 min_element ,但它不会出现在 myStructObj 中。所以我会把它放在开头。

制作这部戏剧的全部意义在于节省一次迭代。

最简单的方法是:遍历一个 vector 并构建一个结构。然后调用std::min_element() .但不知何故,我只争了几纳秒,在这种情况下时间就是金钱。

最佳答案

std::min_element 的第三个参数可以是这样的类:

struct myclass { 
bool operator() (int i,int j) { return i<j; }
};

在一个比较类中,你可以存储任何你想要的信息,你可以实现任何你想要的逻辑。如果有必要,您甚至可以将 boost::bind 之类的东西作为参数传递给其构造函数。

template< typename T, typename TSTRUCT, typename TBIND >
struct MyCompare
{
MyCompare( TSTRUCT &myStruct, T &ref1, T &ref2, TBIND bind )
: _myStruct( myStruct )
, _1( ref1 )
, _2( ref2 )
, _bind( bind )
{}
bool operator()( const T &a, const T &b )
{
// enter your code her
return ...;
}

TSTRUCT &_myStruct;
T &_1;
T &_2;
TBIND &_bind;
};

template< typename T >
struct MyStruct
{
std::vector< T > V;
T obj1;
T obj2;
typename std::vector< T >::iterator it = std::min_element(V.begin(), V.end(), MyCompare<T,MyStruct>( *this, obj1, obj2, boost::bind( ... what ever ... ) ) );
};

关于c++ - 使用 boost::bind() 在 std::min_element() 的自定义函数中填充结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34555196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com