索引 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
将包含相同的 line
s 多次
当我访问任何索引时程序崩溃,更新代码以访问 [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 << output_vector[0][0] << endl;
符合您的预期,您也不应该假设它对来自文件的所有输入都有效。从文件中读取时,请考虑出现问题,并且从一开始就考虑到从错误中恢复要容易得多,而不仅仅是在错误已经发生时。即检查output_vector
的大小,即使你“知道”它是从文件中正确填充的以上是关于索引 2D 矢量正在使我的程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
mmap.setonMarkerDragListener 使我的应用程序崩溃
导航抽屉:fragmentTransaction.commit() 使我的应用程序崩溃