error: Vector下标超出范围错误

error : Vector subscript out of range error

本文关键字:范围 错误 下标 Vector error      更新时间:2023-10-16

我在c++中有这个代码,我使用向量,但我得到了这个错误:

error: Vector下标超出范围错误。

在这个问题上有人能帮我吗?
int const TN = 4;
vector <uint32_t> totalBytesReceived(TN);
void ReceivePacket(string context, Ptr <const Packet> p)
{
    totalBytesReceived[context.at(10)] += p->GetSize();
}
void CalculateThroughput()
{
    double mbs[TN];
    for (int f = 0; f<TN; f++)
    {
        // mbs = ((totalBytesReceived*8.0)/100000);
        mbs[f] = ((totalBytesReceived[f] * 8.0) / 100000);
        //totalBytesReceived =0;
        rdTrace << Simulator::Now().GetSeconds() << "t" << mbs[f] << "n";
        Simulator::Schedule(Seconds(0.1), &CalculateThroughput);
    }
}

看起来

totalBytesReceived[context.at(10)] += p->GetSize();

抛出异常,因为context的位置10的字符超出了范围。因为你用它来索引向量,它必须在03的范围内。

看你发的context的内容:

"/NodeList/" 1 "/DeviceList/*/$ns3::WifiNetDevice/Mac/MacRx"
 ^         ^ ^
 0        10 12

如果您想提取1并将其用作索引,您需要使用:

char c = context.at(12); // Extract the char.
int index = c - '0'; // Convert the character '1' to the integer 1.

这是因为ASCII标准决定了字符如何存储为数字。

可能真正的问题是您获得字符'1'并使用其ASCII值作为向量的索引,而不是预期的整数值1。

这种越界访问是未定义的行为,在你的情况下会导致异常。


以下不是原因,留作参考:异常可能来自以下表达式:

context.at(10)

这是实际执行边界检查的唯一操作(*)。向量operator[]不会这样做,C数组也不会检查它的边界。

那么:你确定字符串上下文不短于11个字符吗?

(*)访问超出边界的向量是未定义的行为,抛出异常是可能的结果。这要感谢β -胡萝卜素和本杰明·林德利。


这是真正的东西:

还要注意,当使用operator[]访问出界索引时,vector不像map那样调整大小,所以除非你能保证字符串中的字符在0到3之间,否则这将是你的下一个问题。

这是指(size_t)0(size_t)3,而不是字符'0''3'