#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(); )
{
//cout << "checking " << *it << endl;
if ((*it) % 2)
{
cout << "erasing " << *it << endl;
it = li.erase(it);
}
else
{
cout << "keeping " << *it << endl;
++it;
}
}
}
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+JiBsaSkKewogICAgZm9yKGxpc3Q8aW50Pjo6aXRlcmF0b3IgaXQgPSBsaS5iZWdpbigpOyBpdCAhPSBsaS5lbmQoKTsgKQogICAgewoJCS8vY291dCA8PCAiY2hlY2tpbmcgIiA8PCAqaXQgPDwgZW5kbDsKICAgICAgICBpZiAoKCppdCkgJSAyKQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCAiZXJhc2luZyAiIDw8ICppdCA8PCBlbmRsOwogICAgICAgICAgICBpdCA9IGxpLmVyYXNlKGl0KTsKICAgICAgICB9IAogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgCWNvdXQgPDwgImtlZXBpbmcgIiA8PCAqaXQgPDwgZW5kbDsKICAgICAgICAJKytpdDsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgdGVzdCgpCnsKICAgIGludCBhWzldID0geyA1LCAyLCA4LCA5LCA2LCA3LCAzLCA0LCAxIH07CgogICAgbGlzdDxpbnQ+IHgoYSwgYSs5KTsgIC8vIGNvbnN0cnVjdCB4IGZyb20gdGhlIGFycmF5CiAgICBhc3NlcnQoeC5zaXplKCkgPT0gOSAmJiB4LmZyb250KCkgPT0gNSAmJiB4LmJhY2soKSA9PSAxKTsKCiAgICBjb3V0IDw8ICJiZWZvcmUgcmVtb3ZlOiBbICI7CiAgICBmb3IoaW50IHZhbCA6IHgpIHsKICAgIAljb3V0IDw8IHZhbCA8PCAnICc7CiAgICB9CiAgICBjb3V0IDw8ICddJyA8PCBlbmRsOwoKICAgIHJlbW92ZU9kZCh4KTsKICAgIGFzc2VydCh4LnNpemUoKSA9PSA0KTsKCiAgICBjb3V0IDw8ICJhZnRlciByZW1vdmU6IFsgIjsKICAgIGZvcihpbnQgdmFsIDogeCkgewogICAgCWNvdXQgPDwgdmFsIDw8ICcgJzsKICAgIH0KICAgIGNvdXQgPDwgJ10nIDw8IGVuZGw7CgogICAgdmVjdG9yPGludD4gdih4LmJlZ2luKCksIHguZW5kKCkpOyAgLy8gY29uc3RydWN0IHYgZnJvbSB4CiAgICBzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSk7CiAgICBjb3V0IDw8ICJhZnRlciBzb3J0OiBbICI7CiAgICBmb3IoaW50IHZhbCA6IHYpIHsKICAgIAljb3V0IDw8IHZhbCA8PCAnICc7CiAgICB9CiAgICBjb3V0IDw8ICddJyA8PCBlbmRsOwoKICAgIGludCBleHBlY3RbNF0gPSB7IDIsIDQsIDYsIDggfTsKICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKXsKICAgICAgICBhc3NlcnQodltrXSA9PSBleHBlY3Rba10pOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIHRlc3QoKTsKICAgIGNvdXQgPDwgIlBhc3NlZCIgPDwgZW5kbDsKfQ==