矢量调整大小后下标超出范围
Posted
技术标签:
【中文标题】矢量调整大小后下标超出范围【英文标题】:Getting subscript out of range after vector resize 【发布时间】:2021-12-16 05:15:25 【问题描述】:我有一个二维的字符串向量。它已经有一些数据——一般来说,所有行(应该)都有相同的列数。
我希望通过将列数增加 1 来调整矩阵大小。
std::vector<std::vector<std::string>> completeMatrix;
matrixRowNum = completeMatrix.size();
matrixColumnNum = completeMatrix[0].size();
completeMatrix.resize(matrixRowNum, std::vector<std::string>(matrixColumnNum + 1)); //My attempt to resize by 1. Same result if I try 20.
completeMatrix[0][matrixColumnNum] = "inputString"; //getting subscript out of range error here.
completeMatrix[0][matrixColumnNum-1] = "inputString"; //however this works fine. it's like I never called resize.
我错过了什么? (如果有比向量更好的方法来做到这一点,我也会接受这些方面的任何建议)。
(如果有帮助,我在 Windows 10 上使用 Visual Studio 2019)。
【问题讨论】:
您是否尝试调试代码?提示:调整大小不会预先设置所需的值。 你认为matrixRowNum
包含什么价值?
matrixRowNum
包含我希望看到的值(在我的特定情况下为 198)。
【参考方案1】:
您的resize
调用只会影响新行。所有现有行均不受影响。
但你甚至没有添加行!您调用了resize
并传递了与当前大小相同的值。所以什么都不会发生。您似乎对这次通话中发生了多少魔法和读心术有误解。
您需要遍历行并调整每一行的大小。这是您可以做到的一种方法:
typedef std::vector<std::vector<std::string>> StringMatrix;
void AddColumns(StringMatrix& m, size_t count = 1, const std::string& val = "inputString")
if (m.empty() || count < 1)
return;
size_t cols = m.front().size() + count;
for (auto& row : m)
row.resize(cols, val);
【讨论】:
我已经成功地在其他地方使用了调整大小,如this answer 中所述。唯一的区别是我只是在初始化后不久才使用它,而不是使用预先填充的向量。 是的,而且差别很大,不是吗... 这种行为是否记录在某处? (不是争论,只是好奇)。 en.cppreference.com/w/cpp/container/vector/resize .. 注意“新值”是默认值。现有值保持不变。谢天谢地! 谢谢!我想我明白了。当我使用带有两个参数的调整大小时,我在脑海中想象我正在告诉向量神奇地增加行和列。它实际上在做的是创建“新”一维向量并将它们“分配”为另一个维度中的向量的值。由于存在“现有值”,因此速记不起作用。以上是关于矢量调整大小后下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章