矢量填充和调整大小

时间:2012-12-02 19:17:30

标签: c++

我正在研究地图生成器。我正在使用二维向量来保存数据。

部首:

class MapGenerator
{
public:
     ...
protected:
    std::vector< std::vector<int> > map;
...
}

一旦MapGenerator实现了,它的大小就已知了,我想知道是否有一种更清晰的方法来正确地调整它并用0填充它比我现在做的那样:

MapGenerator::MapGenerator(int dimensionX, int dimensionY) 
: dimensionX(dimensionX), dimensionY(dimensionY)
{
    map.resize(dimensionX);

    for(int i = 0 ; i < map.size() ; i++)
    {
       map[i].resize(dimensionY);
       fill(map[i].begin(), map[i].end(), 0);
    }

}

此代码工作正常,但如果有更清洁或更优化的方法,我想知道。我在MinGW下使用GCC,我认为我没有启用C ++ 11。

3 个答案:

答案 0 :(得分:2)

我从2D数组类开始,类似这样:

template <class T>
class array_2D { 
    std::vector<T> data;
    size_t cols;
public:
    array_2D(size_t x, size_t y) : cols(x), data(x*y) {}

    T &operator()(size_t x, size_t y) { return data[y*cols+x]; }
};

无需明确对其进行零填充。在创建std::vector或调整其大小时,会传递一个用于填充新“空”空格的值。如果您没有显式传递另一个值,它将使用T(),如果是内置算术类型(shortint,{{ 1}}等等。)

请注意,如上所述,它使用括号进行寻址(如Fortran或BASIC),因此要创建2D数组并用随机数填充它,您可以执行以下操作:

long

可以编写一个使用array_2D<int> x(10, 10); for (int i=0; i<10; i++) for (int j=0; j<10; j++) x(i, j) = rand(); 语法进行2D寻址的类,但它足够复杂,除非你真的设置在该语法上,否则更容易避免它。如果您真的想要,可以在older answer中看到一个示例(带有3D数组类)。

答案 1 :(得分:1)

通过使用地图本身的附加类不会使事情变得复杂,这似乎是最简单的方法。

如果您希望避免“填充”函数调用,您可能想查看该行

fill( map[i].begin(), map[i].end(), 0)

可以替换为您自己的循环,例如“

for(int j = 0 ; j < map[i].size() ; j++){ map[i][j] = 0;}

它可能不会增加您的时间复杂度,但它可能会对您的空间复杂性产生影响。

答案 2 :(得分:0)

resize有第二个参数,即要填充的值。明确map[i].resize(dimensionY, 0)就足够了。