从文件创建二维向量?

时间:2014-05-23 23:21:09

标签: c++ arrays file vector

我正在尝试从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;

}

但是,当我运行此代码时,程序只输出一些空白行。 为什么这段代码不起作用?逻辑似乎听起来不够。

3 个答案:

答案 0 :(得分:3)

您可以执行Kocik所说的内容,也可以在代码中使用 vector::reserve 代替vector::resize。它应该可以工作。

reserve只需保留足够的内存,以避免在推回内存时重新分配内存。 resize实际上通过添加 n 默认项来调整向量的大小。在您的情况下,这些项目是字符串的空向量,因此您可以在向后推送任何其他项目之前在向量中获取其中的20个。

Here是关于两种方法之间差异的更多信息。

答案 1 :(得分:0)

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

您有两种选择:

  • 您可以使用某些迭代器或
  • 为初始化元素设置新值
  • 你可以跳过调整大小并将新元素推送到空矢量。只需删除这两行:

    for (int i = 0; i &lt; HEIGHT; i++)
        grid[i].resize(WIDTH);</li>
    
         

答案 2 :(得分:0)

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