string half_password = password.str();
if(shift < 0) //left shift
rotate(half_password.begin(), half_password.begin() + (-1*shift), half_password.end());
if(shift > 0) //right shift
rotate(half_password.rbegin(), half_password.rbegin() + shift, half_password.rend());
现在,如果| shift | &GT; 7 half_password
的长度为8,然后我的程序崩溃并出现分段错误。我的问题是rotate
函数不允许旋转超过字符串的最高索引吗?
我对此没有问题,逻辑运行正常。我想知道这是rotate
函数的工作原理。
答案 0 :(得分:2)
答案 1 :(得分:1)
std::rotate
的第二个参数是一个迭代器,它指向你想要在字符串开头的元素,并说它很容易理解给它一个元素的迭代器通过容器的结束/开始将导致崩溃。
您可以使用模数运算符 %
来解决此问题,以限制将shift
添加到始终位于0
之间的结果而不是容器的长度。
#include <iostream>
#include <algorithm>
#include <string>
std::string
shift_it (std::string const& src, int shift)
{
std::string dst = src;
if (shift < 0)
std::rotate (dst.begin (), dst.begin () + (+shift % dst.size ()), dst.end ());
else
std::rotate (dst.rbegin (), dst.rbegin () + (-shift % dst.size ()), dst.rend ());
return dst;
}
int
main (int argc, char *argv[])
{
std::cerr << shift_it ("hello", 7) << std::endl;
std::cerr << shift_it ("hello", 2) << std::endl;
std::cerr << shift_it ("hello", -7) << std::endl;
std::cerr << shift_it ("hello", -2) << std::endl;
}
输出:
lohel
lohel
llohe
llohe
答案 2 :(得分:1)
第二个参数是 middle ,所以它应该位于开头和结尾之间。做一个<middle value> % (end() - begin())
以确保这一点。