ディレクトリ
トピックスアドレス
カジュアルワーキング
コードと解説
タイトルは、STLのリストは二重にリンクされたリストで、STLのリストを使用しています。これは、挿入および削除の操作は、多くの場合、数回あり、連続したメモリ空間、ポインタを介したデータへのアクセスである必要はなく、効率的にどこにでも挿入取り除きます。ベクターとは、それらが異なるアプリケーションシナリオを持って、逆の利点と欠点をリスト:
ベクター(1):以下の挿入および削除操作、頻繁なランダムアクセス要素
(2)リスト:頻繁な挿入及び欠失、少ないランダムアクセス。
リンクリストのリストを使用している場合、我々は、イテレータを使用する必要があります。たとえば、この問題のコードは、int型のリストは、私たちは、イテレータの方法を定義しますlist<int>::iterator it;
。これは、リストに対処する私たちを助けるために、それへのポインタに相当します。例えば、リンクリストの最初の要素のために、我々は、直接[0]表現するために使用することはできませんが、それは、それは始まりはここでのポイントです*使用する必要がありますit=a.begin();
。
もちろん、ヘッダファイルに注意を払うようにSTLのリストを使用している場合#include<list>
、以下のことは、この問題のためのC ++コードであります
#include<iostream>
#include<list>
using namespace std;
int main()
{
int N;
int x;
int i;
list<int> a;
list<int>::iterator it;
int k;
scanf("%d",&N);
while(N--){
scanf("%d",&x);
a.clear();
for(i=0;i<x;i++){
a.push_back(i+1);//存每个士兵的编号(索引加1)
}
k=2;//第一次删喊“2”的
while(a.size()>3){
i=0;
for(it=a.begin();it!=a.end();){
if((i+1)%k==0){//删除喊“k”的士兵
it=a.erase(it);//it指到下一位的地址
}
else{
it++;//it指到下一位的地址
}
i++;
}
if(k==2) k = 3;
else k = 2;
}
for(it=a.begin();it!=a.end();){
printf("%d",*it);
it++;
if(it!=a.end()) printf(" ");
else printf("\n");
}
}
return 0;
}