Skip to main content
replaced http://stackoverflow.com/ with https://stackoverflow.com/
Source Link
URL Rewriter Bot
URL Rewriter Bot

to avoid moving the same elements many times, we can move them by ranges between deleted indexes

// fill vMyIndexes, take care about duplicated values vMyIndexes.push_back(-1); // to handle range from 0 to the first index to remove vMyIndexes.push_back(vMyValues.size()); // to handle range from the last index to remove and to the end of values std::sort(vMyIndexes.begin(), vMyIndexes.end()); std::vector<int>::iterator last = vMyValues.begin(); for (size_t i = 1; i != vMyIndexes.size(); ++i) { size_t range_begin = vMyIndexes[i - 1] + 1; size_t range_end = vMyIndexes[i]; std::copy(vMyValues.begin() + range_begin, vMyValues.begin() + range_end, last); last += range_end - range_begin; } vMyValues.erase(last, vMyValues.end()); 

P.S. fixed a bug, thanks to Steve JessopSteve Jessop that patiently tried to show me it

to avoid moving the same elements many times, we can move them by ranges between deleted indexes

// fill vMyIndexes, take care about duplicated values vMyIndexes.push_back(-1); // to handle range from 0 to the first index to remove vMyIndexes.push_back(vMyValues.size()); // to handle range from the last index to remove and to the end of values std::sort(vMyIndexes.begin(), vMyIndexes.end()); std::vector<int>::iterator last = vMyValues.begin(); for (size_t i = 1; i != vMyIndexes.size(); ++i) { size_t range_begin = vMyIndexes[i - 1] + 1; size_t range_end = vMyIndexes[i]; std::copy(vMyValues.begin() + range_begin, vMyValues.begin() + range_end, last); last += range_end - range_begin; } vMyValues.erase(last, vMyValues.end()); 

P.S. fixed a bug, thanks to Steve Jessop that patiently tried to show me it

to avoid moving the same elements many times, we can move them by ranges between deleted indexes

// fill vMyIndexes, take care about duplicated values vMyIndexes.push_back(-1); // to handle range from 0 to the first index to remove vMyIndexes.push_back(vMyValues.size()); // to handle range from the last index to remove and to the end of values std::sort(vMyIndexes.begin(), vMyIndexes.end()); std::vector<int>::iterator last = vMyValues.begin(); for (size_t i = 1; i != vMyIndexes.size(); ++i) { size_t range_begin = vMyIndexes[i - 1] + 1; size_t range_end = vMyIndexes[i]; std::copy(vMyValues.begin() + range_begin, vMyValues.begin() + range_end, last); last += range_end - range_begin; } vMyValues.erase(last, vMyValues.end()); 

P.S. fixed a bug, thanks to Steve Jessop that patiently tried to show me it

added 306 characters in body
Source Link
Andriy Tylychko
  • 16.4k
  • 10
  • 70
  • 113

to avoid moving the same elements many times, we can move them by ranges between deleted indexes

// fill vMyIndexes, take care about duplicated values std::sort(vMyIndexes.beginpush_back(-1),; // to handle range from 0 to the first index to remove vMyIndexes.endpush_back(vMyValues.size()); // to handle range from the last index to remove and to the end of values std::sort(vMyIndexes.push_backbegin(vMyValues), vMyIndexes.sizeend()); std::vector<int>::iterator last = vMyValues.begin(); for (size_t i = 1; i != vMyIndexes.size(); ++i) { size_t range_begin = vMyIndexes[i - 1] + 1; size_t range_end = vMyIndexes[i]; std::copy(vMyValues.begin() + range_begin, vMyValues.begin() + range_end, last); last += range_end - range_begin; } vMyValues.erase(last, vMyValues.end()); 

P.S. fixed a bug, thanks to Steve Jessop that patiently tried to show me it

to avoid moving the same elements many times, we can move them by ranges between deleted indexes

// fill vMyIndexes, take care about duplicated values std::sort(vMyIndexes.begin(), vMyIndexes.end()); vMyIndexes.push_back(vMyValues.size()); std::vector<int>::iterator last = vMyValues.begin(); for (size_t i = 1; i != vMyIndexes.size(); ++i) { size_t range_begin = vMyIndexes[i - 1] + 1; size_t range_end = vMyIndexes[i]; std::copy(vMyValues.begin() + range_begin, vMyValues.begin() + range_end, last); last += range_end - range_begin; } vMyValues.erase(last, vMyValues.end()); 

to avoid moving the same elements many times, we can move them by ranges between deleted indexes

// fill vMyIndexes, take care about duplicated values vMyIndexes.push_back(-1); // to handle range from 0 to the first index to remove vMyIndexes.push_back(vMyValues.size()); // to handle range from the last index to remove and to the end of values std::sort(vMyIndexes.begin(), vMyIndexes.end()); std::vector<int>::iterator last = vMyValues.begin(); for (size_t i = 1; i != vMyIndexes.size(); ++i) { size_t range_begin = vMyIndexes[i - 1] + 1; size_t range_end = vMyIndexes[i]; std::copy(vMyValues.begin() + range_begin, vMyValues.begin() + range_end, last); last += range_end - range_begin; } vMyValues.erase(last, vMyValues.end()); 

P.S. fixed a bug, thanks to Steve Jessop that patiently tried to show me it

Source Link
Andriy Tylychko
  • 16.4k
  • 10
  • 70
  • 113

to avoid moving the same elements many times, we can move them by ranges between deleted indexes

// fill vMyIndexes, take care about duplicated values std::sort(vMyIndexes.begin(), vMyIndexes.end()); vMyIndexes.push_back(vMyValues.size()); std::vector<int>::iterator last = vMyValues.begin(); for (size_t i = 1; i != vMyIndexes.size(); ++i) { size_t range_begin = vMyIndexes[i - 1] + 1; size_t range_end = vMyIndexes[i]; std::copy(vMyValues.begin() + range_begin, vMyValues.begin() + range_end, last); last += range_end - range_begin; } vMyValues.erase(last, vMyValues.end());