关于输入
https://blog.csdn.net/weixin_30319097/article/details/96051791
关于erase的使用
erase会删除当前迭代器,后面的元素会向前移
例如erase(pos[3])删除后再erase(pos[3])会删除原来pos[4]的,可以使用erased[]数组标记,也可以让迭代器降序序排从后往前删就不会影响前面的。
没懂 list中erase删除之后如果再删除相同的会出bug但是被删除的迭代器还是能访问*迭代器,以至于在链表里删完之后遍历的结果没被删掉,但是for :就可以遍历出删除后的,
//看main就可
#include <bits/stdc++.h>
using namespace std;
typedef list<int>::iterator Iter;
const int maxN = 1e5 + 10;
Iter pos[maxN];
list<int> ql;
bool erased[maxN];
int N;
void init()
{
ql.push_back(1);
pos[1] = ql.begin();
int n;
cin >> n;
for (int i = 2; i <= n; i++)
{
int k, q;
scanf("%d%d", &k, &q);
if (q == 0)
{
pos[i] = ql.insert(pos[k], i);
}
else
{
auto Inext = next(pos[k]);
pos[i] = ql.insert(Inext, i);
}
}
int m;
cin >> m;
for (int i = 0; i < m; i++)
{
int k;
scanf("%d", &k);
if (!erased[k])
{
ql.erase(pos[k]);
erased[k] = 1;
}
}
}
int main()
{
init();
// auto ite = ql.end()--;
// auto it = ql.begin();
// while (it != ite)
// {
// printf("%d ", *it);
// it++;
// }
// printf("%d", *ite);
bool first = true;
for (int x : ql)
{
if (!first)
putchar(' ');
first = false;
printf("%d", x);
}
putchar('\n');
// cout << *pos[3]; erase后的迭代器还存在??
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
list<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
auto itb = vec.begin();
cout << *(itb++) << endl;
vec.erase(itb);
//这两种遍历法都可
for (int x : vec)
{
cout << x;
}
cout << endl;
for (auto it = vec.begin(); it != vec.end(); it = next(it))
{
cout << *it;
}
return 0;
}
有说是因为vector,内存连续分布,调用erase之后,后面的元素会向前移,导致后面的迭代器变化;✓
list,内存中不是连续分布,删除当前元素,只会当前迭代器失效,会后续没影响;
map,set这种关联容器,C98版本erase返回的是空,C11版本erase返回下一个元素迭代器,erase不会影响后面的迭代器;
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
auto itb = vec.begin();
cout << *(itb + 2);
vec.erase(itb + 2);
cout << *(itb + 2); //结果是3 4;
cout << *(itb + 3);// 5已经到尾
cout << *(itb + 4);//还是5
return 0;
}
https://blog.csdn.net/wo198711203217/article/details/102824450
https://www.cnblogs.com/yelongsan/p/4050404.html
关于迭代器
参考
C++定义的容器类型中,只有vector和queue容器提供迭代器算数运算和除!=和==之外的关系运算
list
https://blog.csdn.net/CV_Jason/article/details/83037127
Set
https://blog.csdn.net/changjiale110/article/details/79108447
记录学习时遇到的一些问题,欢迎一起交流,如果有错误还请大佬指正,感谢!