【问题标题】:How do I clear 2D Vector in C++如何在 C++ 中清除 2D 矢量
【发布时间】:2014-10-21 15:55:41
【问题描述】:

任何人都可以建议我,如何在 C++ 中清除 2D 矢量。 我必须编写需要在 Matrix 、 Process 和 Clear Matrix 中读取的程序,并为下一次读取操作做好准备。我已经创建了带有矢量的二维数组> 我正在填充但未能重置。下面是代码供参考。

#include<iostream>
#include<vector>
#include<algorithm>


using namespace std;


#define MAX 501
typedef std::vector<std::vector<int>> vec2d;
vec2d matrix(MAX , std::vector<int>(MAX, 0));

void main()
{
    int tc; 
    int N;

    for(tc =0 ; tc < 20;tc++)
    {
        int temp;
        scanf("%d",&N); 

        int result =0;

        for(int i = 0; i < N;i++)
        {
            for(int j=0; j<N;j++)
            {               
                scanf("%d",&temp);
                matrix[i][j]=temp;
            }
        }
        // Do Some processing with 2D vectory Array 

        matrix.clear(); // Now I want to clear 2D vector but only vector contents, and get ready for new input reading  
                    // How do I do it with 2d Vector ? 
        cout << result << endl;
    }
}

【问题讨论】:

  • 如果覆盖,则无需先将值重置为0
  • 我需要问一下。如果您只是要重新分配值,为什么还要将它们重置为 0?
  • 这是必需的,因为矩阵不会完全填充,而是部分填充。因此,在处理时需要空值作为 0 或其他一些负值。虽然在上面的代码中,我正在对整个数组进行 scanf。

标签: c++ vector stl


【解决方案1】:

这是 C++11 中的两种方式

std::for_each(matrix.begin(), matrix.end(), [](std::vector<int>& v)
{
    std::fill(v.begin(), v.end(), 0);
});

for(auto elem& : matrix) std::fill(elem.begin(), elem.end(), 0);

你也可以使用常规的 for 循环

for (size_t y = 0; y < matrix.size(); y++)
{
    for (size_t x = 0; x < matrix[y].size(); x++)
    {
        matrix[y][x] = 0;
    }
}

【讨论】:

  • 如果我们谈论 C++11,那么 for range for(auto elem&amp; : matrix) std:: fill(elem.begin(), elem.end(), 0);?
  • 感谢您的美言!
【解决方案2】:

另一种选择是:

matrix = vec2d(MAX , std::vector<int>(MAX, 0));

为了避免每次分配,你可以缓存值:

static const vec2d matrix_zero = vec2d(MAX , std::vector<int>(MAX, 0));

并且每次你想重置矩阵时:

matrix = matrix_zero;

【讨论】:

  • 不幸的是效率较低,因为它会执行动态内存分配。
  • 缓存值可能比每次简单地分配一个新向量更有效,但不幸的是它不可扩展,因为当作者决定要填充除数字以外的数字时,它会很快变得混乱0.
  • 不幸的是,您现在将永远在内存中留下一些无用的数据。
  • 我觉得这个选项对我来说看起来更好,而不是每次都重复整个数组(501 x 501 项)来清除
  • @Sandeep:请注意,在木头下,它将执行循环或等效操作。
【解决方案3】:

抱歉来晚了,实际上我在 2014 年不知道编码。 我有一个结果, 我希望你可以尝试使用 memset。

 memset(matrix,0,sizeof(matrix));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 2013-05-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2016-04-25
    • 2018-09-29
    相关资源
    最近更新 更多