从文件创建二维矢量

Creating a two-dimensional vector from a file?

本文关键字:二维 文件创建      更新时间:2023-10-16

我正在尝试从网格中读取数据,在20x20文件中。我用的是字符串向量的二维向量。

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
#define HEIGHT 20
#define WIDTH 20
typedef vector<vector<string> > stringGrid;
bool readGrid(stringGrid& grid, string filename) {
    grid.resize(HEIGHT);
    for (int i = 0; i < HEIGHT; i++)
        grid[i].resize(WIDTH);
    ifstream file;
    string line;
    file.open(filename.c_str());
    if (!file.is_open()) {
        return false;
    }
    for (int i = 0; i < HEIGHT; i++)
    {
        while (getline(file, line)) {
            grid[i].push_back(line);
        }
    }
    return true;
}
void displayGrid(stringGrid grid)
{
    for (int row = 0; row < HEIGHT; row++)
    {
        for (int col = 0; col < WIDTH; col++)
        {
            cout << grid[col][row];
        }
        cout << endl;
    }
}

int main(){
    stringGrid grid;
    readGrid(grid, "test.txt");
    displayGrid(grid);
    return 0;
}

然而,当我运行这段代码时,程序只输出一些空行。为什么这段代码不能工作?逻辑似乎很合理。

您可以按照Kocik所说的做,或者您可以在代码中使用 vector::reserve 而不是vector::resize。它应该可以工作。

reserve只是保留足够的内存,以避免在推回项时重新分配内存。resize实际上通过添加n默认项来调整向量的大小。在你的例子中,这些项是字符串的空向量,所以在你随后推回的任何其他项之前,你将在你的向量中得到20个这样的项。

下面是关于这两种方法区别的更多信息

在使用grid[i].resize(WIDTH);创建了20个元素之后使用grid[i].push_back(line);。push_back方法在vector的末尾添加新元素,因此新元素的索引为21,22 ..40 .

你有两个选择:

  • 你可以用一些迭代器为初始化的元素设置新值,或者
  • 你可以跳过调整大小并将新元素推入空向量。只需删除这两行:
    for (int i = 0; i &lt; HEIGHT; i++)
        grid[i].resize(WIDTH);</li>
    

顺便说一句,使用向量的向量通常被认为是不好的做法。相反,使用包装单个向量并进行索引运算的类(x*h+y或y*w+x取决于您想要的主要顺序)。