如何在 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::vector
和std::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_copy
或std::copy_if
将不匹配的元素复制到另一个数组,但为了做到这一点,您必须分配另一个元素数组。此时,您最好使用动态增长的数组,例如std::vector
。在这种情况下,使用std::vector::erase
就像here in the answers 和std::remove
。
【讨论】:
但是您实际上并没有从数组中删除它们。 @NathanOliver 只要你使用迭代器,没关系。我还提供了另一个(未经加工的)解决方案,它确实得到了一个只包含所需元素的数组,但是另一个答案已经做了同样的事情。以上是关于如何在 C++ 中删除小于 X 的数组中的整数?的主要内容,如果未能解决你的问题,请参考以下文章