темы адрес
Повседневный рабочий
Код и объяснение
Название использует список STL, список STL является дважды связанный список. Это не должно быть непрерывным пространство памяти, доступ к данным через указатель, и эффективно удалить вставленное в любом месте, операции вставки и удаления часто в несколько раз. вектор и перечислить преимущества и недостатки , наоборот, они имеют различные сценарии применения:
вектор (1.): меньше вставки и удаление операция, часто элемент произвольного доступа
(2) список: частые вставки и удаление, менее произвольный доступ.
При использовании связанного списка списка, мы должны использовать итераторы. Например, код в этом вопросе, список типа Int, поэтому мы определяем итератор путь list<int>::iterator it;
. Это эквивалентно указатель на него, чтобы помочь нам справиться со списком. Например, для первого элемента в связанном списке, мы не можем напрямую использовать [0] , чтобы представить, но должны использовать это, это начало точки здесь, it=a.begin();
.
Конечно, при использовании списка STL обратить внимание на файл заголовка #include<list>
ниже это с ++ код для этого вопроса
#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;
}