#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
typedef std::vector<int> ivec;
template <class T> bool flag_delete(pair<T,int> a) { return (a.second == 1); }
template <class T> void fun_delete_by_flag(vector<T> &vec_data, const ivec &vec_flag)
{
size_t n = vec_data.size();
vector< pair<T,int> > vec;
vec.reserve(n);
for ( size_t i = 0; i < n; i += 1 )
vec.push_back(std::make_pair(vec_data[i], vec_flag[i]));
auto it = remove_if(vec.begin(), vec.end(), flag_delete<T>);
vec.erase(it);
n = vec.size();
vec_data.resize(n);
for ( size_t i = 0; i < n; i += 1 )
vec_data[i] = vec[i].first;
return;
}
template <class T> void simpler(vector<T> &vec_data, const ivec &vec_flag)
{
T *begin = &vec_data.front();
size_t newsize = std::distance(begin,
std::remove_if(
begin, begin + vec_data.size(), [&] (T& el)
{
return 1 == vec_flag[std::distance(begin, &el)];
// or maybe: return vec_flag[&el-begin];
}));
vec_data.resize(newsize);
}
int main()
{
vector<std::string> data = { "hello", "world" };
vector<int> flags = { 0, 1 };
std::cout << "BEFORE: "; std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, ", ")); std::cout << "\n";
fun_delete_by_flag(data, flags);
// simpler(data, flags);
std::cout << "AFTER: "; std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, ", ")); std::cout << "\n";
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aXRlcmF0b3I+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBzdGQ6OnZlY3RvcjxpbnQ+IGl2ZWM7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBmbGFnX2RlbGV0ZShwYWlyPFQsaW50PiBhKSB7IHJldHVybiAoYS5zZWNvbmQgPT0gMSk7IH0KCnRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGZ1bl9kZWxldGVfYnlfZmxhZyh2ZWN0b3I8VD4gJnZlY19kYXRhLCBjb25zdCBpdmVjICZ2ZWNfZmxhZykKewoJc2l6ZV90IG4gPSB2ZWNfZGF0YS5zaXplKCk7Cgl2ZWN0b3I8IHBhaXI8VCxpbnQ+ID4gdmVjOwoJdmVjLnJlc2VydmUobik7Cglmb3IgKCBzaXplX3QgaSA9IDA7IGkgPCBuOyBpICs9IDEgKSAKCQl2ZWMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHZlY19kYXRhW2ldLCB2ZWNfZmxhZ1tpXSkpOwoKCWF1dG8gaXQgPSByZW1vdmVfaWYodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgZmxhZ19kZWxldGU8VD4pOwoJdmVjLmVyYXNlKGl0KTsKCgluID0gdmVjLnNpemUoKTsKCXZlY19kYXRhLnJlc2l6ZShuKTsKCglmb3IgKCBzaXplX3QgaSA9IDA7IGkgPCBuOyBpICs9IDEgKQoJCXZlY19kYXRhW2ldID0gdmVjW2ldLmZpcnN0OwoKCXJldHVybjsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgc2ltcGxlcih2ZWN0b3I8VD4gJnZlY19kYXRhLCBjb25zdCBpdmVjICZ2ZWNfZmxhZykKewoJVCAqYmVnaW4gPSAmdmVjX2RhdGEuZnJvbnQoKTsKCXNpemVfdCBuZXdzaXplID0gc3RkOjpkaXN0YW5jZShiZWdpbiwgCgkJCXN0ZDo6cmVtb3ZlX2lmKAoJCQkJYmVnaW4sIGJlZ2luICsgdmVjX2RhdGEuc2l6ZSgpLCBbJl0gKFQmIGVsKSAKCQkJCXsgCgkJCQkJcmV0dXJuIDEgPT0gdmVjX2ZsYWdbc3RkOjpkaXN0YW5jZShiZWdpbiwgJmVsKV07IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgbWF5YmU6IHJldHVybiB2ZWNfZmxhZ1smZWwtYmVnaW5dOwoJCQkJfSkpOwoKCXZlY19kYXRhLnJlc2l6ZShuZXdzaXplKTsKfQoKaW50IG1haW4oKQp7IAoJdmVjdG9yPHN0ZDo6c3RyaW5nPiBkYXRhID0geyAiaGVsbG8iLCAid29ybGQiIH07Cgl2ZWN0b3I8aW50PiBmbGFncyA9IHsgMCwgMSB9OwoKCXN0ZDo6Y291dCA8PCAiQkVGT1JFOiAiOyBzdGQ6OmNvcHkoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8c3RkOjpzdHJpbmc+KHN0ZDo6Y291dCwgIiwgIikpOyBzdGQ6OmNvdXQgPDwgIlxuIjsKCWZ1bl9kZWxldGVfYnlfZmxhZyhkYXRhLCBmbGFncyk7CgkvLyBzaW1wbGVyKGRhdGEsIGZsYWdzKTsKCXN0ZDo6Y291dCA8PCAiQUZURVI6ICAiOyBzdGQ6OmNvcHkoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8c3RkOjpzdHJpbmc+KHN0ZDo6Y291dCwgIiwgIikpOyBzdGQ6OmNvdXQgPDwgIlxuIjsKfQo=