インデックスのセットの要素をリストから除去する
C++の場合
リストvがあって,そのリストから除去したいインデックスの集合remove_id_set(3,5,2)とかで指定する要素番号の要素を除去したい.eraseすると要素番号が一つずれるので,それも考慮して一旦集合をソートして,前から順に削除していくという方法.
#include <vector> #include <random> #include <algorithm> #include <iostream> std::random_device rnd; std::mt19937 mt(rnd()); std::vector<int> generateUniqueRandomIntegers(size_t max, int num_random_number) { std::vector<int> v(max); std::iota(v.begin(), v.end(), 0); std::shuffle(v.begin(), v.end(), mt); v.erase(v.begin()+num_random_number, v.end()); return v; } std::vector<int> eraseSetOfIndices(std::vector<int> &erase_set, std::vector<int> &v) { std::sort(erase_set.begin(), erase_set.end()); int i=0; for (auto index : erase_set) { auto it = v.begin(); v.erase(it+index-i); ++i; } return v; } int main() { std::vector<int> v(10); std::iota(v.begin(), v.end(), 0); // remove index std::vector<int> remove_id_set = generateUniqueRandomIntegers(9,3); for (auto d : remove_id_set) std::cout << d; std::cout << " are removed" <<std::endl; std::vector<int> ret = eraseSetOfIndices(remove_id_set, v); for (auto d : ret) std::cout << d; std::cout << std::endl; return 0; }