読者です 読者をやめる 読者になる 読者になる

インデックスのセットの要素をリストから除去する

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;
}