如何在 C++ 中删除小于 X 的数组中的整数?

Posted

技术标签:

【中文标题】如何在 C++ 中删除小于 X 的数组中的整数?【英文标题】:How to remove integers in array less than X in C++? 【发布时间】:2018-08-05 22:32:59 【问题描述】:

我在 php 中发现了同样的问题,并尝试在 C++ 中做同样的事情。

我尝试了以下操作:

// returns new array with numbers lower then "number", len is set to
// new length.
int * filter(int array[], int &len, int number) 
    int cnt = 0;
    for (int i = 0; i < len; i++) 
        if (array[i] < number) 
            cnt++;
        
    
    int *ret = new int[cnt];
    cnt = 0;
    for (int i = 0; i < len; i++) 
        if (array[i] < number) 
            ret[cnt] = array[i];
            cnt++;
        
    
    len = cnt;
    return ret;

此函数将使用小于整数number 的整数创建一个新数组。我试图绕过我不知道新数组应该多长时间的问题。

有没有更好的方法来解决这个问题?

【问题讨论】:

std::vector(或std::set,如果更合适的话)+std::remove_if Modern way to filter STL container?的可能重复 您不使用 STL 的矢量类有什么原因吗?您正在返回在本地范围内创建的指针,这是导致内存泄漏的好方法。如果你真的想这样做,至少使用智能指针。 @DennisM。通常建议避免在 C++ 中手动分配数组,但如果需要,请在创建新数组之前计算不符合条件的元素。 有没有更好的方法来解决这个问题? 使用,使用std::vectorstd::remove_if我尝试用特定的数组来解决这个问题。不要那样做。 【参考方案1】:

是的,使用std::vector 类型。每次您向其推送值时,它都会自动为您处理分配(使用push_back 方法)。

示例

#include <iostream>
#include <vector>

int main() 
    std::vector<int> a;
    a.push_back(1);
    a.push_back(2);
    for (int value : a) 
        std::cout << value << '\n';
    

避免new 语法也是一个好主意,因为它不会自动释放,不像std::vector

此外,虽然这与问题无关,但 C++ 提供了一个函数来执行您想要的操作,已经称为 std::copy_if

【讨论】:

感谢您的快速回答,但我打算用数组解决这个问题。我知道可以通过向量来解决它,但我想尝试使用数组。【参考方案2】:

std::remove 是您正在寻找的算法。

#include <iterator>
#include <algorithm>

int main()

    int array[4] = 1, 42, 314, 42;
    // If you only know `array` as a pointer, and `len`, then
    // `std::begin(array)` becomes `array`, and
    // `std::end(array)` becomes `array + len`.
    auto end = std::remove(std::begin(array), std::end(array), 42);
    // Now `end` points to the "new end" of the array.
    // And `std::distance(std::begin(array), end)` is the "new length".

它将所有匹配的元素(示例中为 42)移动到数组的末尾。在运行std::remove 之后检查array 时,您会得到1, 314, 42, 42,并且end 指向最后一个不匹配的元素(在本例中为前42 个)。

也可以使用std::remove_copystd::copy_if 将不匹配的元素复制到另一个数组,但为了做到这一点,您必须分配另一个元素数组。此时,您最好使用动态增长的数组,例如std::vector。在这种情况下,使用std::vector::erase 就像here in the answers 和std::remove

【讨论】:

但是您实际上并没有从数组中删除它们。 @NathanOliver 只要你使用迭代器,没关系。我还提供了另一个(未经加工的)解决方案,它确实得到了一个只包含所需元素的数组,但是另一个答案已经做了同样的事情。

以上是关于如何在 C++ 中删除小于 X 的数组中的整数?的主要内容,如果未能解决你的问题,请参考以下文章

华为机试真题 C++ 实现数组连续和

c++如何将数组压入队列中

P1043 查找小于x的最大元素

如何将 C++ 或 C 中的字符串转换为整数数组?

如何查看数组中的每个值是不是小于某个数字?

上机实践报告