1

配列内のインデックスにないインデックスを見つける方法は? たとえば。インデックス ベクトルが の場合(2, 8, 6, 9)。その後、結果は になります(1,3,4,5,7)。Rには(not) %in%これを行うための関数があります。素朴な方法は、フラグの配列を作成することです。ただし、フラグの作成と非インデックスに対する反復は、2 つの異なるループになります。単一のループでこれを行う方法はありますか?

4

3 に答える 3

1

これはうまくいくはずです:

int j = 0;
for(int i = 0;; ++i) {
  if(oldvec[j] == i) {
    j++;
    if(j >= oldvec.length())
      break;
  } else {
    newvec.push_back[i];
  }
}

新しい答え:

  std::set<int> result;
  int max = -1;
  for(unsigned int i=0; i<oldvec.size(); ++i)
  {
    int cur = oldvec[i];
    while(max < cur) {
      max++;
      result.insert(max);
    }
    result.erase(cur);
  }

どのようにそのことについて?:) 待ってください、結果は std::vector でなければなりませんか?

于 2013-10-23T15:22:26.287 に答える
0

並べ替えなし:

#include <iostream>
#include <vector>

struct NaturalNumber {
    unsigned value;
    bool valid;

    NaturalNumber(unsigned value = 0)
    :   value(value), valid(true)
    {}
};

typedef std::vector<NaturalNumber> NaturalNumbers;

NaturalNumbers natural_number_range(unsigned n) {
    NaturalNumbers result;
    result.resize(n);
    for(unsigned i = 0; i < n; ++i) result[i] = i;
    return result;
}

int main(int argc, char* argv[]) {
    NaturalNumbers n0 = { 2, 8, 6, 9 };
    NaturalNumbers n1 = natural_number_range(10);
    for(NaturalNumbers::const_iterator pos = n0.begin(); pos != n0.end(); ++pos) {
        n1[pos->value].valid = false;
    }
    for(NaturalNumbers::const_iterator pos = n1.begin(); pos != n1.end(); ++pos) {
        if(pos->valid)
            std::cout << pos->value << std::endl;
    }
    return 0;
}

無効なデータを格納することを犠牲にして、並べ替えをフラグに委任するだけです。シングルループもありません!

于 2013-10-23T16:35:11.133 に答える