#include <list>
#include <vector>
#include <algorithm>
#include <iostream>
#include <stdexcept>
using namespace std;
void assert(bool result)
{
if (!result)
throw std::runtime_error("assert failed");
}
void removeOdd(list<int>& li)
{
for(list<int>::iterator it = li.begin(); it != li.end(); it++)
{
//cout << "checking " << *it << endl;
if ((*it) % 2)
{
cout << "erasing " << *it << endl;
it = li.erase(it);
cout << "skipping " << *it << endl;
}
else
{
cout << "keeping " << *it << endl;
}
}
}
void test()
{
int a[9] = { 5, 2, 8, 9, 6, 7, 3, 4, 1 };
list<int> x(a, a+9); // construct x from the array
assert(x.size() == 9 && x.front() == 5 && x.back() == 1);
cout << "before remove: [ ";
for(int val : x) {
cout << val << ' ';
}
cout << ']' << endl;
removeOdd(x);
assert(x.size() == 4);
cout << "after remove: [ ";
for(int val : x) {
cout << val << ' ';
}
cout << ']' << endl;
vector<int> v(x.begin(), x.end()); // construct v from x
sort(v.begin(), v.end());
cout << "after sort: [ ";
for(int val : v) {
cout << val << ' ';
}
cout << ']' << endl;
int expect[4] = { 2, 4, 6, 8 };
for (int k = 0; k < 4; k++){
assert(v[k] == expect[k]);
}
}
int main()
{
test();
cout << "Passed" << endl;
}
I2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgYXNzZXJ0KGJvb2wgcmVzdWx0KQp7CglpZiAoIXJlc3VsdCkKCQl0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImFzc2VydCBmYWlsZWQiKTsKfQoKdm9pZCByZW1vdmVPZGQobGlzdDxpbnQ+JiBsaSkKewogICAgZm9yKGxpc3Q8aW50Pjo6aXRlcmF0b3IgaXQgPSBsaS5iZWdpbigpOyBpdCAhPSBsaS5lbmQoKTsgaXQrKykKICAgIHsKCQkvL2NvdXQgPDwgImNoZWNraW5nICIgPDwgKml0IDw8IGVuZGw7CiAgICAgICAgaWYgKCgqaXQpICUgMikKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgImVyYXNpbmcgIiA8PCAqaXQgPDwgZW5kbDsKICAgICAgICAgICAgaXQgPSBsaS5lcmFzZShpdCk7CiAgICAgICAgICAgIGNvdXQgPDwgInNraXBwaW5nICIgPDwgKml0IDw8IGVuZGw7CiAgICAgICAgfSAKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgIAljb3V0IDw8ICJrZWVwaW5nICIgPDwgKml0IDw8IGVuZGw7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHRlc3QoKQp7CiAgICBpbnQgYVs5XSA9IHsgNSwgMiwgOCwgOSwgNiwgNywgMywgNCwgMSB9OwoKICAgIGxpc3Q8aW50PiB4KGEsIGErOSk7ICAvLyBjb25zdHJ1Y3QgeCBmcm9tIHRoZSBhcnJheQogICAgYXNzZXJ0KHguc2l6ZSgpID09IDkgJiYgeC5mcm9udCgpID09IDUgJiYgeC5iYWNrKCkgPT0gMSk7CgogICAgY291dCA8PCAiYmVmb3JlIHJlbW92ZTogWyAiOwogICAgZm9yKGludCB2YWwgOiB4KSB7CiAgICAJY291dCA8PCB2YWwgPDwgJyAnOwogICAgfQogICAgY291dCA8PCAnXScgPDwgZW5kbDsKCiAgICByZW1vdmVPZGQoeCk7CiAgICBhc3NlcnQoeC5zaXplKCkgPT0gNCk7CgogICAgY291dCA8PCAiYWZ0ZXIgcmVtb3ZlOiBbICI7CiAgICBmb3IoaW50IHZhbCA6IHgpIHsKICAgIAljb3V0IDw8IHZhbCA8PCAnICc7CiAgICB9CiAgICBjb3V0IDw8ICddJyA8PCBlbmRsOwoKICAgIHZlY3RvcjxpbnQ+IHYoeC5iZWdpbigpLCB4LmVuZCgpKTsgIC8vIGNvbnN0cnVjdCB2IGZyb20geAogICAgc29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOwogICAgY291dCA8PCAiYWZ0ZXIgc29ydDogWyAiOwogICAgZm9yKGludCB2YWwgOiB2KSB7CiAgICAJY291dCA8PCB2YWwgPDwgJyAnOwogICAgfQogICAgY291dCA8PCAnXScgPDwgZW5kbDsKCiAgICBpbnQgZXhwZWN0WzRdID0geyAyLCA0LCA2LCA4IH07CiAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKyl7CiAgICAgICAgYXNzZXJ0KHZba10gPT0gZXhwZWN0W2tdKTsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICB0ZXN0KCk7CiAgICBjb3V0IDw8ICJQYXNzZWQiIDw8IGVuZGw7Cn0=