gpt4 book ai didi

c++ - 如何以适合 C++ 的方式删除数组中的最小和最大元素?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:51:14 26 4
gpt4 key购买 nike

假设我有一个整数数组,我想调用一个函数来删除最小值和最大值。删除是指如果我的初始数组长度为 7 个元素,则新数组有 5 个元素。其余元素的顺序无关紧要。我想出了一些方法来做到这一点,但我不确定哪一种是 C++ 的“方式”,如果这有意义的话。

我现在所拥有的是我使用 std::sort 对我的数组进行排序,然后我使用 for 循环将结果从第二个元素开始复制到倒数第二个元素到一个新数组中合适的尺寸。我应该如何返回数组?

我无法返回新创建的数组,因为它是函数的局部变量。我可以将新数组作为参数传递给函数,但这不是更旧的 C 风格的方式吗?我也可以使用 std::vector,但我必须将数组包装在一个 vector 中,然后再打开它(数字需要保留在一个整数数组中)。看起来有点矫枉过正,不是吗?

我有 Python 背景,我只想知道在 C++ 中更合适的方法是什么。

最佳答案

如果数字必须保留在一个整数数组中并且顺序无关紧要,我会这样做:

void MoveHiLoToEnd(int orig[], int size)
{
int* last = orig + size - 1;
int* maxp = std::max_element(orig, orig + size);
std::iter_swap(maxp, last);
int* minp = std::min_element(orig, orig + size - 1);
std::iter_swap(minp, last - 1);

//now the original array contains max and min elements moved.
//to the end. You can ignore them or copy elements except
//those last two to a new array, if really necessary.
}

签名

int* MoveHiLoToEnd(int* begin, int* end);

更多的是C++库风格 可以改成模板

template<typename ForwardIter>
ForwardIter RemoveHiLo(ForwardIter begin, ForwardIter end);

将迭代器返回到旧的 min 元素(经过新的截断集合) ,但我怀疑这是否值得。这将需要在调用中使用不同的(我认为不太方便)参数。

编辑

抱歉,模板的想法很糟糕。事情变得复杂了。您将不得不要求双向迭代器(这使得模板的通用性不如前向迭代器。对于 min 和 max_element 前向就足够了)

template<typename BidirectionalIterator>
BidirectionalIterator RemoveHiLo(BidirectionalIterator begin, BidirectionalIterator end);

或非标准输入参数,因为您需要指向最后一个元素的迭代器。

关于c++ - 如何以适合 C++ 的方式删除数组中的最小和最大元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3452712/

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