矢量调整大小后下标超出范围

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 .. 注意“新值”是默认值。现有值保持不变。谢天谢地! 谢谢!我想我明白了。当我使用带有两个参数的调整大小时,我在脑海中想象我正在告诉向量神奇地增加行和列。它实际上在做的是创建“新”一维向量并将它们“分配”为另一个维度中的向量的值。由于存在“现有值”,因此速记不起作用。

以上是关于矢量调整大小后下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章

调整大小后保持对矢量元素的引用有效

C#表单,调整表单大小后,图像无法超出原始表单大小

MPI_Gatherv 向量下标超出范围

如果节点超出 javafx 的边界,是不是可以自动调整窗格大小

内存访问错误 - 矢量调整大小

调整对象矢量大小时出错