2

我在处理 C++ 数组中的数据时遇到了另一个问题。我现在想通过从中删除所有零来抽取数组。

因此,例如说在我​​拥有array[4] = {1,2,0,0,4}它之前会变成array[3] = {1,2,4}.

我知道我需要使用 for 循环来遍历存储主要数据的数组,并且我很可能需要初始化一个新数组来存储抽取的数据,但我不太确定如何去做。

4

4 回答 4

12

您无法调整普通数组的大小,因为它是静态分配的。因此,使用vector标准库 (STL) 中的 a 可能会更好。以这种方式,您不需要创建新数组。实际上,除非有充分的理由,否则通常使用std::vectoror 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)。这可能会节省内存(尤其是当向量中有很多元素时)。

于 2012-07-20T15:13:33.283 回答
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;
}
于 2012-07-20T15:10:00.523 回答
3

如果你不知道数组的内容,你就无法知道有多少值是非零的,所以你的内存必须是动态分配的。使用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; });

除非您知道所有输入,否则实际上没有解决方案可以在这里达到固定大小的数组。

于 2012-07-20T15:11:04.550 回答
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;

如果您满意,请随时标记已回答的问题。

于 2012-07-27T16:19:14.703 回答