C++テンプレートライブラリでstd::list(双方向チェーンテーブル)兼ジョセフリング問題


毒鶏スープ:My moto is:Contented with little,yet wishing for more.私の座右の銘は:少し満足していますが、もっと多くのことを望んでいます.
建国記念日に見る《剣の指offer》を始めて、最後のいくつの題がまだあります
========================================================================================
ジョセフ問題は有名な問題です.N人が囲まれていて、最初から数え始め、M番目は殺され、最後に残り、残りは殺されます.例えばN=6,M=5,殺される順番は5,4,6,2,3,1である.
サークルなので、その中からデータを削除するので、まず思いついたのはループチェーンで解決することです.最近は学校C++なので、テンプレートライブラリの双方向チェーンで直接使いました.
int LastRemaining_Solution1(unsigned int n, unsigned int m)
{
    if(n < 1 || m < 1)
        return -1;

    unsigned int i = 0;

    list numbers;
    for(i = 0; i < n; ++ i)
        numbers.push_back(i);

    list::iterator current = numbers.begin();
    while(numbers.size() > 1)
    {
        for(int i = 1; i < m; ++ i)
        {
            current ++;
            if(current == numbers.end())
                current = numbers.begin();
        }

        list::iterator next = ++ current;
        if(next == numbers.end())
            next = numbers.begin();

        -- current;
        numbers.erase(current);
        current = next;
    }

    return *(current);
}
C++に詳しくないので、このコードを見たとき、疑問に思ったのですが、次はなぜですか.
if(current == numbers.end())
                current = numbers.begin();
if(next == numbers.end())
            next = numbers.begin();
を探してみたらbeginがチェーンテーブルの最初の要素を指していることがわかりましたが、endはチェーンテーブルの最後の要素ではなく、最後の要素の後を指しているので、上のコードがあります.そうすれば、ループチェーンテーブルを構成することができます.次はlistのメンバー関数の役割です.一緒に勉強しましょう(ジョセフ問題については、剣指offerの中にもっと効率的な方法が提案されています.興味のある人は探してみてください.削除された数字の法則を探して、説明するのが面倒です.)
Listsは要素をチェーンテーブルに順次格納.ベクトル(vectors)に比べて、迅速な挿入と削除を可能にするが、ランダムアクセスは遅い.

STL  end()        ,       ,        。

assign()  list   

back()          

begin()               

clear()        

empty()   list      true 

end()          (              )

erase()        

front()         

get_allocator()   list     

insert()        list  

max_size()   list           

merge()     list 

pop_back()          

pop_front()         

push_back()  list          

push_front()  list          

rbegin()                 

remove()  list     

remove_if()           

rend()   list         

resize()   list    

reverse()  list      

size()   list       

sort()  list   

splice()     list 

swap()     list 

unique()   list