索引 2D 矢量正在使我的程序崩溃

Posted

技术标签:

【中文标题】索引 2D 矢量正在使我的程序崩溃【英文标题】:Indexing a 2D vector is crashing my program 【发布时间】: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 的析构函数将为您关闭文件。 【参考方案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 的大小,即使你“知道”它是从文件中正确填充的

以上是关于索引 2D 矢量正在使我的程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

mmap.setonMarkerDragListener 使我的应用程序崩溃

iOS上的Facebook登录使我的应用程序崩溃

更改为横向会使我的 Android 应用程序崩溃

导航抽屉:fragmentTransaction.commit() 使我的应用程序崩溃

as3 scanHardware() 函数使我的应用程序崩溃

核心情节使我的应用程序使用仪器崩溃