我在处理 C++ 数组中的数据时遇到了另一个问题。我现在想通过从中删除所有零来抽取数组。
因此,例如说在我拥有array[4] = {1,2,0,0,4}
它之前会变成array[3] = {1,2,4}
.
我知道我需要使用 for 循环来遍历存储主要数据的数组,并且我很可能需要初始化一个新数组来存储抽取的数据,但我不太确定如何去做。
您无法调整普通数组的大小,因为它是静态分配的。因此,使用vector
标准库 (STL) 中的 a 可能会更好。以这种方式,您不需要创建新数组。实际上,除非有充分的理由,否则通常使用std::vector
or 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)。这可能会节省内存(尤其是当向量中有很多元素时)。
如果您必须调整数组的大小,为什么不简单地使用 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;
}
如果你不知道数组的内容,你就无法知道有多少值是非零的,所以你的内存必须是动态分配的。使用std::vector
.
std::vector<int> v;
std::copy_if(begin(array), end(array), std::back_inserter(v),
[](int x) { return x != 0; });
如果您从 avector
开始,您可以使用擦除删除就地操作数据。
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; });
除非您知道所有输入,否则实际上没有解决方案可以在这里达到固定大小的数组。
假设你有一个数组,你想删除数组中的 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;
如果您满意,请随时标记已回答的问题。