std::rotate 向右旋转给我带来堆溢出

问题描述 投票:0回答:1

我正在尝试解决 this leetcode 问题,其中我应该对向量执行 k 个位置的右旋转。由于 std::rotate 进行左旋转,我尝试使用反向迭代器来完成相反的结果:

    void rotate(vector<int>& nums, int k) 
    {
        std::rotate(nums.rbegin(), nums.rbegin() + k, nums.rend());
    }

现在这适用于前 2 个测试用例,但是当我提交它时,我收到一个运行时错误,说我有堆溢出,这是错误:

=21==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000034c at pc 0x000000369815 bp 0x7fff32cde700 sp 0x7fff32cde6f8
READ of size 4 at 0x60200000034c thread T0
    #3 0x7f55da0cc082  (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
0x60200000034c is located 4 bytes to the left of 4-byte region [0x602000000350,0x602000000354)

什么给予?我的代码有问题吗?从我的测试来看,似乎没问题。如果这是leetcode平台本身的问题,我会删除这个问题。

c++ stl
1个回答
0
投票

如果要旋转的位置数超过向量的大小,您的代码将会失败。

std::rotate(nums.rbegin(), nums.rbegin() + k, nums.rend());

如果

k >= nums.size()
,那么
nums.rbegin() + k
将是一个无效的迭代器,因此会出现您所看到的运行时错误。

解决方法是根据向量的大小旋转

k
的模数,而不是实际
k
的位置。

std::rotate(nums.rbegin(), nums.rbegin() + k % nums.size(), nums.rend());

例如,如果

nums.size()
为 10,且
k
为 20、30、40,则模数将产生 0,因此不会进行实际旋转。另一方面,如果
k
为 21、22 等,则将完成 1、2 等的实际旋转。

© www.soinside.com 2019 - 2024. All rights reserved.