fork download
  1. #include <string>
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <iterator>
  6.  
  7. using namespace std;
  8.  
  9. typedef std::vector<int> ivec;
  10.  
  11. template <class T> bool flag_delete(pair<T,int> a) { return (a.second == 1); }
  12.  
  13. template <class T> void fun_delete_by_flag(vector<T> &vec_data, const ivec &vec_flag)
  14. {
  15. size_t n = vec_data.size();
  16. vector< pair<T,int> > vec;
  17. vec.reserve(n);
  18. for ( size_t i = 0; i < n; i += 1 )
  19. vec.push_back(std::make_pair(vec_data[i], vec_flag[i]));
  20.  
  21. auto it = remove_if(vec.begin(), vec.end(), flag_delete<T>);
  22. vec.erase(it);
  23.  
  24. n = vec.size();
  25. vec_data.resize(n);
  26.  
  27. for ( size_t i = 0; i < n; i += 1 )
  28. vec_data[i] = vec[i].first;
  29.  
  30. return;
  31. }
  32.  
  33. template <class T> void simpler(vector<T> &vec_data, const ivec &vec_flag)
  34. {
  35. T *begin = &vec_data.front();
  36. size_t newsize = std::distance(begin,
  37. std::remove_if(
  38. begin, begin + vec_data.size(), [&] (T& el)
  39. {
  40. return 1 == vec_flag[std::distance(begin, &el)];
  41. // or maybe: return vec_flag[&el-begin];
  42. }));
  43.  
  44. vec_data.resize(newsize);
  45. }
  46.  
  47. int main()
  48. {
  49. vector<std::string> data = { "hello", "world" };
  50. vector<int> flags = { 0, 1 };
  51.  
  52. std::cout << "BEFORE: "; std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, ", ")); std::cout << "\n";
  53. fun_delete_by_flag(data, flags);
  54. // simpler(data, flags);
  55. std::cout << "AFTER: "; std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, ", ")); std::cout << "\n";
  56. }
  57.  
Success #stdin #stdout 0s 2968KB
stdin
Standard input is empty
stdout
BEFORE: hello, world, 
AFTER:  hello,