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