2
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| > 7 且长度half_password为 8,则我的程序因分段错误而崩溃。我的问题是该rotate函数是否不允许旋转超过字符串的最高索引?

我对此没有问题,逻辑工作正常。我想知道这是否是该rotate功能的工作方式。

4

3 回答 3

3

来自cppreference.com

此函数的前提条件是 [first, n_first) 和 [n_first, last) 是有效范围。

当您超出最高索引大小或低于最低索引大小时,这些不是有效范围。

于 2013-08-21T11:27:12.487 回答
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
于 2013-08-21T11:26:02.870 回答
1

第二个参数是middle,所以它应该位于开头和结尾之间。做一个<middle value> % (end() - begin())以确保这一点。

于 2013-08-21T11:26:44.313 回答