自定义动态数组向右旋转问题:std::rotate运行时错误求解
嘿,我来帮你解决这个右旋转的问题!首先得给你点个赞,左旋转的实现是完全正确的——std::rotate(m_array, m_array + 1, m_array + m_size)确实和vector里的std::rotate(v.begin(), v.begin() + 1, v.end())效果一致,每次把第一个元素移到末尾,完美完成一步左旋转。
那右旋转出问题,多半是你没摸透std::rotate的参数逻辑,或者用反向迭代器的时候没适配好原生指针的情况。下面给你两种靠谱的实现方式:
方式一:用正向迭代器实现右旋转
如果你的需求是把最后一个元素移到开头(对应vector里的std::rotate(v.begin(), v.end() - 1, v.end())),直接给原生指针传正确的参数就行:
std::rotate(m_array, m_array + m_size - 1, m_array + m_size);
给你拆解下std::rotate的逻辑:它的三个参数是[first, middle, last),功能是把[first, middle)区间的元素整体移到[middle, last)区间的后面。当middle设为m_array + m_size -1时,就是把前m_size-1个元素移到最后一个元素的后面,刚好完成一次右旋转,完全符合你的需求。
方式二:用反向迭代器实现右旋转
如果你想对应vector里用反向迭代器的写法(比如std::rotate(v.rbegin(), v.rbegin()+1, v.rend())),那得给你的数组指针包装成反向迭代器才行——毕竟原生指针本身是随机访问迭代器,直接套std::reverse_iterator就可以用:
#include <iterator> // 别忘了包含这个头文件 std::rotate(std::reverse_iterator<int*>(m_array + m_size), std::reverse_iterator<int*>(m_array + m_size) + 1, std::reverse_iterator<int*>(m_array));
这里要注意反向迭代器的对应关系:v.rbegin()其实对应vector的v.end(),也就是你的数组里的m_array + m_size;v.rend()对应v.begin(),也就是m_array。用反向迭代器做rotate,本质是在反向视角下做左旋转,映射回原数组就是我们要的右旋转效果。
为啥你之前会报错?
大概率是参数顺序搞错了——比如你可能写了std::rotate(m_array + m_size -1, m_array, m_array + m_size)这种不符合[first, middle, last)规则的代码,或者误用了反向迭代器的范围,导致迭代器越界,触发了运行时错误。另外也要确认你的m_size是准确的元素个数,m_array指向的内存是有效且足够的,这是避免运行时问题的基础。
内容的提问来源于stack exchange,提问作者Phil C

