我在处理C ++数组中的数据时遇到了另一个问题。我现在想要通过从中删除所有零来抽取数组。
例如,在我array[4] = {1,2,0,0,4}
之前说它会成为array[3] = {1,2,4}
。
我知道我需要使用for循环来遍历存储主数据的数组,并且我很可能需要初始化一个新数组来存储抽取数据但是我不太清楚如何去做它
答案 0 :(得分:7)
您无法调整普通数组的大小,因为它是静态分配的。因此,最好使用标准库(STL)中的vector
。以这种方式,您不需要创建新数组。实际上,除非有充分的理由,否则使用std::vector
或std::array
(在C ++ 11中)通常比使用纯C类数组更好。
使用vector
,您可以执行以下操作:
std::vector<int> v{1,2,0,0,4};
v.erase(
std::remove(v.begin(), v.end(), 0),
v.end());
在擦除零元素之后,向量仍然具有容量5,但是(当然v.size()
将返回3,如预期的那样)。如果您可以使用C ++ 11,那么您可以更进一步:
v.shrink_to_fit();
对shrink_to_fit
的调用会降低向量的容量,使其适应其中的实际元素数(示例中为3)。这可能会节省内存(特别是如果向量中有许多元素)。
答案 1 :(得分:3)
如果你必须调整数组的大小,为什么不简单地使用std :: vector。这个例子就是这样做的。
#include <vector>
#include <algorithm>
bool isZero (int i)
{
return i == 0;
}
int main()
{
std::vector<int> myarray;
myarray.push_back( 0 );
myarray.push_back( 1 );
myarray.push_back( 0 );
myarray.push_back( 3 );
myarray.push_back( 9 );
std::vector<int>::iterator newIter = std::remove_if( myarray.begin() , myarray.end() , isZero);
myarray.resize( newIter - myarray.begin() );
return 0;
}
答案 2 :(得分:2)
如果你不知道阵列的内容,你就不知道有多少
值将为非零,因此您的内存必须是动态的
分配。使用std::vector
。
std::vector<int> v;
std::copy_if(begin(array), end(array), std::back_inserter(v),
[](int x) { return x != 0; });
如果您从vector
开头,则可以使用erase-remove操作数据。
v.erase(std::remove(begin(v), end(v), 0), end(v));
如果你真的想这么做:
// count
auto non_zero_count = std::count_if(begin(array), end(array),
[](int x) { return x != 0;});
// allocate
int* new_array{new int[x]};
std::copy_if(begin(array), end(array), new_array,
[](int x) { return x != 0; });
除非您知道所有输入,否则实际上没有解决方案可以达到固定大小的数组。
答案 3 :(得分:0)
假设您有一个数组,并且想要删除数组中的0值并调整其大小。
int toResize[] = {4,3,2,0,8,7,9,0,5,4,7,0}; //12 elements
vector<int>resized;
vector<int>::iterator it;
for(int i=0;i<12;i++){
int check = toResize[i];
if(check!=0){
resized.push_back(check);
}
}
for ( it=resized.begin() ; it < resized.end(); it++ )
cout << " " << *it;
如果您满意,请随时将问题标记为已解答。