gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:46:32 26 4
gpt4 key购买 nike

我有两个 vector 。一个实际保存数据(比如说 float ),一个保存索引。我想在 nth_element 处传递索引 vector ,但我希望比较由实际保存数据的 vector 完成。我在考虑仿函数,但我猜这只提供了 () 运算符。我通过使数据 vector 成为全局 vector 来实现这一点,但这当然不是我们想要的。

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];
}

关于c++ - 使用容器中的第 n_th 个元素,但使用另一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23471045/

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