其他分享
首页 > 其他分享> > c-在容器中使用n_th元素,但使用另一个键

c-在容器中使用n_th元素,但使用另一个键

作者:互联网

我有两个向量.一种实际上保存数据(比如说是浮点数),另一种保存索引.我想在nth_element处传递索引向量,但我希望通过实际保存数据的向量来进行比较.我当时在考虑函子,但这只提供了我猜想的()运算符.我通过使数据向量成为全局向量来实现这一点,但这当然是不希望的.

std::vector<float> v;                                   // data vector (global)
bool myfunction (int i,int j) { return (v[i]<v[j]); } 

int find_median(std::vector<int> &v_i)
{
    size_t n = v_i.size() / 2;
    nth_element(v_i.begin(), v_i.begin()+n, v_i.end(), myfunction);
    return v_i[n];
}

解决方法:

您可以使用类似的函子:

class comp_with_indirection
{
public:
    explicit comp_with_indirection(const std::vector<float>& floats) :
        floats(floats)
    {}

    bool operator() (int lhs, int rhs) const { return floats[lhs] < floats[rhs]; }

private:
    const std::vector<float>& floats;
};

然后您可以像这样使用它:

int find_median(const std::vector<float>& v_f, std::vector<int> &v_i)
{
    assert(!v_i.empty());
    assert(v_i.size() <= v_f.size());

    const size_t n = v_i.size() / 2;
    std::nth_element(v_i.begin(), v_i.begin() + n, v_i.end(), comp_with_indirection(v_f));
    return v_i[n];
}

注意:对于C 11,您可以使用lambda而不是命名的函子类.

int find_median(const std::vector<float>& v_f, std::vector<int> &v_i)
{
    assert(!v_i.empty());
    assert(v_i.size() <= v_f.size());

    const size_t n = v_i.size() / 2;
    std::nth_element(
        v_i.begin(), v_i.begin() + n, v_i.end(),
        [&v_f](int lhs, int rhs) {
            return v_f[lhs] < v_f[rhs];
        });
    return v_i[n];
}

标签:median,stl-algorithm,c,functor,stl
来源: https://codeday.me/bug/20191013/1910920.html