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

2 番目のパラメーターはmiddleであるため、最初と最後の間に配置する必要があります。<middle value> % (end() - begin())それを確認するためにaを実行します。

于 2013-08-21T11:26:44.313 に答える
1

2番目の引数std::rotateは、文字列の先頭に配置したい要素を指すイテレータです。コンテナの末尾/先頭を通過した要素にイテレータを与えると、結果が得られることを理解するのはかなり簡単です。クラッシュで。

モジュラス演算子 を使用して、追加の結果が常にコンテナーの長さの中間で、1 未満になるよう%に制限することで、この問題を回避できます。shift0


#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 に答える