【问题标题】:Indexing a 2D vector is crashing my program索引 2D 矢量正在使我的程序崩溃
【发布时间】:2020-12-07 16:30:05
【问题描述】:

我从 txt 文件中获取输入并将其存储在 2D 向量中。那部分工作正常。一旦我尝试访问 2D 矢量的各个元素,我的程序似乎就会出错。根据我的搜索,我以正确的方式索引向量,所以有人知道为什么这会导致我的代码崩溃吗?

编辑:我正在正确访问向量。 getInput2D() 实际上未能将 temp_vec 附加到 output_vector。那么在这种情况下动态创建二维向量的正确语法是什么?

#include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <vector.>
#include <cmath>

using namespace std;

vector<vector<string>> output_vector{};

void getInput2D() { 
    
    ifstream file("C:\\Users\\ImTheUser\\Documents\\input.txt");
    string line;
    vector<string> temp_vec;
    
    if (file.is_open()) { 
        while (getline(file, line)) {
            if (line[0] != ' ') {
                temp_vec.push_back(line);
                temp_vec.clear();
            }

            else {
                output_vector.push_back(temp_vec);
                temp_vec.clear();
            }
        }
    }
    file.close();
}

int main() {
    
    getInput2D();
    cout << output_vector[0][0] << endl;
    return 0;
}

【问题讨论】:

  • 您应该检查output_vector 的大小,然后在访问[1][2] 之前检查其第二个子向量的大小。根据文件内容,向量的元素可能比您想象的要少
  • 顺便说一句,你永远不会清除 temp_vec 所以最后 output_vector 将包含相同的 lines 多次
  • 当我访问任何索引时程序崩溃,更新代码以访问 [0][0] 结果相同
  • 没有以空格开头的行吗?如果是这样,您将永远不会将temp_vec 添加到output_vector。话虽如此,@largest_prime_is_463035818 已经确定了代码中的 2 个潜在问题,您可能应该修复并重新测试。
  • output_vector.push_back(temp_vec);之后你应该做temp_vec.clear();,在file.close();之前或之后你应该做output_vector.push_back(temp_vec);。在那个主题上,您根本不需要file.close();。 ifstream 的析构函数将为您关闭文件。

标签: c++ vector 2d-vector


【解决方案1】:

我以正确的方式索引向量,所以有人知道为什么这会使我的代码崩溃吗?

假设您绝对确定 output_vector 有 1 个或多个元素,并且它的第一个元素有 1 个或多个元素,这是访问它们的正确方法:

cout << output_vector[0][0] << endl;

但是,当您从外部资源(文件)中读取数据时,您无法绝对确定该向量是否包含任何元素,并且您不应依赖此类假设。而是使用任一循环:

for (const auto& lines : output_vector) {
    for (const auto& line : lines) {
        std::cout << line << '\n';
    }
}

打印向量中实际存在的所有元素。或者之前检查它的大小:

if (output_vector.size() > 0 && output_vector[0].size() > 0) {
     std::cout << output_vector[0][0];
} else {
     std::cout << "error. output_vector is empty\n";
}

【讨论】:

  • 这就是答案。我假设 push_back() 实际上是将 temp_vec 附加到 output_vector,但是在尝试了这两种方法之后,我可以明确地说在我运行 getInput2D() 之后 output_vector 是空的,所以我访问了正确的向量,但是我创建了 output_vector 错误。
  • @Schteve 也许我应该更多地强调它。关键点是:即使您的代码可以正常工作并且cout &lt;&lt; output_vector[0][0] &lt;&lt; endl; 符合您的预期,您也不应该假设它对来自文件的所有输入都有效。从文件中读取时,请考虑出现问题,并且从一开始就考虑到从错误中恢复要容易得多,而不仅仅是在错误已经发生时。即检查output_vector 的大小,即使你“知道”它是从文件中正确填充的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多